我对Python还是很陌生,已经开始构建一个显示新闻信息的GUI。我创建了五个函数,这些函数在调用时会在窗口中显示相关信息。下面是这些函数本身的摘要:
# first function which creates new labels and fills them with the relevant site pic,
# first article title, and description.
def fn1():
label_maker(infoFrame, 0, 0, 630, 389, image=newImage1,
background='red')
label_maker(infoFrame, 630, 0, 655, 389, text=entry1.title,
background='blue', font=("", 20), wraplength=600)
label_maker(infoFrame, 0, 389, 1286, 389, text=entry1.description,
wraplength=1250, font=("", 16),
background='green')
# second function to create labels and fill them with relevant info
def fn2():
label_maker(infoFrame, 0, 0, 630, 389, image=newImage2,
background='red')
label_maker(infoFrame, 630, 0, 655, 389, text=entry2.title,
background='blue', font=("", 20), wraplength=600)
label_maker(infoFrame, 0, 389, 1286, 389, text=entry2.description,
wraplength=1250, font=("", 16),
background='green')
# third
def fn3():
label_maker(infoFrame, 0, 0, 630, 389, image=newImage3,
background='red')
label_maker(infoFrame, 630, 0, 655, 389, text=entry3.title,
background='blue', font=("", 20), wraplength=600)
label_maker(infoFrame, 0, 389, 1286, 389, text=entry3.description,
wraplength=1250, font=("", 16),
background='green')
# fourth
def fn4():
label_maker(infoFrame, 0, 0, 630, 389, image=newImage4,
background='red')
label_maker(infoFrame, 630, 0, 655, 389, text=entry4.title,
background='blue', font=("", 20), wraplength=600)
label_maker(infoFrame, 0, 389, 1286, 389, text=entry4.description,
wraplength=1250, font=("", 16),
background='green')
# fifth
def fn5():
label_maker(infoFrame, 0, 0, 630, 389, image=newImage5,
background='red')
label_maker(infoFrame, 630, 0, 655, 389, text=entry5.title,
background='blue', font=("", 20), wraplength=600)
label_maker(infoFrame, 0, 389, 1286, 389, text=entry5.description,
wraplength=1250, font=("", 16),
background='green')
另外,这里是label_maker函数,用于说明:
# define a new label maker function to construct labels within frames that
will
# be placed within infoFrame
def label_maker(master, x, y, w, h, *args, **kwargs):
frame = Frame(master, width=w, height=h)
frame.pack_propagate(0)
frame.place(x=x, y=y)
label = Label(frame, *args, **kwargs).pack(fill=BOTH, expand=1)
return label
我想轮流运行这些功能,其中一个功能运行约15秒,然后运行下一个,然后运行下一个,依此类推,直到关闭窗口。我尝试使用after()
方法,但是以我使用它的方式,这些函数在调用最后一个函数之前一直不显示任何内容。我如何才能一遍又一遍地循环这些,并实际上让它们显示相关信息?
答案 0 :(得分:0)
我不是100%确定您的entry1
和其他输入值来自何处。所以我只是建立一些字典以供使用。
我认为您面临的问题之一是将小部件堆叠在最后一组顶部,而您可以轻松地一次构建它们然后更新它们。
我已经将您的代码重新设计为可以正常工作的功能,并且对您的label_maker进行了一些更改。请注意,您的place()
语句在这里引起很大的视觉问题。
place()
不会影响框架的大小,因此当您仅对框架中的窗口小部件使用place()
时,框架将始终为零大小。它只是不起作用。您需要以某种方式控制帧的大小。
话虽如此,我只是通过更新标签简化了问题。
如果您有任何疑问,请告诉我。
我在一端使用了3种不同颜色的正方形,因此至少可以使您的代码正常工作。只需切换不同的图像路径即可。
下面的代码将每15秒更改一次标签,直到最后关闭。
import tkinter as tk
def manage_time():
global tracker
if tracker == 1:
lbl1.config(image=newImage2)
lbl2.config(text=entry2['title'])
lbl3.config(text=entry2['description'])
tracker = 2
root.after(15000, manage_time)
elif tracker == 2:
lbl1.config(image=newImage3)
lbl2.config(text=entry3['title'])
lbl3.config(text=entry3['description'])
tracker = 3
root.after(15000, manage_time)
else:
root.destroy()
def label_maker(master, x, y, w, h, *args, **kwargs):
label = tk.Label(master, *args, **kwargs)
label.pack(fill="both", expand=1)
return label
root = tk.Tk()
tracker = 1
infoFrame = tk.Frame(root, width=500, height=500)
infoFrame.pack()
""" All the code for your images and entry fields"""
entry1 = {"title":"entry1", "description":"description for entry 1"}
entry2 = {"title":"entry2", "description":"description for entry 2"}
entry3 = {"title":"entry3", "description":"description for entry 3"}
newImage1 = tk.PhotoImage(file="./RGB/blue.gif")
newImage2 = tk.PhotoImage(file="./RGB/red.gif")
newImage3 = tk.PhotoImage(file="./RGB/green.gif")
lbl1 = label_maker(infoFrame, 0, 0, 630, 389, image=newImage1, background='red')
lbl2 = label_maker(infoFrame, 630, 0, 655, 389, text=entry1['title'], background='blue',)
lbl3 = label_maker(infoFrame, 0, 389, 1286, 389, text=entry1['description'], background='green')
root.after(15000, manage_time)
root.mainloop()