2016-04-17 3 views
0

__init__私はアプリケーションの状態を制御するためにtickMain()メソッドを呼び出しています。最初にStates.STATE_INITがこのメソッドに渡されます。つまりStates.STATE_IDLEtickMain()に渡される前にstate_Init()が呼び出されることを意味します。プログラムはtickMain()を呼び出し続けます。このプロセスは正常に動作しているようです(print()ステートメントが実行されています)。ただし、UIが初期化されていない、つまり表示されない(白い背景だけで、マウスカーソルが読み込みアイコンである)ように見えます。私は何が欠けていますか?別のスレッドからtickMain()に電話する必要がありますか?起動時にPyQT UIが表示されない(別のスレッドが必要ですか?)

class CMyClass(QtGui.QMainWindow): 

'''''''''''''''''''''''''''''''''''''''''' 
def __init__(self): 

    global state 

    while True: 
     self.tickMain() 
     time.sleep(1) 

'''''''''''''''''''''''''''''''''''''''''' 
def tickMain(self): 

    global state 

    print("Ticking...") 

    switcher = { States.STATE_INIT: self.state_Init, 
       States.STATE_IDLE: self.state_Idle, 
       States.STATE_PROCESS_MSG_QUEUE: self.state_ProcessMsgQueue } 
    func = switcher.get(state, lambda: "nothing") 

    func() 

''''''''''''''''''''''''''''''''''''''''''  
def state_Init(self): 

    global state 

    print("Initializing...") 

    super(CMyClass, self).__init__() 

    print("Setting up COM port...") 

    self.com_serial = SerialCommsHandler.SerialCommsHandler() 

    print("Initializing UI...") 

    self.initUI() 

    print("Reading from COM port...") 

    state = States.STATE_IDLE 

'''''''''''''''''''''''''''''''''''''''''' 
def initUI(self): 

    self.initMenuBar() 

    # Status Bar 
    sb_statusBar = self.statusBar() 

    # Send PushButton 
    self.btn_send = QtGui.QPushButton('Send', self) 
    self.btn_send.move(400, 245) 
    self.connect(self.btn_send, Qt.SIGNAL("clicked()"), self.slotMsgSend) 

    self.setGeometry(300, 300, 500, 400) 
    self.setFixedSize(650, 500) 
    self.setWindowTitle('My Test App') 
    self.show() 
+0

あなたは 'thickMain'メソッドの中で' self.tickMain() 'を呼び出すことによって無限ループを作成しませんか? – PYPL

+0

@PYPL私は...それは愚かだった。私は今これを修正しました。しかし、私はまだ元の問題を抱えています。 – petehallw

+0

これはまだ間違っています! 'thickMain'は値を返さなければならないので、' __init__'の 'while'ループはいつ停止するかを知っています!あなたはまだ無限ループ中です – PYPL

答えて

0

app.exec_()を呼び出すと、これはmaimスレッドでQtイベントループを開始します。ボタンのクリック、再描画などのウィンドウイベントを処理します。Qtが機能するためには、Qtのイベントループが機能しないように、メインスレッドをブロックするもの(無限ループのようなもの)を持たないでください。

スレッドに負荷をかけることはできますが、これはアプリケーションにとって過剰なものです。スレッディングは、そのセカンダリスレッド内からQt GUIオブジェクトを変更したり、アクセスすることができないため、扱いにくいです。

ループ(self.tickMain())で実行したいコードが高速であると仮定すると、Qtイベントループに定期的にメソッドを呼び出すように依頼することができます。このようにして、重要な期間イベントループをブロックすることはありません。

これは、QTimerを使用して行います。

def __init__(self): 
    # you must call the parent class constructor 
    QtGui.QMainWindow.__init__(self) 

    # create the timer 
    self.timer = QTimer(self) 
    self.timer.timeout.connect(self.tickMain) 
    self.timer.start(1000) # call tickMain every 1000 milliseconds 
関連する問題