了解Kivy Free Clock

时间:2019-07-08 14:20:37

标签: python kivy

我正在尝试制作一个带有节拍的节拍器,我得到了+,-,开始按钮和一个指向速度的标签。

当我单击开始按钮时,我运行:

self.event = Clock.schedule_interval(self.job, self.bpm)

启动计时器,但是有一些问题。

当我单击按钮时,计时器以kivy.Clock微小的明显延迟开始。Clock依赖于我读取的帧,而我应该使用“ Free 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

1 个答案:

答案 0 :(得分:0)

来自 here 文档:

<块引用>

默认时钟存在量化问题,因为帧仅在间隔内出现,并且任何预定的超时都不会在间隔内发生。

所以要解决这个问题,请使用“免费时钟”

  1. 使用配置选择时钟模式:
# set config options before other imports
from kivy.config import Config
Config.set('kivy', 'kivy_clock', 'free_all')

这里有四个选项:

<块引用>

当kivy_clock为default时,正常时钟ClockBase,它限制 对 maxfps 量化的回调 - 使用。

当 kivy_clock 为 interrupt 时,可中断时钟, ClockBaseInterrupt,它不限制对 maxfps 的任何回调 - 用来。回调将随时执行。

当 kivy_clock 为 free_all 时,可中断时钟, ClockBaseFreeInterruptAll,它不限制对 maxfps 在有免费事件的情况下,但在没有免费事件的情况下它会限制 事件到 fps 量化间隔 - 使用。

当 kivy_clock 为 free_only 时,可中断时钟, ClockBaseFreeInterruptAll,处理自由和正常事件 独立;正常事件受到 fps 限制,而免费事件则不受限制 使用。

  1. 调用 _free 方法版本:
Clock.schedule_interval_free(self.job, self.bpm)