Python 理解Kivy免费时钟

Python 理解Kivy免费时钟,python,kivy,Python,Kivy,我想用kivy做一个节拍器,我有+,-,开始按钮和一个指向节拍的标签 单击“开始”按钮时,我运行: self.event = Clock.schedule_interval(self.job, self.bpm) 但是,要启动计时器,存在一些问题 当我点击按钮时,计时器开始有微小的明显延迟,就像kivy一样。时钟依赖于我读到的帧,我应该使用“免费时钟”,但我无法让它工作,也不明白我应该做什么 第二个问题是,当我计划计时器启动并保持其初始间隔值时,更改bpm不会更改当前计时器的间隔,直到我取消并

我想用kivy做一个节拍器,我有+,-,开始按钮和一个指向节拍的标签

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

self.event = Clock.schedule_interval(self.job, self.bpm)
但是,要启动计时器,存在一些问题

当我点击按钮时,计时器开始有微小的明显延迟,就像kivy一样。时钟依赖于我读到的帧,我应该使用“免费时钟”,但我无法让它工作,也不明白我应该做什么

第二个问题是,当我计划计时器启动并保持其初始间隔值时,更改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
:
浮动布局:
减:减
开始:开始
加:加
按钮:
id:负号
正文:“-”
尺寸提示:0.3,0.25
pos_提示:{“x”:0.0,“top”:0.4}
发布时:
root.button(“-”)
切换按钮:
id:开始
正文:“开始”
尺寸提示:0.4,0.25
pos_提示:{“x”:0.3,“top”:0.4}
新闻界:
如果start.state==“down”,则root.button(“开始”),否则root.button(“停止”)
按钮:
身份证号码:加
正文:“+”
尺寸提示:0.3,0.25
pos_提示:{“x”:0.7,“top”:0.4}
发布时:
root.button(“+”)
标签:
id:节奏
文本:root.labelTempo
来自文档:

默认时钟受到量化问题的影响,因为帧仅在间隔上发生,并且在间隔期间无法发生任何计划的超时

因此,要想绕过这一点,请使用“免费时钟”

  • 使用配置选择时钟模式:
  • #在其他导入之前设置配置选项
    从kivy.config导入配置
    Config.set('kivy','kivy\u clock','free\u all')
    
    其中有四个选项:

    当kivy_时钟为默认值时,正常时钟为ClockBase,它限制 使用对maxfps量化的回调

    当kivy_时钟为中断时,为可中断时钟, ClockBaseInterrupt,它不限制对maxfps的任何回调- 使用。回调将在任何时候执行

    当kivy_时钟为空闲时,一个可中断时钟, ClockBaseFreeInterruptAll,它不限制对 存在自由事件时的maxfps,但如果没有自由事件,则限制maxfps 使用fps量化间隔-的事件

    当kivy_时钟仅可用时,可中断时钟, ClockBaseFreeInterruptAll,处理自由和正常事件 独立地;正常事件受fps限制,而自由事件不受fps限制 使用

  • 调用
    \u free
    方法版本:
  • Clock.schedule\u interval\u free(self.job,self.bpm)
    
    来自文档:

    默认时钟受到量化问题的影响,因为帧仅在间隔上发生,并且在间隔期间无法发生任何计划的超时

    因此,要想绕过这一点,请使用“免费时钟”

  • 使用配置选择时钟模式:
  • #在其他导入之前设置配置选项
    从kivy.config导入配置
    Config.set('kivy','kivy\u clock','free\u all')
    
    其中有四个选项:

    当kivy_时钟为默认值时,正常时钟为ClockBase,它限制 使用对maxfps量化的回调

    当kivy_时钟为中断时,为可中断时钟, ClockBaseInterrupt,它不限制对maxfps的任何回调- 使用。回调将在任何时候执行

    当kivy_时钟为空闲时,一个可中断时钟, ClockBaseFreeInterruptAll,它不限制对 存在自由事件时的maxfps,但如果没有自由事件,则限制maxfps 使用fps量化间隔-的事件

    当kivy_时钟仅可用时,可中断时钟, ClockBaseFreeInterruptAll,处理自由和正常事件 独立地;正常事件受fps限制,而自由事件不受fps限制 使用

  • 调用
    \u free
    方法版本:
  • Clock.schedule\u interval\u free(self.job,self.bpm)