在寫python和UI文件的結合時,一定要注意不能在子線程操作UI界面,或者將UI的更新放在循環中,否則會造成UI線程的阻塞,導致界面卡死,等到邏輯循環結束,UI纔會恢復。
那麼如何將UI線程和邏輯線程分離呢?這裏需要用到slot和signal的概念。
先看一下底下這個例子,當程序開始運行時拋出一個線程,線程中每兩秒發出一個信號,信號的接收端是更換圖片函數self.signal_pictures_function。
import threading
#自己寫的線程,繼承父類threading.Thread
class Thread(threading.Thread):
def __init__(self, signal_pictures):
threading.Thread.__init__(self)
#定義更換圖片信號
self.signal_pictures = signal_pictures
def run(self):
while True:
#每隔兩秒,信號發射一次
self.signal_pictures.emit()
time.sleep(2)
class Mainpage (QDialog, Mainpage.Ui_Mainpage):
# 聲明信號
signal_pictures=QtCore.pyqtSignal()
flag=0
def __init__(self, parent=None):
super(Mainpage, self).__init__(parent)
self.setupUi(self)
#信號關聯更換圖片函數
self.signal_pictures.connect(self.signal_pictures_function)
if __name__ == "__main__":
app = QApplication(sys.argv)
mainpage = Mainpage()
mainpage.show()
#拋出線程
Thread(mainpage.signal_pictures).start()
app.exec_()
如果需要傳遞參數,可以在生命信號時加上參數的類型聲明,例如:
#無參數傳遞
signal=QtCore.pyqtSignal()
#傳遞字典參數
signal= QtCore.pyqtSignal(dict)
#傳遞一個整數
signal=QtCore.pyqtSignal(int)