2017-06-18 12 views
1

QT Designerを使用してGUIを作成しました。それはかなりうまくいくが、より複雑な呼び出しでは、メインウィンドウを更新せずにロックアップする。私はCustomComplexFunction()を実行したいのですが、メインウィンドウのtextEditを常にバックエンド情報を変更して更新していて、2秒ごとに実行したいと思っていました。次のコードは正しいと思われ、エラーなしで実行されますが、textEditは更新されません。 QTデザイナーから設計された.uiファイルをpushButtonとtextEditでインポートしていますので、コードがなくても実行されません。PyQt5 GUIにスレッディングを追加する方法は?

Main.py

import sys 
from PyQt5.QtWidgets import QDialog, QApplication, QPushButton, QVBoxLayout, QMainWindow 
from PyQt5.QtCore import QCoreApplication, QObject, QRunnable, QThread, QThreadPool, pyqtSignal, pyqtSlot 
from PyQt5 import uic, QtGui 

class Worker(QObject): 
    newParams = pyqtSignal() 

    @pyqtSlot() 
    def paramUp(self): 
     x=1 
     for x in range(100): 
      time.sleep(2) 
      self.newParams.emit() 
      print ("sent new params") 
      x +=1 

Ui_somewindow, _ = uic.loadUiType("mainwindow.ui") #the path to UI 

class SomeWindow(QMainWindow, Ui_somewindow, QDialog): 

    def __init__(self): 

     QMainWindow.__init__(self) 
     Ui_somewindow.__init__(self) 
     self.setupUi(self) 

     # Start custom functions 
     self.params = {} 
     self.pushButton.clicked.connect(self.complex) #NumEvent 

    def complex(self): 
     self.work = Worker() 
     self.thread = QThread() 

     self.work.newParams.connect(self.changeTextEdit) 
     self.work.moveToThread(self.thread) 
     self.thread.start() 

     self.CustomComplexFunction() 

    def CustomComplexFunction(self): 
     self.params['City'] = 'Test' 

    def changeTextEdit(self): 

     try: 
      City = self.params['City'] 
      self.textEdit_14.setPlainText(City) 
     except KeyError: 
      City = None 
if __name__ == "__main__": 

    app = QApplication(sys.argv) 
    window = SomeWindow() 
    window.show() 
    sys.exit(app.exec_()) 

あなたはSignals and Slots hereのための公式ドキュメントを参照することができ、これSO postも非常に有用だったが、私はそれを正しく構築されたように思えます。ドキュメントによれば、エミッタは信号が使用されているかどうかは気にしません。これは、コードにはエラーはないが動作しない理由である可能性があります。

どのように動作させるためのアイデアですか?または、少なくともエミッタと信号をテストするための何らかの方法?

+0

アプリケーションと幸運はあなたが常に同じテキスト、すなわち 'self.params [ '市']'設定していませんか? 'changeTextEdit'は2秒ごとに呼び出されますか? – m7913d

+0

おそらく、実行することができないので、私はまだそれに気づいていません。 – RknRobin

+0

実際には、 'CustomComplexFunction()'は7秒ごとに 'self.params ['CIty']'をバックグラウンドで変更しています。わかりやすくするために、この例を残しましたが、 'self.params'は私がメインウィンドウから監視したいものです。 – RknRobin

答えて

2

スレッドをワーカーオブジェクトに接続するのを忘れました。

self.work = Worker() 
self.thread = QThread() 
self.thread.started.connect(self.worker.work) # <--new line, make sure work starts. 
self.thread.start() 

:-)

+1

完璧に感謝します! – RknRobin

関連する問題