首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sleep()停止线程

Sleep()停止线程
EN

Stack Overflow用户
提问于 2015-08-31 01:18:14
回答 2查看 142关注 0票数 0

我正在尝试运行一个脚本,该脚本使用root.after()生成两个线程。sleep()似乎锁定了脚本。它永远不会看到由第二个root.after()设置的标志。

代码语言:javascript
复制
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')
EN

回答 2

Stack Overflow用户

发布于 2015-08-31 01:28:42

after不会启动新线程,它会在Tk的事件循环中运行一个方法。因此,您的while循环总是会阻塞程序。

如果使用after,则该方法只能执行非阻塞操作,如检查标志。如果你有后台进程,使用真正的线程。但请注意:您不能在这些线程中更改GUI!

代码语言:javascript
复制
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()
票数 3
EN

Stack Overflow用户

发布于 2015-08-31 02:12:02

从您的示例中并不清楚您实际上是需要一个OS线程,还是仅仅需要一个异步事件驱动的任务。丹尼尔回答了前者,所以我也回答了后者。关键是让任务“休眠”,调用root.after而不是time.sleep。(请注意,只有在重新绑定name的函数中才需要并且应该使用global name。)

代码语言:javascript
复制
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”。(时间不是精确的,但顺序应该是准确的。)

代码语言:javascript
复制
Start
Flag not set
Flag not set
Flag not set
Setting flag
Flag set

repeated after的技巧是如何在tkinter中为任何东西设置动画,例如在屏幕上移动小工具,或者定期更改颜色。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32299222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档