PyQt中self.close()后控件不返回问题
我正在用PyQt制作一个用户界面。这个界面功能非常简单。当我在终端运行这个脚本时,应该会弹出一个对话框,询问名字,并在按下确定后关闭。不过,我无法从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"
却不行,程序也没有结束。
我查看了类似的问题,但似乎没有一个能解决我遇到的这个问题。我需要为此再写一个处理程序吗?
2 个回答
0
if ok:
self.text = text
print text
self.deleteLater()
应该结束这个应用程序
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"
补充说明:
在另一个回答中提到的 deleteLater()
之所以能“有效”,是因为它会把一个删除事件放到事件队列中(这个事件会在事件循环正常启动后被处理)。而 close()
方法并不会以这种方式放置事件,因此应用程序就没有机会自动退出。