【问题标题】:Python: decoupling code from PyQt5 UI CodePython:从 PyQt5 UI 代码中解耦代码
【发布时间】:2018-04-15 23:03:03
【问题描述】:

我正在使用 PyQt5 迈出第一步。我创建了一个简单的对话框“form_main”,只有一个菜单:“文件|退出”:

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 链接的注释时,它会中断。

任何提示我如何将菜单连接到功能?

【问题讨论】:

    标签: python pyqt5 decoupling


    【解决方案1】:

    您的代码有以下错误:

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

    • 在函数exit_action没有定义self的情况下,在类中每个方法的第一个属性是实例,按照惯例,它的名称是self,在这种情况下exit_action应该是小部件,为此,我们可以使用 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) 
    

    ma​​in.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_())
    

    【讨论】:

    • 哇,非常感谢。那行得通。看来我还有很多东西要学。我想接下来我要读的是 lambda。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多