关闭GUI应用程序时,Python意外退出

时间:2018-06-12 16:08:22

标签: python pyqt5

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

以下是环境:

  1. PyQt5 ver.5.10.1
  2. Python 3.6.4
  3. Mac OS Sierra
  4. 使用pip3安装PyQt5。

    以下是我正在使用的代码:

    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加载,菜单项(Actions)也按预期工作。

    当菜单项"退出"被称为app关闭以及python图标(来自系统托盘)。但是大约5-10秒之后,我不断收到一条消息说“#34; Python意外退出"。

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

    我在ABAP / 4和VB.Net上有编码经验,但就Python / PyQt的GUI编码而言,这是我的早期阶段。

    如果提供了潜在客户,我将不胜感激,以便我可以在我的新努力中取得进展。

    由于

2 个答案:

答案 0 :(得分:2)

问题非常简单:mnuQuit是一个不是类成员的变量,所以它不能被类的其他方法访问,而且我认为不必使用那行代码,只需要调用close()

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正确关闭。

答案 1 :(得分:0)

 def triggerAct(self, x):
    if x.text() == "Create New":
        print("Trigger Create New...")
    elif x.text() == " Quit":
        exit()

我认为 exit()可以正常使用。