【Python-延迟/阻塞】解决 tkinter 与 sleep 同时使用延迟问题

1.问题描述

当Python程序中同时存在tkinter和time.sleep()时,启动程序进入到listbox.insert时,窗口就一直无响应,所有listbox.insert的内容都会阻塞,要等整个for循环完(也就是所有time.sleep(3)都要执行完)了才会在窗口显示。

2.问题分析

多线程(threading——join)

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

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

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

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

import threading
import time
# 创建两个测试的变量
num_1 = 0
num_2 = 0
def te_1():
    global num_1
    # 将num_1加到 3
    for i in range(3):
        num_1 += 1
        print("我是num_1: " + str(num_1))
        time.sleep(1)
def te_2():
    global num_2
    # 将num_2加到 3
    for i in range(3):
        num_2 += 1
        print("我是num_2: " + str(num_2))
        time.sleep(1)
t1 = threading.Thread(target=te_1)
t1.start()
t2 = threading.Thread(target=te_2)
# join为等待线程,等待t1线程执行完,再执行t2线程
t1.join()
t2.start()

多线程(threading——setDeamon)

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

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

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

import threading
import time
# 创建两个测试的变量
num_1 = 0
num_2 = 0
def te_1():
    global num_1
    # 将num_1加到 3
    for i in range(3):
        num_1 += 1
        print("我是num_1: " + str(num_1))
        time.sleep(1)
def te_2():
    global num_2
    # 将num_2加到 5
    for i in range(5):
        num_2 += 1
        print("我是num_2: " + str(num_2))
        time.sleep(1)
t1 = threading.Thread(target=te_1)
t1.start()
t2 = threading.Thread(target=te_2)
# 守护进程t2,当t1执行完后不再去执行t2
t2.setDaemon(t1)
t2.start()

3.解决办法

如何解决time.sleep,其实非常简单,只需要创建一个线程让他自己执行。

'''tkinter解决time延迟问题'''
import tkinter as tk
import time
import threading
# 初始化窗口
window = tk.Tk()
# 窗口名称
window.title("My Window")
# 窗口大小,是 x 不是 *
window.geometry("400x400")
# 不能改变窗口的大小
window.resizable(width=False,height=False)
def count():
    label = tk.Label(window,bg='green')
    label.pack()
    button.pack()
    while True:
        try:
            # 获取当前时间
            date = time.strftime("%Y-%m-%d\n%H:%M:%S")
            label.config(text=date)
            #更新窗口
            window.update()
            time.sleep(1)
        except:
            break
# 创建按钮,只是为了测试sleep与按钮之间是否存在延迟
button = tk.Button(window,text='Hit_me',width=20)
# 创建线程,如果函数里面有参数,args=()
t = threading.Thread(target=count)
# 开启线程
t.start()
# 循环窗口
window.mainloop()
  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值