我的穿线是否合适?如果是,那么为什么代码不起作用?

时间:2016-09-03 20:45:19

标签: python multithreading pyqt4 lcd

我正在使用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()函数中尝试了while循环,然后它甚至没有加载GUI只是在后台运行。 谢谢:))

2 个答案:

答案 0 :(得分:1)

Qt不支持在主线程以外的线程中执行GUI操作。因此,当您从生成的线程的上下文中调用self.lcddisplay.display(showTime)时,这是一个错误,Qt将无法正常工作。

正如tdelaney在评论中所说,处理此类问题的最佳方法是使用QTimer以适当的间隔发出信号,并更新信号所连接的插槽中的lcddisplay。

(如果你坚持使用线程,但是,例如作为一个学习练习,那么你的衍生线程需要向主线程发送一条消息,告诉主线程进行显示更新,而不是试图做更新自己)

答案 1 :(得分: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_())