You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于toga.Button重写子类时使用super()报错的问题求助

基于toga.Button重写子类时使用super()报错的问题求助

嘿兄弟,我瞅了下你的代码,问题其实出在几个容易踩的小细节上,都是Python类继承里的新手坑:

首先,Python里的类构造函数是__init__(前后各两个下划线),你写成init了!这就导致你的ColorButton根本没触发正确的父类构造逻辑——Python会把这个init当成普通的自定义方法,而非构造函数。当你实例化ColorButton时,父类的构造流程没被正确调用,自然就会报错。

然后说on_press的问题:Toga里的on_press是回调属性,不是类方法!你直接重写on_press方法的思路就错了。如果你只是想继承父类的原有点击行为,这个方法完全可以删掉,父类自己的回调机制会正常工作。

给你改好的代码,你直接试试:

import toga

def button_handler(widget):
    print("hello")

class ColorButton(toga.Button):
    # 注意构造函数是前后双下划线的__init__
    def __init__(self, *args, **kwargs):
        # 正确调用父类的构造函数
        super().__init__(*args, **kwargs)

# 不需要重写on_press方法,Toga的回调机制会自动处理传入的on_press参数

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 world", 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.firstapp", build=build)

if __name__ == "__main__":
    main().main_loop()

另外再给你提个小建议:如果之后想给ColorButton加自定义点击逻辑(比如在原有回调前后加自己的操作),可以在构造函数里先把传入的on_press回调保存下来,然后定义一个内部的处理函数,先执行自己的逻辑,再调用保存的原回调,反过来也可以。

应该这样改完就能正常运行了,你试试看!

备注:内容来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 09:44:33