2016-09-16 36 views
0

我正在学习如何使用QT创建器和python制作基本的GUI。我已经成功地创建了一个窗口,其中包含一个按钮,用于在按下时关闭窗口。它在QT Creator中工作正常,我将ui文件转换为py,并运行并按照预期创建窗口,当我打开命令提示符窗口并用python main.py调用它时。我喜欢在Spyder IDE中工作,并希望继续这样做。问题是,如果我打开的Spyder的main.py并运行它会先给出错误QT Creator将ui转换为py在windows终端中工作,但不能与spyder一起工作IDE

An exception has occurred, use %tb to see the full traceback. 

SystemExit: -1 

然后,如果我尝试运行它第二次内核将挂起。

在spyder中成功运行此脚本需要什么?这里是代码:

from PyQt4 import QtCore, QtGui 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.UnicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName(_fromUtf8("MainWindow")) 
     MainWindow.resize(400, 300) 
     self.centralWidget = QtGui.QWidget(MainWindow) 
     self.centralWidget.setObjectName(_fromUtf8("centralWidget")) 
     self.horizontalLayout = QtGui.QHBoxLayout(self.centralWidget) 
     self.horizontalLayout.setMargin(11) 
     self.horizontalLayout.setSpacing(6) 
     self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) 
     self.pushButton = QtGui.QPushButton(self.centralWidget) 
     self.pushButton.setObjectName(_fromUtf8("pushButton")) 
     self.horizontalLayout.addWidget(self.pushButton) 
     MainWindow.setCentralWidget(self.centralWidget) 
     self.menuBar = QtGui.QMenuBar(MainWindow) 
     self.menuBar.setGeometry(QtCore.QRect(0, 0, 400, 21)) 
     self.menuBar.setObjectName(_fromUtf8("menuBar")) 
     MainWindow.setMenuBar(self.menuBar) 
     self.mainToolBar = QtGui.QToolBar(MainWindow) 
     self.mainToolBar.setObjectName(_fromUtf8("mainToolBar")) 
     MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar) 
     self.statusBar = QtGui.QStatusBar(MainWindow) 
     self.statusBar.setObjectName(_fromUtf8("statusBar")) 
     MainWindow.setStatusBar(self.statusBar) 

     self.retranslateUi(MainWindow) 
     QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), MainWindow.close) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) 
     self.pushButton.setText(_translate("MainWindow", "Close", None)) 


if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    MainWindow = QtGui.QMainWindow() 
    ui = Ui_MainWindow() 
    ui.setupUi(MainWindow) 
    MainWindow.show() 
    sys.exit(app.exec_()) 
+0

你是如何从Spyder运行它的?你只是从IDE内的控制台调用它? Spyder是否有办法启动外部流程? –

+0

我打开文件,然后按运行(f5)。我不确定你的第三个问题 – kaminsknator

回答

0

没有实际的回溯很难说。我猜这是两件事情之一,都与Spyder也建立在Qt上的事实有关。

  1. 您正尝试在Spyder环境中运行您的应用程序。您的应用尝试创建QApplication,但由于Spyder已在Qt上运行,因此QApplication已存在,并且存在错误。

  2. 不匹配的PyQt/Qt版本。我假设Spyder附带了它自己的Qt/PyQt版本,并且你不必安装它来运行Spyder。但我猜你也安装了你自己的Qt/PyQt版本,而PyQt正在加载错误的dll(与Spyder一起发布的,而不是你安装的)。

有些事情要检查:

  • 检查以确保您启动的是从Spyder的(即在一个新的Python程序一个全新的外壳)的外部程序,而不是简单地运行Spyder嵌入式Python进程中的代码。我不太了解Spyder知道如何做到这一点,但大多数IDE都有一些控制它如何启动外部进程的设置。

  • 从您启动的脚本检查PATH环境变量。在安装Qt之前可能会添加Spyder目录,导致Spyder Qt dll在导入PyQt时加载而不是系统安装的Qt。

+0

有趣,谢谢你的洞察力。在工具,首选项下运行,控制台有三个选项,唯一不起作用的是在当前的python或ipython控制台中执行。其他两个选项将允许脚本运行并显示窗口。 – kaminsknator

相关问题