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