如何指定要激活功能的按钮?

时间:2019-04-24 01:50:35

标签: python kivy

当我按下按钮时,将调用check_streak()函数。我只想将按钮时间(也称为“蜂蜜”)与time.time()进行比较。而不是打印对一个按钮“蜂蜜”的响应,而是比较每个按钮“蜂蜜”,并为每个按钮打印响应。由于按钮是在for循环中创建的,因此我不确定如何指定只比较该特定按钮。我该如何解决?代码:

class MainApp(App):

    def build(self): # build() returns an instance
        self.store = JsonStore("streak.json") # file that stores the streaks:


        return presentation

    # Gets the value of delta (code I may never understand lol)
    def item_generator(self, json_input, lookup_key):
        if isinstance(json_input, dict):
            for k, v in json_input.items():
                if k == lookup_key:
                    yield v
                else:
                    yield from self.item_generator(v, lookup_key)
        elif isinstance(json_input, list):
            for item in json_input:
                yield from self.item_generator(item, lookup_key)

    def check_streak(self, instance):
        with open("streak.json", "r") as read_file:
            data = json.load(read_file)
            values = self.item_generator(data, 'delta')



        for honey in values:
            if honey > time.time():
                print("early")

            if honey == time.time():
                print("on time")

            if honey < time.time():
                print("late")
def display_btn(self):
        # display the names of the streaks in a list on PageTwo
        for key in self.store:
            streak_button = Button(text=key, on_press=self.check_streak)
            self.root.screen_two.ids.streak_zone.add_widget(streak_button)

我目前在程序中有3个按钮。当我按下一个按钮时,我希望打印“早”,但我会打印“早早”,因为有3个按钮。

1 个答案:

答案 0 :(得分:0)

Kivy Widget » touch event bubbling

  

当您在多个小部件之间捕获触摸事件时,通常需要   了解这些事件的传播顺序。在   奇异果,事件从第一个孩子到另一个孩子   孩子们。如果小部件有子级,则事件将通过其   子,然后再传递给小部件。

Kivy » Touch event basics

  

默认情况下,触摸事件将分派给所有当前显示的事件   小部件。这意味着小部件会接收触摸事件,无论它是否发生   不在他们的物理区域内。

     

...

     

为了提供最大的灵活性,Kivy派遣了   所有小部件的事件,并让他们决定如何对它们做出反应。   如果您只想响应小部件内的触摸事件,则可以   只需检查:

def on_touch_down(self, touch):
    if self.collide_point(*touch.pos):
        # The touch has occurred inside the widgets area. Do stuff!
        pass

解决方案

  • 创建一个继承class CustomButton的{​​{1}}
  • 实施Button方法
  • 使用on_touch_down函数检查碰撞

摘要

collide_point()

示例

以下示例说明了建议的解决方案。

main.py

class CustomButton(Button):
    def on_touch_down(self, touch):
        if self.collide_point(*touch.pos):
            self.dispatch('on_press')
            return True
        return super(CustomButton, self).on_touch_down(touch)    
...

    def display_btn(self):
        # display the names of the streaks in a list on PageTwo
        with open("streak.json", "r") as read_file:
            data = json.load(read_file)

            for value in self.item_generator(data, 'delta'):
                print(f"\tvalue={value}")
                streak_button = CustomButton(text=str(value), on_press=self.check_streak)
            self.root.screen_two.ids.streak_zone.add_widget(streak_button)