2017-07-21 13 views
1

プロジェクトでは、Python 3とPyQt5を使用してGUIを作成しています。私のチームの外にいる人が使用できる必要があるため、プログラムの他の部分で既にいくつかのフォームに記入するまで、メニューのアクションを無効にしたい(たとえば、最終的なソリューションビューが設定されていないときに無効にする初期データ接続を開始する)。問題は、QActionのsetEnabled関数を作成した関数の外で呼び出すと(しかし全体のクラスの中でも)、スクリプトがエラーコードなしでクラッシュするため、問題を理解できません。下のスナイピットでは、「ソリューションの表示」メニューオプションをtrueに設定しようとしています。このメニューにはいくつかのオプションがありますが、ここを削除して読みやすくしています。Python3 PyQt5がクラッシュの原因となるQActionのsetEnabled

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_()) 

答えて

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) 
+0

ありがとうございました! –