使用 super() 覆盖 toga.Button

问题描述 投票:0回答:1

我是 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 行,在 main().main_loop() 文件“pp_packages oga pp.py”,第 619 行,在 main_loop self._impl 中。 main_loop() 文件“ pp_packages oga_winforms pp.py”,第 302 行,在 main_loop 中引发 self._exception 文件“ pp_packages oga_winforms pp.py”,第 277 行,在 _run_app self.create() 文件“ pp_packages oga_winforms pp.py”,第 148 行,在 create self.interface._startup() 文件“ pp_packages oga pp.py”中,第 641 行,在 _startup self.startup() 文件“ pp_packages oga pp.py”中,行654,在启动中 self.main_window.content = self._startup_method(self) 文件“ pp tt pp.py”,第 21 行,在构建中 button1 = ColorButton(“Hello world1”,on_press=button_handler) TypeError: init()收到意外的关键字参数“on_press”

虽然我希望看到两个具有类似行为的按钮。

有谁知道出了什么问题吗?任何建议将不胜感激!

问候, 本

oop button super toga
1个回答
0
投票

函数可以接受参数和关键字参数。
当您在参数前面加上

*
前缀时,函数可以接受参数列表,例如
*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)

但是,如果您不打算更改或添加任何内容到此方法,则覆盖它没有任何好处。你可以把它省略掉。

© www.soinside.com 2019 - 2024. All rights reserved.