我正在尝试运行一个脚本,该脚本使用root.after()生成两个线程。sleep()似乎锁定了脚本。它永远不会看到由第二个root.after()设置的标志。
from time import sleep
from tkinter import *
global Flag
Flag = False
def setTimer():
global Flag
while(Flag==False):
sleep(.1)
print('Flag set')
return
def setFlag():
global Flag
Flag=True
return
root=Tk()
print('Start')
root.after(1,setTimer())
root.after(100,setFlag())
print('Done')发布于 2015-08-31 01:28:42
after不会启动新线程,它会在Tk的事件循环中运行一个方法。因此,您的while循环总是会阻塞程序。
如果使用after,则该方法只能执行非阻塞操作,如检查标志。如果你有后台进程,使用真正的线程。但请注意:您不能在这些线程中更改GUI!
import tkinter as tk
from time import sleep
from threading import Thread, Event
flag = Event()
def worker():
while not flag.is_set():
sleep(.1)
print('Flag set')
def set_flag():
flag.set()
root = tk.Tk()
print('Start')
Thread(target=worker).start()
root.after(100, set_flag)
print('Done')
root.mainloop()发布于 2015-08-31 02:12:02
从您的示例中并不清楚您实际上是需要一个OS线程,还是仅仅需要一个异步事件驱动的任务。丹尼尔回答了前者,所以我也回答了后者。关键是让任务“休眠”,调用root.after而不是time.sleep。(请注意,只有在重新绑定name的函数中才需要并且应该使用global name。)
from tkinter import *
flag = False
def setTimer():
if flag:
print('Flag set')
else:
print('Flag not set')
root.after(100, setTimer)
def setFlag():
global flag
print('Setting flag')
flag=True
root=Tk()
print('Start')
root.after(1,setTimer)
root.after(300,setFlag)
root.mainloop()这将打印“Flag not set”三次,分别为1、101和201毫秒,但在301毫秒时,打印“Flag set”。(时间不是精确的,但顺序应该是准确的。)
Start
Flag not set
Flag not set
Flag not set
Setting flag
Flag setrepeated after的技巧是如何在tkinter中为任何东西设置动画,例如在屏幕上移动小工具,或者定期更改颜色。
https://stackoverflow.com/questions/32299222
复制相似问题