メインスレッドがGUIを実行している間にワーカースレッドが処理を実行することは良いことです。また、PyQtは、スレッドセーフであるシグナル/スロット機構をスレッド計測に提供しています。
This may sound of interest。その例では、彼らはあなたが、その後1 exempleがあり、私たち自身のスレッドクラスを作成することもGUI
import sys, time
from PyQt4 import QtCore, QtGui
class MyApp(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setGeometry(300, 300, 280, 600)
self.setWindowTitle('threads')
self.layout = QtGui.QVBoxLayout(self)
self.testButton = QtGui.QPushButton("test")
self.connect(self.testButton, QtCore.SIGNAL("released()"), self.test)
self.listwidget = QtGui.QListWidget(self)
self.layout.addWidget(self.testButton)
self.layout.addWidget(self.listwidget)
def add(self, text):
""" Add item to list widget """
print "Add: " + text
self.listwidget.addItem(text)
self.listwidget.sortItems()
def addBatch(self,text="test",iters=6,delay=0.3):
""" Add several items to list widget """
for i in range(iters):
time.sleep(delay) # artificial time delay
self.add(text+" "+str(i))
def test(self):
self.listwidget.clear()
# adding entries just from main application: locks ui
self.addBatch("_non_thread",iters=6,delay=0.3)
(私たちはボタンをクリックしてにいくつかの項目を追加するリストウィジェットを含むsimpel UI)
を構築します
class WorkThread(QtCore.QThread):
def __init__(self):
QtCore.QThread.__init__(self)
def __del__(self):
self.wait()
def run(self):
for i in range(6):
time.sleep(0.3) # artificial time delay
self.emit(QtCore.SIGNAL('update(QString)'), "from work thread " + str(i))
self.terminate()
run()
メソッドを再定義します。 terminate()
の代替案が見つかります。チュートリアルをご覧ください。
これは[PyQtはでQThreadとバックグラウンドスレッド(http://stackoverflow.com/questions/6783194/background-thread-with-qthread-in-pyqt)のDUPのように見えます。受け入れられた答えの2番目の例は、リンクしたブログからC++コードを直接変換したものです。 – abarnert
また、ネイティブのPythonスレッドコード( 'threading.Thread'など)を書いていますか?そうでない場合は、最初にその例をいくつか試してみてください。 (「PyQtアプリケーションでのスレッド化:QtスレッドまたはPythonスレッドの使用」も参照してください(http://stackoverflow.com/questions/1595649/threading-in-a-pyqt-application-use-qt-threads-or-python-あなたがQThreadを必要とするかどうかを知るため)。 – abarnert
@abarnertありがとう、私はそのリンクが私が探していたものだと思う。私は2番目のリンクを見て、スレッド間でスロット/シグナルを送信できるようにするためにQThreadsを使うべきだと決めました。私は 'threading.Thread'が存在することを知っていましたが、以前はそれを使用していませんでした。私は多くの検索をして、最初のリンクを見て、それを飛ばして、「def run」を見て、移動して、両方の方法を示していないことを実現しなかった! – Azendale