我试图制作一个小型应用程序,逐个显示列表中的单词。以下是我的代码:
from Tkinter import *
master = Tk()
master.title('Serial Position Effect')
myArray = ['book','chair','door']
def cycle(myArray, k):
t.set(myArray[k])
t = StringVar()
w = Label(master, height=3, width=15, font=('Helvetica', 118), textvariable = t)
for n in range(0,3):
cycle(myArray, n)
w.pack()
master.mainloop()
我期待这个标签显示书,椅子和门,但它只显示窗户上的门。我尝试修改for循环,如:
for n in range(0,3):
for x in range(0,10000):
cycle(myArray, n)
因为我认为问题在于程序在单词中循环过快。但是,通过这个修改过的代码,应用程序再次仅在短暂延迟后才显示出来。 (延迟可能是因为它数到10000。)
最后我对此略有不同 - 效率稍低但我想通过这样编码我可以在原始代码中识别问题:
from Tkinter import *
master = Tk()
master.title('Serial Position Effect')
#myArray = ['book','chair','door']
#def cycle(myArray, k):
# t.set(myArray[k])
t = StringVar()
w = Label(master, height=3, width=15, font=('Helvetica', 118), textvariable = t)
for n in range(0,10000)
t.set('book')
for n in range(0,10000)
t.set('chair')
for n in range(0,10000)
t.set('door')
w.pack()
master.mainloop()
同样,窗口只显示了门。
我是Python和Tkinter的GUI编程新手。如果有人可以帮我解决这个问题,我将非常感激。
谢谢(=
答案 0 :(得分:3)
在您拨打mainloop
之前,该窗口甚至不会显示,因此拨打set
数千次将不会产生任何明显的效果,除了最后一次通话。您应该使用after
来注册回调函数,以便在将来的几秒内更改标签。
from Tkinter import *
master = Tk()
master.title('Serial Position Effect')
myArray = ['book','chair','door']
def cycle(myArray, k):
t.set(myArray[k])
t = StringVar()
w = Label(master, height=3, width=15, font=('Helvetica', 118), textvariable = t)
w.pack()
cycle(myArray,0)
master.after(1000, lambda: cycle(myArray, 1))
master.after(2000, lambda: cycle(myArray, 2))
master.mainloop()
如果您希望单词永远循环,您也可以使用经过注册后的函数调用after
。
from Tkinter import *
master = Tk()
master.title('Serial Position Effect')
myArray = ['book','chair','door']
cur_idx = -1
def cycle():
global cur_idx
cur_idx = (cur_idx + 1) % len(myArray)
t.set(myArray[cur_idx])
master.after(1000, cycle)
t = StringVar()
w = Label(master, height=3, width=15, font=('Helvetica', 118), textvariable = t)
w.pack()
cycle()
master.mainloop()