我正在使用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只是在后台运行。
谢谢:))
答案 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_())