Python tkinter after方法未按预期工作
我正在尝试学习Tkinter模块,但我无法理解为什么after方法的行为不符合预期。据我所知,它应该等待毫秒,然后执行该函数,但在我的情况下,该函数会执行更多的时间,而不考虑我的写入时间。代码如下:Python tkinter after方法未按预期工作,python,user-interface,tkinter,Python,User Interface,Tkinter,我正在尝试学习Tkinter模块,但我无法理解为什么after方法的行为不符合预期。据我所知,它应该等待毫秒,然后执行该函数,但在我的情况下,该函数会执行更多的时间,而不考虑我的写入时间。代码如下: from tkinter import * def doSomething(): x = int(l["text"]) l["text"] = str(x + 1) root = Tk() root.geometry("300x3
from tkinter import *
def doSomething():
x = int(l["text"])
l["text"] = str(x + 1)
root = Tk()
root.geometry("300x300")
l = Label(root, text="0")
l.pack()
while True:
l.after(1000, doSomething)
root.update()
if int(l["text"]) >= 5:
break
root.mainloop()
前2秒后,标签开始显示大量数字
前2秒后,标签开始显示大量数字
请记住,虽然True
是一个无限循环,但您对根目录进行无限调用。after()
意味着许多事件被安排在1秒后调用。更好的方法是在时删除,并将其全部移动到函数中
from tkinter import *
root = Tk()
def doSomething():
x = int(l["text"])
l["text"] = x + 1
if int(l["text"]) < 5: # Only repeat this function as long as this condition is met
l.after(1000, doSomething)
root.geometry("300x300")
l = Label(root, text="0")
l.pack()
doSomething()
root.mainloop()
从tkinter导入*
root=Tk()
def doSomething():
x=int(l[“文本”])
l[“文本”]=x+1
如果int(l[“text”])<5:#仅在满足此条件的情况下重复此功能
l、 之后(1000,剂量)
根几何(“300x300”)
l=标签(根,text=“0”)
l、 包()
doSomething()
root.mainloop()
尽管编写函数的最佳方法是创建一个变量,并在函数中增加该变量的值,然后将其显示出来:
from tkinter import *
root = Tk()
count = 0 # Initial value
def doSomething():
global count # Also can avoid global by using parameters
count += 1 # Increase it by 1
l['text'] = count # Change text
if count < 5:
l.after(1000, doSomething)
root.geometry("300x300")
l = Label(root, text=count)
l.pack()
doSomething() # If you want a delay to call the function initially, then root.after(1000,doSomething)
root.mainloop()
从tkinter导入*
root=Tk()
计数=0#初始值
def doSomething():
全局计数#还可以通过使用参数避免全局计数
计数+=1#增加1
l['text']=计数#更改文本
如果计数小于5:
l、 之后(1000,剂量)
根几何(“300x300”)
l=标签(根,文本=计数)
l、 包()
doSomething()#如果您希望在最初调用函数时有延迟,则在root.after(1000,doSomething)
root.mainloop()
通过这种方式,您还可以降低代码的复杂性,有效地利用变量,避免令人讨厌的类型转换;)
前2秒后,标签开始显示大量数字
请记住,虽然True
是一个无限循环,但您对根目录进行无限调用。after()
意味着许多事件被安排在1秒后调用。更好的方法是在
时删除,并将其全部移动到函数中
from tkinter import *
root = Tk()
def doSomething():
x = int(l["text"])
l["text"] = x + 1
if int(l["text"]) < 5: # Only repeat this function as long as this condition is met
l.after(1000, doSomething)
root.geometry("300x300")
l = Label(root, text="0")
l.pack()
doSomething()
root.mainloop()
从tkinter导入*
root=Tk()
def doSomething():
x=int(l[“文本”])
l[“文本”]=x+1
如果int(l[“text”])<5:#仅在满足此条件的情况下重复此功能
l、 之后(1000,剂量)
根几何(“300x300”)
l=标签(根,text=“0”)
l、 包()
doSomething()
root.mainloop()
尽管编写函数的最佳方法是创建一个变量,并在函数中增加该变量的值,然后将其显示出来:
from tkinter import *
root = Tk()
count = 0 # Initial value
def doSomething():
global count # Also can avoid global by using parameters
count += 1 # Increase it by 1
l['text'] = count # Change text
if count < 5:
l.after(1000, doSomething)
root.geometry("300x300")
l = Label(root, text=count)
l.pack()
doSomething() # If you want a delay to call the function initially, then root.after(1000,doSomething)
root.mainloop()
从tkinter导入*
root=Tk()
计数=0#初始值
def doSomething():
全局计数#还可以通过使用参数避免全局计数
计数+=1#增加1
l['text']=计数#更改文本
如果计数小于5:
l、 之后(1000,剂量)
根几何(“300x300”)
l=标签(根,文本=计数)
l、 包()
doSomething()#如果您希望在最初调用函数时有延迟,则在root.after(1000,doSomething)
root.mainloop()
通过这种方式,您还可以降低代码的复杂性,有效地利用变量,避免令人讨厌的类型转换;) 使用while True时使用的是无限循环。正确的方法是:
from tkinter import *
def doSomething():
x = int(l["text"])
l["text"] = str(x + 1)
if x < 5:
l.after(1000, doSomething)
root = Tk()
root.geometry("300x300")
l = Label(root, text="0")
l.pack()
doSomething()
root.mainloop()
从tkinter导入*
def doSomething():
x=int(l[“文本”])
l[“文本”]=str(x+1)
如果x<5:
l、 之后(1000,剂量)
root=Tk()
根几何(“300x300”)
l=标签(根,text=“0”)
l、 包()
doSomething()
root.mainloop()
当使用while True时,您正在使用无限循环。正确的方法是:
from tkinter import *
def doSomething():
x = int(l["text"])
l["text"] = str(x + 1)
if x < 5:
l.after(1000, doSomething)
root = Tk()
root.geometry("300x300")
l = Label(root, text="0")
l.pack()
doSomething()
root.mainloop()
从tkinter导入*
def doSomething():
x=int(l[“文本”])
l[“文本”]=str(x+1)
如果x<5:
l、 之后(1000,剂量)
root=Tk()
根几何(“300x300”)
l=标签(根,text=“0”)
l、 包()
doSomething()
root.mainloop()
while True
的目的是什么,相反,您可以将if
和root.after()移动到函数中。while True
的目的是什么,相反,您可以将if
和root.after()移动到函数中。非常感谢!所以我想最好的方法是在函数内部调用after,这样只要满足某个条件就可以执行它,对吗?因为我不明白为什么在这种情况下使用while-True循环是个坏主意。我知道我正在进行无限次的调用,但是为什么该方法不能像after(1000,doSomething)中所述那样每秒执行一次调用呢?@FraSassone而不会等待1秒执行doSomething
。只要涉及到时,root.after()
只是一行不会停止它的代码。当处于中间时暂停的一种方法是使用time.sleep()
,但它也有它的缺点,最好使用after()
并不惜一切代价避免处于中间时。@FraSassone~如果这能正确回答您的问题,请将其标记为正确答案。点击了解如何:DOh,对不起!我是新来的,谢谢你的澄清,非常感谢!所以我想最好的方法是在函数内部调用after,这样只要满足某个条件就可以执行它,对吗?因为我不明白为什么在这种情况下使用while-True循环是个坏主意。我知道我正在进行无限次的调用,但是为什么该方法不能像after(1000,doSomething)中所述那样每秒执行一次调用呢?@FraSassone而不会等待1秒执行doSomething
。只要涉及到时,root.after()
只是一行不会停止它的代码。当处于中间时暂停的一种方法是使用time.sleep()
,但它也有它的缺点,最好使用after()
和