QT Creator将ui转换为py工作在windows终端但不使用spyder IDE

时间:2016-09-16 15:46:24

标签: python user-interface pyqt pyqt4 spyder

我正在学习使用QT creator和python制作基本GUI的教程。我已经成功创建了一个窗口,其中有一个按钮可以在按下时关闭窗口。它在QT Creator中工作正常,我将ui文件转换为py,当我打开命令提示符窗口并用python main.py调用它时,它会按预期运行并创建窗口。我喜欢在spyder IDE中工作,并希望继续这样做。问题是,如果我在spyder中打开main.py并运行它将首先给出错误

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

1 个答案:

答案 0 :(得分:0)

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

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

  2. PyQt / Qt版本不匹配。我假设Spyder附带了它自己的Qt / PyQt版本,你没有必要安装它来运行Spyder。但我猜你也安装了自己的Qt / PyQt版本,PyQt正在加载错误的dll(Spyder附带的那些而不是你安装的那些)。

  3. 要检查的一些事项:

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

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