2014-10-30 8 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

相关问题