基于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
相关产品推荐
相关产品推荐

