【问题标题】:Tkinter StringVar() only accepts the most recent inputTkinter StringVar() 只接受最近的输入
【发布时间】:2015-01-28 20:00:18
【问题描述】:

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

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 编程的新手。如果有人能帮我解决这个问题,我将不胜感激。

谢谢(=

【问题讨论】:

    标签: python user-interface tkinter label


    【解决方案1】:

    在您调用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()
    

    【讨论】:

    • 太棒了!非常感谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多