こんにちわ
PythonのGUIに関する内容で質問です。
やりたいこと
1.GUIに関する記述を行ったクラスを継承したサブクラスで、ボタン等の処理内容を書きたい
2.上記の条件に加えて、サブ画面側からボタンを押してメイン画面の表示を変えたい
・今回の内容は [サブ画面でボタンを押す ⇒ メイン画面のラベル内容を変える] であり、GUIの部品名で書くと
[TestWindow(サブウィンドウ)のpushButtonを押す ⇒ TestMainWindow(メインウィンドウ)のTestLabelとTestLabelinFrameのテキストが変化]です。
GUIはQtDesignerで作成後、pyファイルに変換しています。
GUIメンテナンスの手間を考えて、ほとんどこのファイルをいじらずに継承とオーバーライドでどうにか済ませたいです。
作成したコード
python
1#ファイル名:TestStartUp.py 2 3#ファイル実行用 4import sys 5from PyQt5 import QtCore as Qc, QtGui as Qg, QtWidgets as Qw 6from PyQt5.QtCore import Qt 7 8from Controller.TestController import TestControll 9 10if __name__ == '__main__': 11 app = Qw.QApplication(sys.argv) 12 TestControll().showWindow()
python
1#ファイル名:TestController.py 2 3#画面の起動・終了をまとめるクラス 4import sys 5from PyQt5 import QtCore as Qc, QtGui as Qg, QtWidgets as Qw 6from PyQt5.QtCore import Qt 7from .screen import TestMainWindow, TestWindow_or, TestWindow 8 9class TestControll(Qw.QMainWindow): 10 # 初期設定 11 def __init__(self, parent=None): 12 super().__init__(parent) 13 print(self.__class__.__name__ + "のinit") 14 15 self.ui = TestMainWindow.Ui_MainWindow() 16 self.ui.setupUi(self) 17 18 #サブウィンドウ 19 self.test = Qw.QWidget() 20 21 #1.サブウィンドウを上書きする 22 self.test.ui = TestWindow_or.FormOverride() 23 self.test.ui.eventMethod(self.test, """問題点 入れる値がわからない""") 24 25 #2.サブウィンドウを上書きせずに表示する 26 #self.test.ui = TestWindow.Ui_Form() 27 #self.test.ui.setupUi(self.test) 28 29 # 画面起動用 30 def showWindow(self): 31 print(self.__class__.__name__ + "起動") 32 app = Qw.QApplication([]) 33 self.show() 34 self.test.show() 35 sys.exit(app.exec())
Python
1#ファイル名:TestWindow_or.py 2 3#画面情報を継承してイベントを埋め込むためのクラス 4from . import TestWindow 5 6class FormOverride(TestWindow.Ui_Form) : 7 def setupUi(self, From): 8 super().setupUi(From) 9 10 def eventMethod(self, Form, ui): 11 self.setupUi(Form) 12 #ここに上書き内容を記載 13 self.pushButton.clicked.connect(ui.TestLabel.setToolTip("A:サブ画面でクリックされました。")) 14 self.pushButton.clicked.connect(ui.TestLabelinFrame.setToolTip("B:サブ画面でクリックされました。"))
ここからはQt Designerで作成・変換したソース(GUI、画面構成)
python
1#ファイル名:TestMainWindw.py 2 3from PyQt5 import QtCore, QtGui, QtWidgets 4 5class Ui_MainWindow(object): 6 def setupUi(self, MainWindow): 7 MainWindow.setObjectName("MainWindow") 8 MainWindow.resize(510, 359) 9 self.centralwidget = QtWidgets.QWidget(MainWindow) 10 self.centralwidget.setObjectName("centralwidget") 11 self.TestFrame = QtWidgets.QFrame(self.centralwidget) 12 self.TestFrame.setGeometry(QtCore.QRect(20, 60, 321, 181)) 13 self.TestFrame.setFrameShape(QtWidgets.QFrame.StyledPanel) 14 self.TestFrame.setFrameShadow(QtWidgets.QFrame.Raised) 15 self.TestFrame.setObjectName("TestFrame") 16 self.TestLabelinFrame = QtWidgets.QLabel(self.TestFrame) 17 self.TestLabelinFrame.setGeometry(QtCore.QRect(20, 20, 151, 51)) 18 self.TestLabelinFrame.setObjectName("TestLabelinFrame") 19 self.TestLabel = QtWidgets.QLabel(self.centralwidget) 20 self.TestLabel.setGeometry(QtCore.QRect(30, 10, 121, 31)) 21 self.TestLabel.setObjectName("TestLabel") 22 MainWindow.setCentralWidget(self.centralwidget) 23 self.menubar = QtWidgets.QMenuBar(MainWindow) 24 self.menubar.setGeometry(QtCore.QRect(0, 0, 510, 17)) 25 self.menubar.setObjectName("menubar") 26 MainWindow.setMenuBar(self.menubar) 27 self.statusbar = QtWidgets.QStatusBar(MainWindow) 28 self.statusbar.setObjectName("statusbar") 29 MainWindow.setStatusBar(self.statusbar) 30 31 self.retranslateUi(MainWindow) 32 QtCore.QMetaObject.connectSlotsByName(MainWindow) 33 34 def retranslateUi(self, MainWindow): 35 _translate = QtCore.QCoreApplication.translate 36 MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) 37 self.TestLabelinFrame.setText(_translate("MainWindow", "B")) 38 self.TestLabel.setText(_translate("MainWindow", "A"))
python
1#ファイル名:TestWindow.py 2 3from PyQt5 import QtCore, QtGui, QtWidgets 4 5class Ui_Form(object): 6 def setupUi(self, Form): 7 Form.setObjectName("Form") 8 Form.resize(400, 300) 9 self.pushButton = QtWidgets.QPushButton(Form) 10 self.pushButton.setGeometry(QtCore.QRect(20, 20, 75, 23)) 11 self.pushButton.setObjectName("pushButton") 12 13 self.retranslateUi(Form) 14 QtCore.QMetaObject.connectSlotsByName(Form) 15 16 def retranslateUi(self, Form): 17 _translate = QtCore.QCoreApplication.translate 18 Form.setWindowTitle(_translate("Form", "Form")) 19 self.pushButton.setText(_translate("Form", "PushButton"))
ファイル構成
TestStartUp.py
Controller
| ∟ screen
| ∟TestMainWindow.py
| ∟TestWindow.py
| ∟TestWindow_or.py
∟TestController.py
問題点
問題となっている箇所は、TestControllerファイルのTestControllクラス内のself.test.ui.eventMethod・・・
この部分の2つ目の引数に、このクラス内にあるUIの情報を渡してeventMethod内でリンクさせるようにしたいのですが、
'self.ui'では[TypeError: argument 1 has unexpected type 'NoneType']と出てしまい、画面が立ち上がりませんでした。
試したこと
'TestController.py'ファイルの1.の内容2行ともコメントアウトして、その下の2.の内容を有効にしたところ画面は起動しました。
もちろん、イベント等入っていないので動作はありません。
補足情報(FW/ツールのバージョンなど)
QtDesigner 5.9.5
Python 3.6.5
PyQt5-5.11.2
PyCharm 2018.2.1

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。