当我按下按钮时,将调用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个按钮。
答案 0 :(得分:0)
Kivy Widget » touch event bubbling
当您在多个小部件之间捕获触摸事件时,通常需要 了解这些事件的传播顺序。在 奇异果,事件从第一个孩子到另一个孩子 孩子们。如果小部件有子级,则事件将通过其 子,然后再传递给小部件。
默认情况下,触摸事件将分派给所有当前显示的事件 小部件。这意味着小部件会接收触摸事件,无论它是否发生 不在他们的物理区域内。
...
为了提供最大的灵活性,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()
以下示例说明了建议的解决方案。
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)