【问题标题】:Python exiting unexpectedly while closing GUI applicationPython 在关闭 GUI 应用程序时意外退出
【发布时间】:2018-06-12 16:08:22
【问题描述】:

我正在尝试编写一个简单的菜单驱动的 GUI 程序。

以下是环境:

  1. PyQt5 ver.5.10.1
  2. Python 3.6.4
  3. Mac OS Sierra

PyQt5 是使用 pip3 安装的。

这是我正在使用的代码:

from PyQt5.QtWidgets import (QMainWindow, QApplication,
                         QWidget, QPushButton, QAction)
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import pyqtSlot

class myApp(QMainWindow):

    def __init__(self):
        super().__init__()
        self.title = 'Some App'
        self.left = 10
        self.top = 10
        self.width = 480
        self.height = 260
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.statusBar()
        pkMenuBar = self.menuBar()
        mnuFile = pkMenuBar.addMenu("File")
        mnuFile.addAction("Create New")
        mnuQuit = QAction(QIcon("ico1.png"), " Quit", self)
        mnuQuit.setShortcut("Ctrl+Q")
        mnuQuit.setStatusTip("Quit Application")
        mnuFile.addAction(mnuQuit)

        mnuFile.triggered[QAction].connect(self.triggerAct)

        self.show()

    def triggerAct(self, x):
        if x.text() == "Create New":
            print("Trigger Create New...")
        elif x.text() == " Quit":
            mnuQuit.triggered.connect(self.close)

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    ex = myApp()
    sys.exit(app.exec_())

在执行代码时(使用 IDLE),GUI 加载和菜单项(操作)也按预期工作。

当菜单项“退出”被调用时,应用程序以及 python 图标(来自系统托盘)关闭。但大约 5-10 秒后,我不断收到一条消息“Python 意外退出”。

我一直在尝试使用可能的解决方案来解决问题。通过跟踪网络上的线索(如 sys.exit()、app.quit() ),但每次我面临相同的结果。

我有 ABAP/4 和 VB.Net 的编码经验,但就 Python/PyQt 上的 GUI 编码而言,这对我来说还处于早期阶段。

如果能提供线索,我将不胜感激,以便我可以在我的新工作中取得进展。

谢谢

【问题讨论】:

  • 这可能是因为您指定了退出代码(在 sys.exit() 中)。我不知道 app.exec_() 返回什么,但尝试将其从 exit 参数中提取出来。

标签: python pyqt5


【解决方案1】:

问题其实很简单:mnuQuit 是一个变量,不是类的成员,所以不能被类的其他方法访问,另外我觉得没必要用那行代码,直接调用@987654323 @:

def triggerAct(self, x):
    if x.text() == "Create New":
        print("Trigger Create New...")
    elif x.text() == " Quit":
        self.close()
        # mnuQuit.triggered.connect(self.close)

在 GUI 中调用 exit() 是不合适的,因为 GUI 必须释放内存,如果你调用 exit(),它不会给你时间去做。使用close(),GUI 会正确关闭。

【讨论】:

  • 我之前尝试过,但仅使用 self.close() 可以关闭表单,但应用程序没有关闭(即使表单从视图中消失,我也可以看到菜单项!!)。 Python也挂起(SPOD),我必须强制退出它。
  • @Pradep 除了 myApp 之外,您还打开了另一个窗口吗?
  • @Pradep 也不要使用 IDLE 来测试你的 GUI,它有局限性并且不能处理 GUI,我建议你在 CMD 中运行它。
  • 非常感谢使用 CMD 的建议。我从中得到的一个澄清(复制如下)。印刷行动呼吁运作良好。但是,当调用“Quit”时,会出现以下错误: Traceback(最近一次调用最后一次):文件“/Users/%$^%&*#@/codes/TestMenu.py”,第 56 行,在 triggerAct mnuQuit 中。触发.connect(self.close)NameError:名称'mnuQuit'未定义中止陷阱:6
  • @Pradep 你想要什么澄清?如果我的回答对你有帮助,别忘了标记为正确,如果你不知道怎么做,请查看tour,这是最好的感谢方式
【解决方案2】:
 def triggerAct(self, x):
    if x.text() == "Create New":
        print("Trigger Create New...")
    elif x.text() == " Quit":
        exit()

我认为 exit() 在您的情况下可以正常工作。

【讨论】:

    猜你喜欢
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多