PyQt中的QWidget窗口在显示后立即关闭?

8
我知道这个问题以前已经被问过很多次,但似乎没有一个适用于我的情况。我已经安装了PyQt,现在只是想像这样打开一个窗口:
import sys
from PyQt4 import QtGui as qt

segmentation = qt.QApplication(sys.argv)
main = qt.QWidget()
main.show()

我在这里看到的其他问题通常是由于窗口的show方法从函数内部调用而导致窗口超出范围的错误,或类似的情况。

我的代码根本没有使用函数,所以这不可能是问题。按照这个教程应该可以工作,对吧?

https://www.youtube.com/watch?v=JBME1ZyHiP8

在8:58的时候,教练几乎和我写的一模一样,他们的窗口显示得很好。我的窗口只显示了一小部分就关闭了。

代码块的屏幕截图可用于与此处提供的代码块进行比较:

Demo code that works


1
看一下视频。演示中没有.exec_()代码。除了变量名之外,OP发布的代码是相同的。问题是为什么它在那里能够工作,但是当OP运行它时却不能工作。 - Andy
1
我已经添加了一个视频截图,供那些不想浏览OP提到的时刻的人使用。这表明代码是相似的(变量名不同),但窗口在演示中保持打开状态。 - Andy
1个回答

12

没有看到所有的代码,我假设你缺少了 sys.exit() 部分。

对于你特定的代码,sys.exit(segmentation.exec_()) 就是你需要的。

segmentation = qt.QApplication(sys.argv)
main = qt.QWidget()
main.show()
sys.exit(segmentation.exec_())

这里简单介绍一下正在发生的事情。

segmentation = qt.QApplication(sys.argv) 创建了实际的应用程序。

main = qt.QWidget()main.show() 创建了小部件并显示出来。

执行Python脚本时,它会按照你的指示执行以下操作:

  1. 创建一个应用程序
  2. 创建一个小部件
  3. 显示小部件
  4. 完成。脚本结束。

sys.exit() 的作用是干净地关闭Python脚本。segmentation.exec_() 开始QT的事件驱动后台处理。一旦 segementation.exec_() 完成(用户关闭应用程序、软件关闭应用程序或遇到错误),它将返回一个值,然后传递给 sys.exit() 函数,该函数随即终止Python进程。


看这个视频。演示中没有.exec_()代码。除了变量名之外,OP发布的代码是相同的。 - Andy
@jphollowed,这个答案是正确的。添加此处提供的代码行将防止窗口关闭。 - Andy
1
这就是我的全部代码。我刚开始学习教程,但在出现问题之前只完成了这一部分。如果你看一下链接视频的8:58,你会发现他的确切代码可以正常运行。我已经尝试了你提供的方法,它确实解决了问题。但我仍然想知道为什么视频中不需要 sys.exit,而我却需要。谢谢。 - pretzlstyle
3
@jphollowed 我猜这个视频展示的是一个交互式体验。也就是说,执行的代码并不像正常脚本运行一样被终止。如果你在iPython控制台中执行你的代码,窗口会出现而不会立即关闭。 - James Mertz
谢谢您添加解释,现在非常清楚明白了。 - pretzlstyle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接