gpt4 book ai didi

python - 在 python 中编写模块化代码

转载 作者:行者123 更新时间:2023-11-28 17:32:54 28 4
gpt4 key购买 nike

您好,我有一个简单的 GUI,如下所示,带有 2 个按钮。我编写了一种方法,可以在单击按钮后更改按钮上的文本。我想使该方法模块化和通用,以便将该方法应用于任何按钮而无需重写。在下面的示例中,如何在不为按钮 2 定义新方法的情况下将 printWow() 方法应用于它?

import sys
from PyQt4.Qt import *

class MainWindow(QMainWindow):
def __init__(self, *args):
QMainWindow.__init__(self, *args)
self.cw = QWidget(self)
self.setCentralWidget(self.cw)
self.btn1 = QPushButton("Click me", self.cw)
self.btn1.setGeometry(QRect(50, 50, 100, 30))
self.btn1.clicked.connect(self.printWow)

self.btn2 = QPushButton("Click me", self.cw)
self.btn2.setGeometry(QRect(50, 20, 100, 30))
self.btn2.clicked.connect(self.printWow)

def printWow(self):
self.btn1.setText("WoW")

if __name__ == "__main__":
app = QApplication(sys.argv)
myapp = MainWindow()
myapp.show()
sys.exit(app.exec_())

最佳答案

基本上,使函数“更通用”意味着识别不同用例中的变体和不变性。在您的示例中,变体将是您要对其调用 setText() 的对象,最终是文本本身,因此您的“通用”函数看起来像:

def printText(self, target, text="wow"):
target.setText(text)

然后,由于您不能将这些参数传递给 connect()(好吧,为了我们的示例,至少让我们假设是这种情况),您需要将对通用函数的引用包装在一起和参数,可以在没有参数的情况下调用。这是“部分评估”的一个例子,在最简单的形式中,它只需要一个 lambda:

class MainWindow(QMainWindow):
def __init__(self, *args):
QMainWindow.__init__(self, *args)
self.cw = QWidget(self)
self.setCentralWidget(self.cw)
self.btn1 = QPushButton("Click me", self.cw)
self.btn1.setGeometry(QRect(50, 50, 100, 30))
self.btn1.clicked.connect(lambda: self.printWow(self.btn1))

self.btn2 = QPushButton("Click me", self.cw)
self.btn2.setGeometry(QRect(50, 20, 100, 30))
self.btn2.clicked.connect(lambda: self.printText(self.btn2, "Yay!"))

def printText(self, target, text="wow"):
target.setText(text)

请注意,在上面的示例中,您不会从额外的复杂性中获益太多 - 您也可以将所有内容都放在 lambda 中,即:

self.btn1.clicked.connect(lambda: self.btn1.setText("Wow"))
self.btn2.clicked.connect(lambda: self.btn2.setText("Yay !"))

但我假设你有更复杂的想法......

既然您提到了“模块化”(至少在您的标题中),“模块化”代码的真正关键不一定(或至少不仅)分解出通用代码,而且主要是将代码很好地拆分解耦的模块,每个模块都有明确和不同的职责。一个典型的例子是将 UI 代码与“域”代码分开 - 执行实际工作的代码甚至根本不知道 UI 的存在......

关于python - 在 python 中编写模块化代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33079933/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com