【问题标题】:Kivy: bind two methods to be called one after the otherKivy:绑定两个方法一个接一个地被调用
【发布时间】:2017-04-10 20:02:11
【问题描述】:

我有一个 C 类,有两个方法,a 和 b,我希望其中一个 (b) 总是在另一个 (a) 之后调用

class C(Widget) :
 def __init__(self) :
  super(C, self).__init__() 
  self.bind(a=self.b)  # something like this 
 def a(self) : pass
 def b(self) : pass

怎么样?

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    从a调用b怎么样。

    def a(self) :
        #some code
        self.b()
    

    【讨论】:

    • 没有。因为 C 的每个实例都会覆盖 a。这就是我使用它的方式。而b的存在,也得藏在窗帘后面。
    • @MatiasMorant 你需要在你的问题更具体。
    • 使用kivy,你可以这样做(如果self是一个Button):self.bind(on_release=another_function),这意味着another_function将在函数on_release之后调用,这是一个事件。我想要的是同样的行为,但不是使用像 on_release 这样的预定义方法,而是使用我自己的方法
    • 是的,我已经读过了。但是,如果我像绑定任何其他两个 kivy 事件一样绑定我的两个方法,它就不起作用。我尝试使用 register_event_type() 将我的方法 a 注册为事件,但它也不起作用
    【解决方案2】:

    我不太记得为什么它不能通过绑定来工作,但我认为这与使用不同的对象有关,例如绑定到未执行的旧方法或某种意义上的东西。

    这就是super() 来救援的地方。你看,super() 不仅仅是调用你继承的类的__init__(),它还有其他用途。

    我刚刚将__init__() 替换为<overridden method>()

    from kivy.base import runTouchApp
    from kivy.uix.button import Button
    
    class MyBase(Button):
        def overridden(self, *args):
            self.stable()
    
        def stable(self, *args):
            print('stable')
    
    class MyButton(MyBase):
        def __init__(self, **kwargs):
            super(MyButton, self).__init__(**kwargs)
            self.bind(on_release=self.overridden)
    
        def overridden(self, *args):
            # run before overriden stuff
            super(MyButton, self).overridden()
    
            print('new overridden')
    
            # run after overridden stuff
            super(MyButton, self).overridden()
    runTouchApp(MyButton())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-08
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      相关资源
      最近更新 更多