用可变定时器循环

时间:2019-07-05 13:43:37

标签: python kivy

我试图用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>不太清楚为什么。

1 个答案:

答案 0 :(得分:1)

问题2-事件时间间隔不变

  

Clock.schedule_interval仍保持其第一个值。

解决方案

  • 实施新方法event_cancel_restart()来取消并重新启动事件
  • 每当bpm增大或减小时调用新方法

问题1-访问类属性

解决方案

超出范围-访问另一个类的类属性

要访问在类之外的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()