在PyQt中遇到self.close()后控制没有返回

时间:2014-10-30 19:46:07

标签: python qt pyqt pyqt4

我正在尝试使用PyQt创建一个UI。它有一个非常基本的工作。当脚本在终端上运行时,按下确定时,应该打开和关闭询问姓名的对话框。但是,我无法从Qt应用程序返回控件。

我的代码如下:

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"不是,程序没有结束。

我在So看过类似的问题,但似乎没有人解决同样的问题。我是否必须为此制作另一个处理程序?

2 个答案:

答案 0 :(得分:1)

通常情况下,当最后一个顶级窗口关闭时,应用程序将自动退出,但在您的示例中会阻止这种情况发生,因为您不允许事件循环正常启动。

有许多方法可以重新构建您的示例以避免此问题,但最简单的方法是使用这样的计时器:

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()方法不会以这种方式发布事件,因此应用程序没有机会自动退出。

答案 1 :(得分:0)

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

应终止应用