Python:从PyQt5 UI代码中解耦代码

时间:2018-04-15 23:03:03

标签: python pyqt5 decoupling

我正在使用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 个答案:

答案 0 :(得分:2)

您的代码有以下错误:

  • 只有属性可以从类外部访问,在你的情况下,exit_action不是,为了成为一个你必须在它之前的属性。

  • 在函数exit_action的情况下没有定义self,在类中,每个方法的第一个属性是实例,按照惯例给出self的名称,在这种情况下exit_action应该是widget,为此,我们可以使用lambda函数,但您还必须使用括号调用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_())