まず、PythonとPysideの新機能です。自己改良のために、私はPyTideプログラムの子スレッドで1秒ごとにQTimerを実行させようとしています(現時点では、 "hi!"メインウィンドウをフリーズすることなく)。PySideの子スレッドのタイマー
私はexample I found on the Qt WikiをC++からPython/PySideに変換しようとしましたが、実際にはC++が分からないため、正しく変換しなかったと思われます。
現時点でdoWork()関数は1回だけ実行され、その後は実行されないようです。私は間違って何をしていますか?メインウィンドウを凍らせずにPySideで1秒ごとに関数を実行するより良い方法はありますか? 、updateGuiWithStats
クラスの
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()メソッドにオプションのwaitを追加するように答えを更新しました。私はまた、QThread.msleep() – jdi
を使用するように睡眠を更新しました。 ;) – Kasramvd