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_())
Другие вопросы по тегам