Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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 after方法未按预期工作_Python_User Interface_Tkinter - Fatal编程技术网

Python 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

我正在尝试学习Tkinter模块,但我无法理解为什么after方法的行为不符合预期。据我所知,它应该等待毫秒,然后执行该函数,但在我的情况下,该函数会执行更多的时间,而不考虑我的写入时间。代码如下:

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()