2017-06-16 11 views
0

私は、関数を呼び出す前にQWidgetが完全に表示されるまで待つ方法を探しています。私は2つのウィンドウを持っています:親と子。Pyqt5ウィジェットが表示されるまで待つ

from PyQt5 import QtCore, QtGui, QtWidgets 
from Child import Child_Form 
import sys 

class Parent_Form(QtWidgets.QWidget): 
    def __init__(self): 
     QtWidgets.QWidget.__init__(self) 
     self.setupUi(self) 
     self.Child = Child_Form(self) 

    def setupUi(self, Parent): 
     Parent.setObjectName("Parent") 
     Parent.resize(400, 300) 
     self.nextWindow = QtWidgets.QPushButton(Parent) 
     self.nextWindow.setGeometry(QtCore.QRect(150, 120, 91, 31)) 
     self.nextWindow.setObjectName("nextWindow") 

     self.retranslateUi(Parent) 
     QtCore.QMetaObject.connectSlotsByName(Parent) 

    def retranslateUi(self, Parent): 
     _translate = QtCore.QCoreApplication.translate 
     Parent.setWindowTitle(_translate("Parent", "Parent Window")) 
     self.nextWindow.setText(_translate("Parent", "Next Window")) 

     self.nextWindow.clicked.connect(self.openChild) 

    def openChild(self): 
     self.hide() 
     self.Child.show() 
     self.Child.busyFunc() 

if __name__ == '__main__': 
    app = QtWidgets.QApplication(sys.argv) 
    ex = Parent_Form() 
    ex.show() 
    sys.exit(app.exec_()) 

は、子フォームがちょうどラベルを持っています

親フォームは、子供の主な機能busyFunc、親を隠しopenChildを呼び出すボタンを持つウィンドウである子を示し、その後、実行しますテキストの編集があるスクロール領域があります。

from PyQt5 import QtCore, QtGui, QtWidgets 

class Child_Form(QtWidgets.QWidget): 
    def __init__(self, Parent_Form): 
     QtWidgets.QWidget.__init__(self) 
     self.setupUi(self) 
     self.parent = Parent_Form 

    def setupUi(self, Form): 
     Form.setObjectName("Form") 
     Form.resize(400, 300) 
     self.label = QtWidgets.QLabel(Form) 
     self.label.setGeometry(QtCore.QRect(20, 10, 61, 16)) 
     self.label.setObjectName("label") 
     self.scrollArea = QtWidgets.QScrollArea(Form) 
     self.scrollArea.setGeometry(QtCore.QRect(20, 40, 361, 241)) 
     self.scrollArea.setWidgetResizable(True) 
     self.scrollArea.setObjectName("scrollArea") 
     self.scrollAreaWidgetContents = QtWidgets.QWidget() 
     self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 359, 239)) 
     self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") 
     self.textEdit = QtWidgets.QTextEdit(self.scrollAreaWidgetContents) 
     self.textEdit.setGeometry(QtCore.QRect(0, 0, 361, 241)) 
     self.textEdit.setObjectName("textEdit") 
     self.scrollArea.setWidget(self.scrollAreaWidgetContents) 

     self.retranslateUi(Form) 
     QtCore.QMetaObject.connectSlotsByName(Form) 

    def retranslateUi(self, Form): 
     _translate = QtCore.QCoreApplication.translate 
     Form.setWindowTitle(_translate("Form", "Child Window")) 
     self.label.setText(_translate("Form", "Status:")) 

    def busyFunc(self): 
     for i in range(0, 1000000000): 
      pass 

busyFuncが呼び出されたときに問題がある(実際の関数は、私は明確にするためにそれを省略してきた巨大なプログラムです。私はループを使用して問題をシミュレートしています)。

親は隠されていますが、子どもはbusyFuncが完了するまでこのように見えます。

どのように私は完全にこのように子負荷を行い、その後、busyFuncを実行することができますか?

+0

私の質問をより明確にする方法があれば、そう言いなさい! – Jaitnium

+0

私の解決策を見てください – eyllanesc

答えて

1

一つの解決策は、タイマーによっていくつかの時間後にbusyFunc機能を起動することです。

def openChild(self): 
    self.hide() 
    self.Child.show() 
    QtCore.QTimer.singleShot(100, self.Child.busyFunc) 

問題は、これがスレッド明らかbusyFuncの現在のコードが相互作用しないよう

class Thread(QtCore.QThread): 
    def __init__(self, parent=None): 
     QtCore.QThread.__init__(self, parent) 

    def run(self): 
     for i in range(0, 1000000000): 
      pass 

class Child_Form(QtWidgets.QWidget): 
    def __init__(self, Parent_Form): 
     [...] 
    def busyFunc(self): 
     self.thread = Thread(self) 
     self.thread.start() 

にそのタスクを実行している推薦解決するために、この機能を実行している間のインターフェイスがブロックされているということでしょうGUI、つまりGUIの値を更新しても問題はありませんが、GUIの一部のデータを更新する必要がある場合は、直接信号でなくてはなりません:

class Thread(QtCore.QThread): 
    signal = QtCore.pyqtSignal(str) 
    signal2 = QtCore.pyqtSignal(list) 
    def __init__(self, parent=None): 
     QtCore.QThread.__init__(self, parent) 

    def run(self): 
     self.signal.emit("start") 
     for i in range(0, 1000000000): 
      pass 
     self.signal.emit("finish") 
     self.signal2.emit([1, 2, 3, 4]) 

class Child_Form(QtWidgets.QWidget): 
    def __init__(self, Parent_Form): 
     [...] 
    def busyFunc(self): 
     self.thread = Thread(self) 
     self.thread.signal.connect(lambda text: self.textEdit.append(text)) 
     self.thread.signal2.connect(lambda l: print(l)) 
     self.thread.start() 

class Parent_Form(QtWidgets.QWidget): 
    def __init__(self): 
     [...] 
    def openChild(self): 
     self.hide() 
     self.Child.show() 
     self.Child.busyFunc() 
+0

ありがとうございました!私はそれがどのようになったかをあなたに知らせます。 – Jaitnium

+0

私はあなたのソリューションを試して、私の問題をほぼ解決しました。スレッドからリストを発行する方法はありますか? – Jaitnium

+0

可能であれば、私はそれを行う方法を示すコードを更新しました – eyllanesc

関連する問題