2014-03-25 160 views
0

我正在嘗試爲我正在處理的項目學習PySide。我正在通過Zetcode教程,但從一開始我就遇到了問題。我通過Enthought's Canopy編寫並運行我的代碼。當我從命令行運行代碼時,它工作正常。 This question可能與我的問題有關,但是沒有給出答案。PySide程序立即關閉

當我用最簡單的代碼從教程

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() 

當運行程序閃爍(I可以看到窗口出現短暫的第二),然後關閉。在main()結束之前發出異常將使窗口保持在屏幕上。

TL; DR

爲什麼把課程放在課堂上讓它不起作用?

+0

我試圖運行你的代碼,它運行良好。也許那個Canopy給你帶來麻煩? – ivica

+0

@ivica從命令行運行該程序,Canopy似乎成了問題。我仍然希望能夠使用Canopy,所以如果你知道解決方案,將不勝感激 – Dannnno

回答

2

這兩個示例之間的區別在於,第一個示例將引用小部件作爲全局變量,第二個創建局部變量,當它超出作用域時會進行垃圾回收(即函數返回時)。

解決這個問題的最簡單的方法,就是讓ex變量全局的,就像這樣:

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

,或者你可以只擺脫main功能,並簡單地做:

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

Canopy運行和運行之間的區別在於,Canopy使用IPython QTConsole,默認情況下,運行在帶有QT GUI後端的pylab模式下。關於這個(以及ipython的許多天才之一)的好處是,您可以在命令提示符和GUI之間進行實時交互)。

我懷疑你碰到了pylab。像Matplotlib這樣的複雜程序可以確定GUI事件循環是否已經啓動,並相應地進行調整。但是出於你的目的,你可能只是想禁用pylab模式,這樣Canopy中的IPython就更像是一個通用的Python。爲此,請從Canopy首選項菜單(Python選項卡)中禁用Pylab模式。