我试图用Kivy制作一个简单的节拍器应用程序,但是遇到了一些困难。我有一个bpm变量,可以使用+
和-
按钮进行控制。我可以更改bpm,但是Clock.schedule_interval
仍然保持其第一个值。
python
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 ObjectProperty
from kivy.properties import StringProperty
from kivy.clock import Clock
Window.size = 320, 568
kv = Builder.load_file("test.kv")
def job(dt):
print("hello world")
print(mainWindow.bpm)
class mainWindow(FloatLayout):
tempo = 60
bpm = 60/tempo
labelTempo = StringProperty(str(tempo))
event = Clock.schedule_interval(job, bpm )
def button(self, btn):
if btn == "+":
mainWindow.tempo += 1
self.labelTempo = str(self.tempo)
mainWindow.bpm = 60/self.tempo
if btn == "-":
mainWindow.tempo -= 1
self.labelTempo = str(self.tempo)
mainWindow.bpm = 60/self.tempo
class crApp(App):
def build(self):
return mainWindow()
if __name__ == '__main__':
crApp().run()
Kv文件
<mainWindow>:
FloatLayout:
Button:
id: minus
text: "-"
size_hint: 0.3, 0.25
pos_hint: {"x": 0.0, "top": 0.4}
on_press: root.button("-")
ToggleButton:
id: start
text: "start"
size_hint: 0.4, 0.25
pos_hint: {"x": 0.3, "top": 0.4}
Button:
id: plus
text: "+"
size_hint: 0.3, 0.25
pos_hint: {"x": 0.7, "top": 0.4}
on_press: root.button("+")
Label:
id: tempo
text: root.labelTempo
尝试使用变量更新Label文本时也遇到很多问题,但现在看来工作正常,除非我做了print(mainWindow.labelTempo)
,但我<StringProperty name=labelTempo>
不太清楚为什么。
答案 0 :(得分:1)
Clock.schedule_interval仍保持其第一个值。
event_cancel_restart()
来取消并重新启动事件bpm
增大或减小时调用新方法要访问在类之外的class mainWindow()
中声明的类属性,
App.get_running_app()
获取该应用的实例root
获取根的实例def job(dt):
print("hello world")
print(App.get_running_app().root.bpm)
要访问在class mainWindow()
中声明的类属性,必须使用self.xyz
。将所有出现的mainWindow.xyz
替换为self.xyz
mainWindow.tempo
替换为self.tempo
mainWindow.bpm
替换为self.bpm
def button(self, btn):
if btn == "+":
self.tempo += 1
self.labelTempo = str(self.tempo)
self.bpm = 60 / self.tempo
self.event_cancel_restart()
if btn == "-":
self.tempo -= 1
self.labelTempo = str(self.tempo)
self.bpm = 60 / self.tempo
self.event_cancel_restart()
def event_cancel_restart(self):
self.event.cancel()
self.event()