Python 自定义小部件触发另一个自定义小部件';s关于触地事件

Python 自定义小部件触发另一个自定义小部件';s关于触地事件,python,kivy,kivy-language,Python,Kivy,Kivy Language,每当我按下MyWidget中的任何区域时,它就会触发MyWidget类中的第一个MyButton的on\u touch\u down事件。 我是新来的基维,不明白为什么会这样 <MyButton@Button>: background_normal: '' background_color: [1,0,1,1] font_size: "44dp" color:[1,1,0,1] border:(1,1,1,1) text_size:self.size <

每当我按下
MyWidget
中的任何区域时,它就会触发
MyWidget
类中的第一个
MyButton
的on\u touch\u down事件。 我是新来的基维,不明白为什么会这样

<MyButton@Button>:
  background_normal: ''
  background_color: [1,0,1,1]
  font_size: "44dp"
  color:[1,1,0,1]
  border:(1,1,1,1)
  text_size:self.size

<MyWidget@Widget>:
  id:customwidget
  canvas.before:
    Color:
      rgba:0.2,0.44,0.66,1
    Rectangle:
      pos:self.pos
      size:self.size

<MyLayout>:
  MyWidget:
    id:mywidget

  MyButton:
    id:button1
    text: "User Name"
    spacing: "10dp"
    on_touch_down: button1.text= self.text + "?"
    opacity: .8

  MyButton:
    text: "ikinci"
    on_touch_down: root.export_to_png("filename.png")
  MyButton:
    text: "ucuncu"
Python代码
  • 创建一个
    类MyButton()
    并实现
    on\u touch\u down()
  • 代码片段-Python代码 kv文件
  • 将动态类重命名为类规则,
  • MyButton:
  • Snippet-kv文件 输出

    触摸屏上的
    事件并不特定于任何小部件,而是传播到所有小部件。看。如果您只希望您的
    按钮
    做出响应,您可能希望在按下事件时使用
    ,或在释放事件时使用
    (请参阅)。

    感谢您的回答,但此按钮只运行一次,我可以使用id进行比较吗?您不能使用
    ids
    进行比较,因为它的值仅在
    kv文件
    和字典类型中有效,
    self.ids['button1']
    或'self.ids.button1'。
    import kivy
    from kivy.app import App
    from kivy.uix.boxlayout import BoxLayout
    from kivy.uix.button import Button
    from kivy.uix.widget import Widget
    
    class MyLayout(BoxLayout):
        pass
    
    class KivyApp(App):
        def build(self):
            return MyLayout()
    
    if __name__ == "__main__":
        KivyApp().run()
    
    class MyButton(Button):
    
        def on_touch_down(self, touch):
            if self.collide_point(*touch.pos):
                print("\tMyButton.on_touch_down:")
                if self.text == 'User Name':
                    self.text= self.text + "?"
                elif self.text == 'ikinci':
                    App.get_running_app().root.export_to_png("filename.png")
                return True
            return super(MyButton, self).on_touch_down(touch)
    
    <MyButton>:
        background_normal: ''
        background_color: [1,0,1,1]
        font_size: "44dp"
        color:[1,1,0,1]
        border:(1,1,1,1)
        text_size:self.size
    ...
        MyButton:
            id:button1
            text: "User Name"
            spacing: "10dp"
            opacity: .8
    
        MyButton:
            text: "ikinci"
    
        MyButton:
            text: "ucuncu"
    
    def on_touch_down(self, touch):
        if self.collide_point(*touch.pos):
            # The touch has occurred inside the widgets area. Do stuff!
            pass