2016-09-26 5 views
1

私の問題のサンプルコードを書いた。このコードは、2つの与えられた数字の合計を生成し、テキストブラウザで結果を表示し、最初の数字をsumに置き換えて2番目の数値に加え、テキストブラウザで結果を再度表示する必要があります。問題は次のとおりです。Qthreadの使用中にシグナルスロットの問題

1 - 信号が正常に動作しないのはなぜですか?

2 - テキストブラウザで表示するためにsum-numberで信号を出力するにはどうすればよいですか?

import sys 
import time 

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 


class AreaThread(QThread): 
    signal = pyqtSignal() 

    def __init__(self, no1, no2, parent): 
     QThread.__init__(self) 

     self.no1 = no1 
     self.no2 = no2 

    def area(self): 
     for i in range(10): 
      self.sum = self.no1 + self.no2 
      self.no1 = self.no2 
      self.no2 = self.sum 
      self.signalemit() 
      time.sleep(1) 

    def signalemit(self): 
     self.signal.emit() 

    def run(self): 
     self.area() 


class GeneralizedRun (QMainWindow): 

    def __init__(self, no1, no2): 

     QMainWindow.__init__(self) 
     self.no1 = no1 
     self.no2 = no2 

    def initUi(self, mainwindow): 

     mainwindow.centralWidget = QWidget(mainwindow) 

     self.runflow = QTextBrowser() 
     self.runflow.isReadOnly() 
     self.runflow.setText('running:') 
     self.runflow.moveCursor(QTextCursor.End) 

     self.runflow.show() 
     mainwindow.centralWidget = self.runflow 
     self.threadruning() 

    def threadruning(self): 
     self.area = AreaThread(self.no1, self.no2, self) 
     self.area.start() 
     self.area.signal.connect(self.updatetexteditor) 

    def updatetexteditor(self): 

     self.runflow.insertPlainText('\n\n' + 'sum') 
     self.runflow.moveCursor(QTextCursor.End) 


class MainApplication(QMainWindow): 

    def __init__(self): 

     QMainWindow.__init__(self) 
     self.setWindowTitle('Home') 
     self.setGeometry(50, 50, 500, 500) 

     #Main widget 
     self.mainwidget = QWidget() 
     self.mainlayout = QVBoxLayout() 

     #Widgets 
     #Form line edits 
     self.no1 = QLineEdit() 
     self.no2 = QLineEdit() 

     self.run = QPushButton('Run') 
     self.exit = QPushButton('Exit') 

     self.form = QFormLayout() 
     self.form.addRow('First number', self.no1) 
     self.form.addRow('Second number', self.no2) 

     self.mainlayout.addLayout(self.form) 
     self.mainlayout.addWidget(self.run) 
     self.mainlayout.addWidget(self.exit) 

     self.exit.clicked.connect(self.exitapplication) 
     self.run.clicked.connect(self.mainprogramrun) 

     self.mainwidget.setLayout(self.mainlayout) 
     self.mainwidget.show() 

    def exitapplication(self): 
     sys.exit() 

    def mainprogramrun(self): 

     number1 = float(self.no1.text()) 
     number2 = float(self.no2.text()) 

     run = GeneralizedRun(number1, number2) 
     run.initUi(self) 


def main(): 

    application = QApplication(sys.argv) 
    application_window = MainApplication() 
    application.exec_() 

if __name__ == '__main__': 
    main() 
+0

'self.process.signal.connect(self.updatetexteditor)'。 – ekhumoro

+0

私の間違いはここに入力してください。私はそれを修正し、まだ動作しません。 –

+0

あなたの本当のコードで何かが 'initUi()'を呼び出していますか?それが問題でない場合は、[mcve]の作成方法に関するガイダンスをお読みください。 – ekhumoro

答えて

1

GeneralizedRunウィンドウへの参照を保持していないため、サンプルコードが正しく機能しません。だから、修正するための最初のものはこれです:

class MainApplication(QMainWindow): 
    ... 

    def mainprogramrun(self): 

     number1 = float(self.no1.text()) 
     number2 = float(self.no2.text()) 

     # keep a reference to the window 
     self.runner = GeneralizedRun(number1, number2) 
     self.runner.initUi(self) 

バックGUIに合計値を渡すには、スレッドクラスは次のようになります。

class AreaThread(QThread): 
    # re-define the signal to send a value 
    signal = pyqtSignal(float) 

    def __init__(self, no1, no2, parent): 
     QThread.__init__(self) 

     self.no1 = no1 
     self.no2 = no2 

    def area(self): 
     for i in range(10): 
      self.sum = self.no1 + self.no2 
      self.no1 = self.no2 
      self.no2 = self.sum 
      # pass the value 
      self.signalemit(self.sum) 
      time.sleep(1) 

    def signalemit(self, value): 
     # send the value 
     self.signal.emit(value) 

    def run(self): 
     self.area() 

をし、シグナルハンドラは次のようになります。

class GeneralizedRun (QMainWindow): 
    ... 

    def updatetexteditor(self, value): 
     # show the value 
     self.runflow.insertPlainText('\n\nsum: %s' % value) 
     self.runflow.moveCursor(QTextCursor.End) 
+0

問題が解決しました。ありがとうございました。 –

関連する問題