对于一个项目,我使用Python 3和PyQt5创建GUI。因为它必须可以被我的直接团队以外的人使用,所以我想要禁用菜单上的操作,直到他们已经在程序的其他部分填写了某些表单(例如,当他们没有&#时禁用最终解决方案视图) 39; t设置初始数据连接)。问题是,当我尝试在创建它的函数之外调用QAction的setEnabled函数时(但仍然在整个类中),它导致我的脚本崩溃而没有错误代码,所以我和#39;我无法理解这个问题。在下面的片段中,我试图设置"查看解决方案"菜单选项为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_())
答案 0 :(得分:1)
问题是viewSolution是一个变量,但它不是该类的成员,因此您将无法通过自我实例访问它。一种可能的解决方案是使类的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()
函数,此函数返回发出信号的对象,使用以下内容:
def createNewProject(self):
print('Project Created')
self.sender().setEnabled(True)