2016-04-17 14 views
0

__init__我爲了控制我的應用程序的狀態調用一個方法tickMain()。最初States.STATE_INIT傳入此方法。這意味着,state_Init()然後調用之前,被傳遞到tickMain()States.STATE_IDLE。該計劃繼續致電tickMain()。這個過程似乎工作正常(print()聲明正在執行)。然而,用戶界面似乎停留在初始化階段,即它不顯示(只是一個白色背景,鼠標光標是加載圖標)。我錯過了什麼?我需要從另一個線程呼叫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_()時,這會在主線程中啓動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 
相關問題