Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-Tkinter中只显示对标签的最后一次修改。为什么?_Python_Python 3.x_User Interface_Tkinter - Fatal编程技术网

Python-Tkinter中只显示对标签的最后一次修改。为什么?

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_

我正在学习使用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_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方法的函数后面提供参数。