Цикл с переменным таймером - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь создать простое приложение с метрономом, но у меня возникли некоторые трудности.У меня есть переменная 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 file

<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

Также было много проблем при попытке обновить текст метки с помощью переменной, но теперь она работает нормально, за исключением случаев, когда я набрал print(mainWindow.labelTempo), но я получаю <StringProperty name=labelTempo>, но не совсем уверен, почему.

1 Ответ

1 голос
/ 05 июля 2019

Проблема 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...