Понимание Kivy Free Clock - PullRequest
1 голос
/ 08 июля 2019

Я пытаюсь сделать метроном с помощью 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...