本文基于:windows 7 + python 3.4
知识点:
1. 将 time.sleep 替换为 QTimer
2. 将 time.sleep 放入到 QThread
3. 使用 QThread 自己的 sleep 方法
我们希望实现一个这样的小程序:
当点击开始按钮的时候,下面的文本标签每隔一秒自动加1。
一、直接用 time.sleep(1)
import time class TestWindow(QDialog): def __init__(self): # ... btn1.clicked.connect(self.update) # 按钮连接到槽 # ... def update(self): for i in range(20): time.sleep(1) # 每隔一秒 self.sec += 1 self.sec_label.setText(str(self.sec))
看起来没有任何逻辑上的错误。
那就运行一下看看,点击按钮。。。神马情况?主界面卡死了!如图
我猜测这可能与python的GIL问题有关:
1. time库是纯python的,而PyQt的背后是Qt,这是纯C++的。
2. 换句话说,就是time.sleep(1)时,并没有将CPU控制权交还给Qt,从而造成界面卡死
解决这个问题,既然不能用 python 的 time 库,那就用 PyQt 自己的 QTimer 类
二、使用 QTimer 类
class TestWindow(QDialog): def __init__(self): # ... timer = QTimer() # 计时器 timer.timeout.connect(self.update) btn1.clicked.connect(lambda :timer.start(1000))