Tkinter StringVar()只接受最新的输入

时间:2015-01-28 20:00:18

标签: python user-interface tkinter label

我试图制作一个小型应用程序,逐个显示列表中的单词。以下是我的代码:

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编程新手。如果有人可以帮我解决这个问题,我将非常感激。

谢谢(=

1 个答案:

答案 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()