【问题标题】:PySide program closes instantlyPySide 程序立即关闭
【发布时间】:2014-03-25 20:54:31
【问题描述】:

我正在尝试为我正在进行的项目学习 PySide。我正在学习Zetcode 教程,但从一开始我就遇到了问题。我正在通过 Enthought 的 Canopy 编写和运行我的代码。当我从命令行运行代码时,它工作正常。 This question 可能与我的问题有关,但那里没有给出答案。

当我使用教程中最简单的代码时

import sys
from PySide import QtGui    

wid = QtGui.QWidget()
wid.resize(250, 150)
wid.setWindowTitle('Simple')
wid.show()

一切运行正常。除了从 OOP 的角度来看,下一个示例大致相同。

import sys
from PySide import QtGui

class Example(QtGui.QWidget):

    def __init__(self):
        super(Example, self).__init__()

        self.initUI()

    def initUI(self):

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Icon')
        self.setWindowIcon(QtGui.QIcon('web.png'))        

        self.show()

def main():

    ex = Example()    

if __name__ == '__main__':
    main()

程序运行时会闪烁(我可以看到窗口出现一秒钟)然后关闭。在main() 结束之前引发异常将使窗口保持在屏幕上。

TL;DR

为什么将程序放在一个类中会使其不起作用?

【问题讨论】:

  • 我尝试运行您的代码,它运行良好。也许 Canopy 给你带来了麻烦?
  • @ivica 从命令行运行程序有效,Canopy 似乎是问题所在。不过,我仍然希望能够使用 Canopy,所以如果您知道解决方案,将不胜感激

标签: python python-2.7 pyside canopy


【解决方案1】:

这两个示例之间的区别在于,第一个示例将小部件的引用保留为全局变量,而第二个示例创建了一个局部变量,该变量在超出范围时(即函数返回时)被垃圾收集.

解决此问题的最简单方法是将ex 变量设为全局变量,如下所示:

def main():
    global ex
    ex = Example()

或者你可以去掉 main 函数,然后简单地做:

if __name__ == '__main__':        
     ex = Example()

【讨论】:

    【解决方案2】:

    进出 Canopy 的区别在于 Canopy 使用 IPython QTConsole 运行,默认情况下,在 pylab 模式下使用 QT GUI 后端。这样做的好处(也是 ipython 的众多天才之一)是您可以在命令提示符和 GUI 之间进行实时交互)。

    我怀疑你碰到了 pylab。像 Matplotlib 这样复杂的程序可以判断 GUI 事件循环是否已经启动,并相应地进行调整。但出于您的目的,您可能只想禁用 pylab 模式,以便 Canopy 中的 IPython 更像是通用 python。为此,请从 Canopy Preference 菜单(Python 选项卡)禁用 Pylab 模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-27
      • 2017-09-04
      • 2020-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多