2016-09-03 2 views
1

Я создаю будильник в python, используя PyQt4, и в этом я использую виджет ЖК-дисплея, отображающий текущее время обновления. Для этого я использую threading. Но я новичок в этом, поэтому проблема заключается в том, что я не знаю, как отлаживать эту вещь.Действительно ли моя резьба? если да, то почему код не работает?

Это мой код

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() функции, то она даже не загружается графический интерфейс просто работает в фоновом режиме. Спасибо :)

+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 не поддерживает выполнение операций с графическим интерфейсом в потоках, отличных от основного потока. Поэтому, когда вы вызываете self.lcddisplay.display (showTime) из контекста вашего порожденного потока, это ошибка, и Qt работает неправильно.

Как предложил tdelaney в своем комментарии, лучший способ справиться с этим - использовать QTimer для испускания сигнала через соответствующие промежутки времени и обновить свой lcddisplay в слоте, к которому подключен сигнал.

(если вы настаиваете на использовании потоков, например, в качестве учебного упражнения, то ваш порожденный поток должен будет отправить сообщение в основной поток, чтобы сообщить основному потоку сделать обновление дисплея, а не пытаться сделать само обновление)

+0

Спасибо за ответ. Теперь я пытаюсь настроить QTimer, так что вы можете сказать мне, что этот синтаксис правильный? '' '' ''» таймер = QtCore.QTimer() timer.timeout.connect (self.showTime) timer.start() '' '' '' это собственно? Я попытался запустить его. Он ничего не делает – laslavinco