在tkin中使用延时和列表

2024-04-26 05:34:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我的代码的问题是我想在延迟期间更新我的列表,并使标签以不同的值出现两次。我想让b先出现,然后d再出现。但现在似乎只显示了d。 我有什么办法可以绕过它吗? 非常感谢任何帮助!在

import Tkinter as tk

a_list=["a","b","c"]
root=tk.Tk()
variableone=tk.StringVar()
label1=tk.Label(root,text="appear later")
label1.pack()
label=tk.Label(root, textvariable=variableone)
label.after(2000, lambda:variableone.set(a_list[1]))
label.pack()

a_list[1]="d"
label.after(5000, lambda:variableone.set(a_list[1]))

root.mainloop()

Tags: lambda代码列表root标签labelpacktk
1条回答
网友
1楼 · 发布于 2024-04-26 05:34:53

您的问题是由于您的lambda在调用它们时使用了a_list[1]当前值,而不是创建lambda时的值。您可以通过给它们一个默认参数来解决这个问题,因为它只在创建时计算。在

当使用lambdas作为回调函数时,这是一个常见的问题。请参见Python Tkinter, setting up button callback functions with a loop,了解使用lambdas在循环中设置一系列按钮小部件的类似问题。在

这个代码可以满足你的需要。它使用s作为默认参数来保存a_list[1]的值。在

import Tkinter as tk

a_list=["a","b","c"]
root=tk.Tk()
variableone=tk.StringVar()
label1=tk.Label(root,text="appear later")
label1.pack()
label=tk.Label(root, textvariable=variableone)
label.after(2000, lambda s=a_list[1]:variableone.set(s))
label.pack()

a_list[1]="d"
label.after(5000, lambda s=a_list[1]:variableone.set(s))

root.mainloop()

相关问题 更多 >