Связывание кнопок - событие on_press / on_release
Как я могу связать функцию my_callback с событием кнопки
Решение - Событие on_press кнопки
Следующеефрагменты показывают, как связать событие on_press
с обратным вызовом.
Snippets - файл kv
Button:
text: 'Invoke method'
on_press: root.btn_callback(self)
Snippets - файл py
def btn_callback(self, instance):
print(f"\nButton.text={instance.text}")
Использование Kivy Clock - вызов метода callback ()
При использовании Объект Kivy Clock Чтобы запланировать вызов метода без использования функции lambda
, необходимо объявить позиционный аргумент, dt
(означает delta-time).
Snippets
def my_callback(dt):
print(dt)
Clock.schedule_interval(my_callback, 1) # call callback every 1 second
или
def my_callback():
print("my_callback called")
Clock.schedule_interval(lambda dt: callback(), 1) # call callback every 1 second
Пример
В следующем примере показано отображение счетчика, определенного как атрибут класса.
main.py
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.clock import Clock
from kivy.properties import NumericProperty
from kivy.lang import Builder
Builder.load_string("""
<MainWindow>:
Label:
id: tet
font_size: sp(50)
Button:
text: 'Invoke method'
on_press: root.btn_callback(self)
""")
class MainWindow(BoxLayout):
count = NumericProperty(0)
def __init__(self, **kwargs):
super().__init__(**kwargs)
Clock.schedule_interval(self.my_callback, 1)
def my_callback(self, dt):
print(f"my_callback is called: count={self.count}, dt={dt}")
self.count += 1
if self.count == 10:
self.ids.tet.text = str(self.count)
def btn_callback(self, instance):
print(f"\nButton.text={instance.text}\n")
class TestApp(App):
def build(self):
return MainWindow()
if __name__ == "__main__":
TestApp().run()
Выход
![Result](https://i.stack.imgur.com/Qv0MP.png)