【问题标题】:QT Creator converted ui to py working in windows terminal but not working with spyder IDEQT Creator 将 ui 转换为 py 在 windows 终端中工作,但不能与 spyder IDE 一起工作
【发布时间】:2017-01-24 22:03:06
【问题描述】:

我正在学习使用 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_())

【问题讨论】:

  • 你是如何从 Spyder 运行它的?您只是从 IDE 内的控制台调用它吗? Spyder 有办法启动外部进程吗?
  • 我正在打开文件,然后按运行 (f5)。我不确定你的第三个问题

标签: python user-interface pyqt pyqt4 spyder


【解决方案1】:

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

  1. 您正在尝试在 Spyder 环境中运行您的应用程序。您的应用尝试创建 QApplication,但因为 Spyder 已经在 Qt 上运行,所以 QApplication 已经存在并且它会出错。

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

需要检查的一些事项:

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

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

【讨论】:

  • 有趣,感谢您的洞察力。在工具、首选项、运行下,控制台有三个选项,唯一不起作用的是在当前 python 或 ipython 控制台中执行。其他两个选项将允许脚本运行并出现窗口。
猜你喜欢
  • 1970-01-01
  • 2020-02-13
  • 2023-01-02
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-20
相关资源
最近更新 更多