解决python tkinter 与 sleep 延迟问题

Posted py-peng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决python tkinter 与 sleep 延迟问题相关的知识,希望对你有一定的参考价值。

 多线程(threading——join)

join ()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join(),那么,主线程A会在调用的地方等待,直到子线程B完成操作后,

才可以接着往下执行,那么在调用这个线程时可以使用被调用线程的join方法。join([timeout]) 里面的参数时可选的,代表线程运行的最大时

间,即如果超过这个时间,不管这个此线程有没有执行完毕都会被回收,然后主线程或函数都会接着执行的,如果线程执行时间小于参数表示的

时间,则接着执行,不用一定要等待到参数表示的时间。

 1 import threading
 2 import time
 3 #创建两个测试的变量
 4 num_1 = 0
 5 num_2 = 0
 6 def te_1():
 7     global num_1
 8     #将num_1加到 3
 9     for i in range(3):
10         num_1 += 1
11         print("我是num_1: " + str(num_1))
12         time.sleep(1)
13 def te_2():
14     global num_2
15     #将num_2加到 3
16     for i in range(3):
17         num_2 += 1
18         print("我是num_2: " + str(num_2))
19         time.sleep(1)
20 t1 = threading.Thread(target=te_1)
21 t1.start()
22 t2 = threading.Thread(target=te_2)
23 #join为等待线程,等待t1线程执行完,再执行t2线程
24 t1.join()
25 t2.start()

技术分享图片 

多线程(threading——setDeamon)

setDaemon()方法。主线程A中,创建了子线程B,并且在主线程A中调用了B.setDaemon(),这个的意思是,把主线程A设置为守护线程,这

时候,要是主线程A执行结束了,就不管子线程B是否完成,一并和主线程A退出.这就是setDaemon方法的含义,这基本和join是相反的。此外,还有

个要特别注意的:必须在start() 方法调用之前设置,如果不设置为守护线程,程序会被无限挂起,只有等待了所有线程结束它才结束。

 1 import threading
 2 import time
 3 #创建两个测试的变量
 4 num_1 = 0
 5 num_2 = 0
 6 def te_1():
 7     global num_1
 8     #将num_1加到 3
 9     for i in range(3):
10         num_1 += 1
11         print("我是num_1: " + str(num_1))
12         time.sleep(1)
13 def te_2():
14     global num_2
15     #将num_2加到 5
16     for i in range(5):
17         num_2 += 1
18         print("我是num_2: " + str(num_2))
19         time.sleep(1)
20 t1 = threading.Thread(target=te_1)
21 t1.start()
22 t2 = threading.Thread(target=te_2)
23 #守护进程t2,当t1执行完后不再去执行t2
24 t2.setDaemon(t1)
25 t2.start()

技术分享图片

下面是如何解决time.sleep,其实非常简单,只需要创建一个线程让他自己执行就可以了

 1 """小白随笔,大佬勿喷"""
 2 ‘‘‘tkinter解决time延迟问题‘‘‘
 3 import tkinter as tk
 4 import time
 5 import threading
 6 #初始化窗口
 7 window = tk.Tk()
 8 #窗口名称
 9 window.title("My Window")
10 #窗口大小,是 x 不是 *
11 window.geometry("400x400")
12 #不能改变窗口的大小
13 window.resizable(width=False,height=False)
14 def count():
15     label = tk.Label(window,bg=green)
16     label.pack()
17     button.pack()
18     while True:
19         try:
20             #获取当前时间
21             date = time.strftime("%Y-%m-%d
%H:%M:%S")
22             label.config(text=date)
23             #更新窗口
24             window.update()
25             time.sleep(1)
26         except:
27             break
28 #创建按钮,只是为了测试sleep与按钮之间是否存在延迟
29 button = tk.Button(window,text=Hit_me,width=20)
30 #创建线程,如果函数里面有参数,args=()
31 t = threading.Thread(target=count)
32 #开启线程
33 t.start()
34 #循环窗口
35 window.mainloop()

技术有限,不会录制gif图

技术分享图片

 

以上是关于解决python tkinter 与 sleep 延迟问题的主要内容,如果未能解决你的问题,请参考以下文章

tkinter 和 time.sleep

有没有办法修复 while 循环不使用 time.sleep 更新 tkinter 标签?

tkinter界面卡死的解决办法

tkinter界面卡死的解决办法

Python如何修复由于睡眠功能而导致的Tkinter窗口崩溃

[python][转载]tkinter opencv显示视频一闪一闪解决方法