我是 Python 新手,为了了解有关 OOP 的更多信息,我想创建一个基于 toga.Button 的新按钮类。我使用了 Toga 网站上的示例(https://toga.readthedocs.io/en/stable/tutorial/tutorial-0.html),并基于 toga.Button 类添加了一个新类。最初,我希望该派生类的行为与原始类相同。但是,运行代码时出现错误。
代码如下:
import toga
def button_handler(widget):
print("hello")
class ColorButton(toga.Button):
def init(self, *args):
super().init(*args)
def on_press(self, *args, **kwargs):
super().on_press(*args, **kwargs)
def build(app):
box = toga.Box()
button = toga.Button("Hello world", on_press=button_handler)
button.style.padding = 50
button.style.flex = 1
box.add(button)
button1 = ColorButton("Hello world1", on_press=button_handler)
button1.style.padding = 50
button1.style.flex = 1
box.add(button1)
return box
def main():
return toga.App("First App", "org.beeware.toga.tutorial", startup=build)
if name == "main":
main().main_loop()
运行代码出现以下错误:
回溯(最近一次调用):文件“pp tt_main_.py”,第 4 行,在
虽然我希望看到两个具有类似行为的按钮。
有谁知道出了什么问题吗?任何建议将不胜感激!
问候, 本
函数可以接受参数和关键字参数。
当您在参数前面加上
*
前缀时,函数可以接受参数列表,例如*args
,就像你已经做的那样。该变量将保存收集到的参数的元组。**
前缀时,函数可以采用关键字参数,例如**kwargs
。该变量将保存一个包含键及其关联值的字典(在您的情况下为 "on_press"
和 button_handler
)。
这同样适用于解包:带有 *
的元组和带有 **
的字典。
因此,您当前的
ColorButton.__init__
方法仅接受参数,没有关键字参数。它不能接受争论。如果是,则这些值不会与 args
元组中的键关联。
因此只需将
**kwargs
添加到您的 ColorButton.__init__
方法中即可:
class ColorButton(toga.Button):
def init(self, *args, **kwargs):
super().init(*args, **kwargs)
但是,如果您不打算更改或添加任何内容到此方法,则覆盖它没有任何好处。你可以把它省略掉。