我正在尝试制作一个带有节拍的节拍器,我得到了+,-,开始按钮和一个指向速度的标签。
当我单击开始按钮时,我运行:
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
答案 0 :(得分:0)
来自 here 文档:
<块引用>默认时钟存在量化问题,因为帧仅在间隔内出现,并且任何预定的超时都不会在间隔内发生。
所以要解决这个问题,请使用“免费时钟”
# 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 限制,而免费事件则不受限制
使用。
_free
方法版本:Clock.schedule_interval_free(self.job, self.bpm)