Python-Tkinter中只显示对标签的最后一次修改。为什么?
我正在学习使用Tkinter进行GUI开发。我想在标签上显示多条存储在字符串中的消息。我使用sleep来查看更改。但是在执行时只显示最后一个消息字符串Python-Tkinter中只显示对标签的最后一次修改。为什么?,python,python-3.x,user-interface,tkinter,Python,Python 3.x,User Interface,Tkinter,我正在学习使用Tkinter进行GUI开发。我想在标签上显示多条存储在字符串中的消息。我使用sleep来查看更改。但是在执行时只显示最后一个消息字符串 from tkinter import * import time master = Tk() def onClick(): for i in range(0,len(list_of_str)): w.configure(text=list_of_str[i]) time.sleep(5) list_
from tkinter import *
import time
master = Tk()
def onClick():
for i in range(0,len(list_of_str)):
w.configure(text=list_of_str[i])
time.sleep(5)
list_of_str = ['first','second','third','fourth','fifth']
w = Label(master, text="Hello, world!")
b = Button(master,text='Click me',command = onClick)
w.pack()
b.pack()
mainloop()
我是个傻瓜。谢谢你的帮助 我想你想要这个:
from tkinter import *
import time
master = Tk()
global i
i = 0
def onClick():
master.after(1, change)
def change():
global i
if i == len(list_of_str):
pass
else:
w.configure(text=list_of_str[i])
i += 1
master.after(1000, onClick)
list_of_str = ['first','second','third','fourth','fifth']
w = Label(master, text="Hello, world!")
b = Button(master,text='Click me',command = onClick)
w.pack()
b.pack()
mainloop()
时间,睡眠是一个禁忌。我建议您在类中创建gui,这样会更容易
类的示例:
import tkinter as tk
from tkinter import *
class GUI:
def __init__(self, master):
self.list_of_str = ['first','second','third','fourth','fifth']
self.count = 0
self.master = master
self.w = Label(master, text="Hello, world!")
self.w.pack()
self.b = Button(master,text='Click me',command = self.onClick)
self.b.pack()
def onClick(self, event=None):
if self.count == len(self.list_of_str):
pass
else:
self.w.configure(text=self.list_of_str[self.count])
self.count += 1
self.master.after(1000, self.onClick)
def main():
root = tk.Tk()
app = GUI(root)
root.mainloop()
if __name__ == '__main__':
main()
解决问题的一个简单方法是结合使用try/except方法和使用
after()
在tkinter中,sleep()
将暂停应用程序,而不是提供计时器。对于tkinter,您希望使用after()
方法将事件安排在设定的时间量之后。after()
方法就是针对这个问题的,并且是tkinter中用于延迟事件的方法
在下面的示例中,我修改了onClick
函数,以获取1个参数,并在after()
方法中使用该参数在5秒后选择列表中的下一项。请注意,对于after()
方法,时间以毫秒为单位,因此5000
为5秒
from tkinter import *
master = Tk()
def onClick(ndex):
try:
w.configure(text=list_of_str[ndex])
master.after(5000, onClick, ndex+1)
except:
print("End of list")
list_of_str = ['first','second','third','fourth','fifth']
w = Label(master, text="Hello, world!")
b = Button(master,text='Click me',command = lambda: onClick(0))
w.pack()
b.pack()
mainloop()
tkinter
不适合睡眠
。在之后搜索并使用方法。可能重复“是”。这解决了我的问题。谢谢sleep()
方法在tkinter实例中不值得使用。它最终会暂停整个tkinter实例,而不是提供计时器。您需要使用after()
方法,因为它专门用于在tkinter中提供代码的定时执行。我同意在类中编写代码是一种很好的做法,但请提供一些有关您对其代码所做更改的详细信息,以及您认为这些更改是一个好主意的原因。纯代码的答案对理解为什么您的代码“更好”或是一个好的选择没有多大帮助。这只是我编的一个示例问题。我需要理解为什么时间,睡眠不起作用。Thanks@Mike我在课堂上用示例代码更新了答案。干杯谢谢@Mike。这让事情变得简单多了。我想如果你能添加一些细节,比如你的更改是什么以及为什么要做这些更改,这将是一个很好的答案,我可以对此进行投票。你不需要在之后使用lambda
。这将起作用:master.after(5000,onCLick,ndex+1)
@BryanOakley:谢谢,我忘了你可以在after方法的函数后面提供参数。