Python3 PyQt5设置为启用导致崩溃的QAction

2024-04-30 06:02:11 发布

您现在位置:Python中文网/ 问答频道 /正文

对于一个项目,我使用python3和PyQt5创建一个GUI。因为它必须由我的直接团队以外的人使用,所以我想禁用菜单上的操作,直到他们已经在程序的其他部分填写了一些表单(例如,当他们没有设置初始数据连接时,禁用最终解决方案视图)。问题是,当我试图在创建QAction的函数之外(但仍在整个类内部)调用QAction的setEnabled函数时,会导致脚本崩溃,没有错误代码,因此我很难理解这个问题。在下面的snipit中,我试图将“视图解决方案”菜单选项设置为true。菜单里还有一些选项,但我把它们删掉了,这样更容易阅读。在

代码的结构如下:

import sys
from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication, QMessageBox, QStackedLayout


class MediaPlanner(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        # Menu bar example from: zetcode.com/gui/pyqt5/

        exitAction = QAction('&Exit', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Exit application')
        exitAction.triggered.connect(self.close)

        newProject = QAction('&New Project', self)
        newProject.setShortcut('Ctrl+N')
        newProject.setStatusTip('Start A New Project')
        newProject.triggered.connect(self.createNewProject)

        openProject = QAction('&Open Project',self)
        openProject.setShortcut('Ctrl+O')
        openProject.setStatusTip('Open A Saved Project')
        openProject.setEnabled(False)

        viewSolution = QAction('&View Solution',self)
        viewSolution.setStatusTip('View the Current Solution (If Built)')
        viewSolution.setEnabled(False)

        self.statusBar()

        menubar = self.menuBar()

        filemenu = menubar.addMenu('&File')
        filemenu.addAction(newProject)
        filemenu.addAction(openProject)
        filemenu.addAction(exitAction)

        viewmenu = menubar.addMenu('&View')
        viewmenu.addAction(viewSolution)

        self.setGeometry(300,300,700,300)
        self.setWindowTitle('Menubar')

        self.show()

    def createNewProject(self):
        print('Project Created')
        self.viewSolution.setEnabled(True)



if __name__ == '__main__':

    app = QApplication(sys.argv)
    gui = MediaPlanner()
    sys.exit(app.exec_())

Tags: selfprojectdefsys菜单openprojectnewprojectaddaction
1条回答
网友
1楼 · 发布于 2024-04-30 06:02:11

问题是viewSolution是一个变量,但它不是类的成员,因此您将无法通过self实例访问它。一种可能的解决方案是使viewSolution成为类的成员,如下所示:

self.viewSolution = QAction('&View Solution',self)
self.viewSolution.setStatusTip('View the Current Solution (If Built)')
self.viewSolution.setEnabled(False)
...
viewmenu.addAction(self.viewSolution)

另一个可能的解决方案是使用sender()函数,此函数返回发出信号的对象,方法如下:

^{pr2}$

相关问题 更多 >