Я пытаюсь сделать метроном с помощью kivy, у меня есть кнопка +, -, кнопка запуска и метка, которая относится к темпу.
Когда я нажимаю кнопку запуска, я запускаю:
self.event = Clock.schedule_interval(self.job, self.bpm)
, чтобы запустить мой таймер, однако есть некоторые проблемы.
Когда я нажимаю кнопку, таймер запускается с крошечной заметной задержкой, так как kivy.Clock опирается на кадры из того, что я прочитал, и я должен использовать «Свободно».Часы "вместо этого, но я не мог заставить его работать и не понимал, что я должен делать.
Вторая проблема - когда я планирую таймер, он запускается и продолжает работать с его начальным значением интервала, изменяя bpm.не будет изменять интервал текущего таймера, пока я не отменю и не перезапущу его.
Буду признателен за ваши идеи, чтобы найти способ обойти это.Мой код:
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.lang import Builder
from kivy.core.window import Window
from kivy.properties import StringProperty
from kivy.clock import Clock
Window.size = 320, 568
kv = Builder.load_file("test.kv")
class mainWindow(FloatLayout):
tempo = 60
bpm = 60/tempo
labelTempo = StringProperty(str(tempo))
interval = False
def startTimer(self, state):
if state == "startMtr" and self.interval == False:
self.event = Clock.schedule_interval(self.job, self.bpm)
elif state == "stop":
self.event.cancel()
def button(self, btn):
if btn == "+":
self.tempo += 1
self.labelTempo = str(self.tempo)
self.bpm = 60 / self.tempo
if btn == "-":
self.tempo -= 1
self.labelTempo = str(self.tempo)
self.bpm = 60 / self.tempo
if btn == "start":
self.startTimer("startMtr")
print("started")
if btn == "stop":
self.startTimer("stop")
print("stopped")
abc = 0
def job(self, dt):
self.abc += 1
print(self.abc)
print(App.get_running_app().root.bpm)
print(App.get_running_app().root.tempo)
class crApp(App):
def build(self):
return mainWindow()
if __name__ == '__main__':
crApp().run()
Kv файл:
<mainWindow>:
FloatLayout:
minus: minus
start: start
plus: plus
Button:
id: minus
text: "-"
size_hint: 0.3, 0.25
pos_hint: {"x": 0.0, "top": 0.4}
on_release:
root.button("-")
ToggleButton:
id: start
text: "start"
size_hint: 0.4, 0.25
pos_hint: {"x": 0.3, "top": 0.4}
on_press:
root.button("start") if start.state == "down" else root.button("stop")
Button:
id: plus
text: "+"
size_hint: 0.3, 0.25
pos_hint: {"x": 0.7, "top": 0.4}
on_release:
root.button("+")
Label:
id: tempo
text: root.labelTempo