2016-09-03 19 views
1

我正在使用PyQt4在python中創建一個鬧鐘,並且我正在使用LCD顯示小部件,它顯示當前的更新時間。爲此,我正在使用線程。但我是新手,所以問題是我不知道如何調試這件事。我的線程是否正確?如果是,那麼爲什麼代碼不工作?

這是我的代碼

import sys 
from PyQt4 import QtGui, uic 
import time 
import os 
from threading import Thread 
class MyWindow(QtGui.QMainWindow): 
    def __init__(self): 
     super(MyWindow, self).__init__() 
     uic.loadUi('AlarmClock_UI.ui', self) 
     self.show() 
     self.comboBox.setCurrentIndex(0) 
     self.comboBox.currentIndexChanged.connect(self.getSelection) 
     self.lineEdit.setText('Please select the reminder type') 
     timeThread = Thread(target = self.showTime()) 
     timeThread.start() 


    def getSelection(self): 
     if self.comboBox.currentIndex() == 1: 
      self.lineEdit.setText('Select the alarm time of your choice') 

     elif self.comboBox.currentIndex() == 2: 
      self.lineEdit.setText('Use those dials to adjust hour and minutes') 
     else: 
      self.lineEdit.setText('Please select the reminder type') 

    def showTime(self):   
      showTime = time.strftime('%H:%M:%S') 
      self.lcdNumber.display(showTime) 





if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    window = MyWindow() 
    sys.exit(app.exec_()) 

我試圖在循環中showTime()函數,那麼它甚至沒有加載GUI只是在後臺運行。 謝謝:)

+1

在此處發佈您的代碼並將其全部縮進4個空格(或全部選中並按Ctrl + k)。不要發佈鏈接。 – Harrison

+0

這不是一個很好用的線程。 qt小部件應該在主線程的qt事件中更新。完全拋棄你的線程,改用QTimer。 – tdelaney

回答

1

正如其他地方所說的,你不需要使用線程來做這件事,就像一個簡單的計時器一樣。這裏是一個基本的演示腳本:

import sys 
from PyQt4 import QtCore, QtGui 

class Clock(QtGui.QLCDNumber): 
    def __init__(self): 
     super(Clock, self).__init__(8) 
     self.timer = QtCore.QTimer(self) 
     self.timer.timeout.connect(self.showTime) 
     self.timer.start(1000) 
     self.showTime() 

    def showTime(self): 
     time = QtCore.QTime.currentTime() 
     self.display(time.toString('hh:mm:ss')) 

if __name__ == '__main__': 

    app = QtGui.QApplication(sys.argv) 
    window = Clock() 
    window.setWindowTitle('Clock') 
    window.setGeometry(500, 100, 400, 100) 
    window.show() 
    sys.exit(app.exec_()) 
1

Qt不支持在主線程以外的線程中執行GUI操作。所以當你從產生線程的上下文中調用self.lcddisplay.display(showTime)時,這是一個錯誤,Qt將無法正常工作。

正如tdelaney在他的評論中所建議的,處理這類事情的最好方法是使用QTimer以適當的間隔發射信號,並在信號連接的插槽中更新您的lcddisplay。 (如果你堅持使用線程,但是,例如作爲一個學習練習,那麼你產生的線程需要發送一條消息給主線程來告訴主線程進行顯示更新,而不是試圖做更新本身)

+0

感謝您的回答。現在我正在嘗試QTimer insted,所以你能告訴我這個語法是否正確? '' '' ''」 計時器= QtCore.QTimer() timer.timeout.connect(self.showTime) timer.start() '' '' '' 這是正確?我試着運行它。但它沒有做任何事情 – laslavinco

相關問題