2014-10-30 6 views
1

我想使用PyQt製作一個用戶界面。它有一個非常基本的工作。當腳本在終端上運行時,當按下Ok時,詢問名稱的對話框應該打開和關閉。但是,我無法從Qt應用程序返回控件。控制不返回後在PyQt中遇到self.close()

我的代碼如下:

class Interactive(QtGui.QWidget): 

    def __init__(self): 
     super(Interactive,self).__init__() 
     self.initGUI() 

    def initGUI(self): 
      self.setGeometry(300,300,290,150) 
      self.setWindowTitle('Input Dialog') 
      self.show() 

      self.inputdialog = QtGui.QInputDialog() 
      self.inputdialog.move(50,50) 

      text, ok = self.inputdialog.getText(self,'Input Dialog','Enter Your Name:') 
      #self.text = text 
      if ok: 
       self.text = text  
       print text 
       self.close() 


if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    obj = Interactive() 
    #app.exec_() 
    if app.exec_(): 
     sys.exit() 
     print "somerandomtext" 

print text在類的內部工作,但我的測試字符串"somerandomtext"是不是和程序沒有結束。

我已經看過類似的問題所以,但沒有一個似乎解決了同樣的問題。我必須爲此做出另一個處理程序嗎?

+0

因爲您在打印前使用了sys.exit()。所以退出後它永遠不會打印任何東西。 – Achayan 2014-10-30 20:26:38

+0

如果執行了sys.exit(),程序將會終止,正如我已經說過的那樣,程序並沒有終止。 – light94 2014-10-30 20:43:17

回答

1

通常情況下,當最後一個頂層窗口關閉的應用程序將自動退出,但畢竟是從你的例子發生preventedf因爲你沒有讓事件循環來正確開始。

有許多方法來重新構造你的例子來避免這個問題,但可能是最簡單的就是用這樣的計時器:

class Interactive(QtGui.QWidget): 
    def __init__(self): 
     super(Interactive,self).__init__() 
     # delay initialization 
     # self.initGUI() 
     ... 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    obj = Interactive() 
    QtCore.QTimer.singleShot(0, obj.initGUI) 
    app.exec_() 
    print "somerandomtext" 

PS

之所以deleteLater()在另一個答案中的作品種類是因爲它向事件隊列發佈了刪除事件(一旦事件循環正確啓動,它將被處理)。 close()方法不會以這種方式發佈事件,因此應用程序沒有機會自動退出。

+0

非常感謝你的回答。你能描述一下你的意思嗎?「不允許事件循環正確啓動」。它是否與像ram等系統配置一樣? – light94 2014-10-30 22:03:09

+0

不,這只是你的'initGUI'試圖在事件循環開始之前做太多事情。如果在打開對話框的主窗口上有一個按鈕,它也可以解決問題。這只是在用戶開始與gui交互之前允許一小段延遲的問題。 – ekhumoro 2014-10-30 22:16:41

+0

好的。但之前我嘗試了一個沒有輸入對話框的類似示例,添加了一個按鈕,並在其事件處理函數中寫入了self.close(),並且它工作正常。那麼爲什麼呢? – light94 2014-10-30 22:22:28

0
if ok: 
       self.text = text  
       print text 
       self.deleteLater() 

應該終止應用程序

+0

該解決方案有效,但您能否解釋它? – light94 2014-10-30 21:00:41

+0

請檢查http://pyqt.sourceforge.net/Docs/PyQt4/qobject.html#deleteLater和http://pyqt.sourceforge.net/Docs/PyQt4/qwidget.html#close你會看到不同之處。 – Achayan 2014-10-30 21:03:47

相關問題