Во-первых, я очень новичок в Python и Pyside. Чтобы немного улучшить самосовершенствование, я пытаюсь заставить QTimer выполнять каждую секунду в дочернем потоке моей программы PySide (на данный момент я просто хочу, чтобы она печатала «привет!» На терминал каждую секунду без замораживания главного окна).Таймер в дочерней теме в PySide
Я попытался преобразовать example I found on the Qt Wiki из C++ в Python/PySide, но так как я действительно не знаю C++, я предполагаю, что я его неправильно преобразовал, и именно поэтому он не работает должным образом.
На данный момент функция doWork() работает только один раз, а затем никогда больше. Что я делаю не так? Есть ли лучший способ выполнить функцию каждую секунду в PySide без замораживания главного окна?
Вот код (я удалил некоторые основной код окна, чтобы увеличить четкость):
from PySide import QtGui
from PySide import QtCore
from client_gui import Ui_MainWindow
statsThread = QtCore.QThread()
class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
#setup GUI
self.setupUi(self)
#start thread to update GUI
self.statsThread = updateStatsThread()
self.statsThread.start(QtCore.QThread.TimeCriticalPriority)
class updateGuiWithStats(QtCore.QObject):
def Worker(self):
timer = QtCore.QTimer()
timer.timeout.connect(self.doWork())
timer.start(1000)
def doWork(self):
print "hi!"
class updateStatsThread (QtCore.QThread):
def run(self):
updater = updateGuiWithStats()
updater.Worker()
self.exec_()
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
frame = MainWindow()
frame.show()
sys.exit(app.exec_())
Вы правы, полагая, что я хотел бы сделать больше в 'doWork()', чем просто вызывать 'print 'foo" или что-то в этом роде. Имея это в виду, я внедрил переработанный класс 'UpdateStatsThread()', который вы написали. Однако, когда я иду, чтобы выйти из потока, я получаю сообщение о том, что поток был уничтожен во время работы. Я предполагаю, что это из-за того, что я покинул поток, пока 'time.sleep (1)' все еще работает. Есть ли хороший способ выйти из потока и избежать этого сообщения? –
Я полностью. Это определенно потому, что python уничтожает объект, прежде чем он действительно закончит. Я обновил свой ответ, чтобы добавить дополнительное ожидание к методу stop(). Я также обновил сон, чтобы использовать QThread.msleep() – jdi
спасибо за хороший ответ! ;) – Kasramvd