Python: 从 PyQt5 解耦代码 UI 代码
Python: decoupling code from PyQt5 UI Code
我正在尝试使用 PyQt5。我创建了一个只有 1 个菜单的简单对话框 "form_main":"File|Quit":
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)
现在我想从另一个 class 访问此代码。在那个 class 中,我想定义一个在我单击 "File|Quit" 时调用的函数。在我写的第二个文件中:
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_())
这段代码正确地显示了我的对话框,但是当我删除我尝试 link "File|Quit" 菜单和函数 exit_action 的注释时,它中断了。
有什么提示可以将菜单连接到功能吗?
您的代码存在以下错误:
只能从 class 外部访问属性,在您的情况下 exit_action 不是,为了成为属性,您必须先于它自己。
在函数exit_action未定义自身的情况下,在classes中每个方法的第一个属性是实例,按照惯例给出self 的名称,在 exit_action 的情况下应该是小部件,为此我们可以使用 lambda 函数,但您还必须使用括号调用关闭函数。
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_())
我正在尝试使用 PyQt5。我创建了一个只有 1 个菜单的简单对话框 "form_main":"File|Quit":
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)
现在我想从另一个 class 访问此代码。在那个 class 中,我想定义一个在我单击 "File|Quit" 时调用的函数。在我写的第二个文件中:
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_())
这段代码正确地显示了我的对话框,但是当我删除我尝试 link "File|Quit" 菜单和函数 exit_action 的注释时,它中断了。
有什么提示可以将菜单连接到功能吗?
您的代码存在以下错误:
只能从 class 外部访问属性,在您的情况下 exit_action 不是,为了成为属性,您必须先于它自己。
在函数exit_action未定义自身的情况下,在classes中每个方法的第一个属性是实例,按照惯例给出self 的名称,在 exit_action 的情况下应该是小部件,为此我们可以使用 lambda 函数,但您还必须使用括号调用关闭函数。
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_())