Python: отделение кода от кода PyQt5 UI
Я делаю свои первые шаги с PyQt5. Я создал простой диалог "form_main" только с 1 меню: "Файл | Выход":
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction
from PyQt5.QtGui import QIcon
class GUI(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('MyApp')
self.resize(400, 300)
self.statusBar().showMessage('Welcome')
self.add_menus()
def add_menus(self):
menubar = self.menuBar()
file_menu = menubar.addMenu('&File')
exit_action = QAction('&Quit', self)
file_menu.addAction(exit_action)
Теперь я хочу получить доступ к этому коду из другого класса. В этом классе я хочу определить функцию, которая вызывается, когда я нажимаю "Файл | Выход". Во втором файле я написал:
from frm_main import GUI
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication
def exit_action():
self.close
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = GUI()
# ui.exit_action.triggered.connect(exit_action)
ui.show()
sys.exit(app.exec_())
Этот код правильно показывает мой диалог, но когда я удаляю комментарий, в котором я пытаюсь связать меню "Файл | Выход" с функцией exit_action, он прерывается.
Любой намек, как я могу подключить меню к функции?
1 ответ
В вашем коде есть следующие ошибки:
только атрибуты могут быть доступны извне класса, в вашем случае exit_action - нет, чтобы быть атрибутом, вы должны предшествовать ему самостоятельно.
в случае функции exit_action не определена self, в классах первым атрибутом каждого метода является экземпляр, которому по соглашению присваивается имя self, в случае exit_action должен быть виджет, для этого мы можем использовать лямбда-функция, но вы также должны вызывать функцию close, используя скобки.
frm_main.py
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction
from PyQt5.QtGui import QIcon
class GUI(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('MyApp')
self.resize(400, 300)
self.statusBar().showMessage('Welcome')
self.add_menus()
def add_menus(self):
menubar = self.menuBar()
file_menu = menubar.addMenu('&File')
self.exit_action = QAction('&Quit', self)
file_menu.addAction(self.exit_action)
main.py
from frm_main import GUI
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication
def exit_action(widget):
widget.close()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = GUI()
ui.exit_action.triggered.connect(lambda: exit_action(ui))
ui.show()
sys.exit(app.exec_())