Я делаю секундомер для одной части моего приложения, используя kivy.clock, но он выдает ошибку атрибута

#python #android #kivy #kivy-language

Вопрос:

В моем приложении есть несколько окон, и «Трекер» — одно из них. На трекере будет отображаться секундомер, и он будет отслеживать потраченное время, вводя общее время в конце в базу данных. (Я еще не закодировал часть базы данных. Я просто печатаю общее время в консоли на данный момент).

По какой-то причине я продолжаю сталкиваться с ошибкой атрибута.

Код для класса трекера:

 class Tracker(Screen):
    time = 0
    start = False

    def start_stop(self):
        self.root.ids.start_stop_btn.text = ('Start'
                                         if self.start else 'Stop')
        self.start = not self.start
        Clock.schedule_interval(self.add_time, 1)

    def add_time(self, *args):
        while self.start:
            self.root.ids.sec_ones.text = str(int(self.root.ids.sec_ones.text)   1)
            if self.root.ids.sec_ones.text == '10':
                self.root.ids.sec_tens.text = str(int(self.root.ids.sec_tens.text)   1)
                self.root.ids.sec_ones.text = '0'
                if self.root.ids.sec_tens.text == '6':
                    self.root.ids.minute_ones.text = str(int(self.root.ids.minute_ones.text)   1)
                    self.root.ids.sec_tens.text = '0'
                    if self.root.ids.minute_ones.text == '10':
                        self.root.ids.minute_ones.text = '0'
                        self.root.ids.minute_tens.text = str(int(self.root.ids.minute_tens.text)   1)
            self.time  = 1
        print(self.time)
 

И класс трекера в файле kv:

 <Tracker>:

    name: "Tracker"
    Label:
        text: "Timer: "
        font_size: 50
        pos_hint: {'x': 0.1, 'top': 1}
        size_hint: 0.2, 0.2

    Label:
        id: minute_tens
        text: '0'
        pos_hint: {'x': 0.36, 'top': 0.99}
        font_size: 40
        size_hint: 0.1, 0.2
        canvas.before:
            Color:
                rgba: (0.349, 0.349, 0.349, 1)
            Rectangle:
                pos: self.pos
                size: self.size

    Label:
        id: minute_ones
        text: '0'
        pos_hint: {'x': 0.47, 'top': 0.99}
        font_size: 40
        size_hint: 0.1, 0.2
        canvas.before:
            Color:
                rgba: (0.349, 0.349, 0.349, 1)
            Rectangle:
                pos: self.pos
                size: self.size

    Label:
        text: ':'
        pos_hint: {'x': 0.59, 'top': 0.99}
        font_size: 40
        size_hint: 0.05, 0.2

    Label:
        id: sec_tens
        text: '0'
        pos_hint: {'x': 0.65, 'top': 0.99}
        font_size: 40
        size_hint: 0.1, 0.2
        canvas.before:
            Color:
                rgba: (0.349, 0.349, 0.349, 1)
            Rectangle:
                pos: self.pos
                size: self.size

    Label:
        id: sec_ones
        text: '0'
        pos_hint: {'x': 0.76, 'top': 0.99}
        font_size: 40
        size_hint: 0.1, 0.2
        canvas.before:
            Color:
                rgba: (0.349, 0.349, 0.349, 1)
            Rectangle:
                pos: self.pos
                size: self.size

    Button:
        id: start_stop_btn
        text: 'Start'
        pos_hint: {'x': 0.6, 'top': 0.77}
        size_hint: 0.1, 0.06
        on_release: root.start_stop()

    SmoothButton:
        text: "Back"
        pos_hint: {'x': 0.8, 'top': 0.15}
        size_hint: 0.15, 0.05
        on_release:
            app.root.current = "HomePage"
            root.manager.transition.direction = "right"
 

Ошибка выглядит так:
ошибка

Само приложение запускается. Ошибка возникает только после нажатия кнопки «Пуск».

Ответ №1:

единственный класс, имеющий корень, — это App класс, поэтому у трекера там нет корневого атрибута

в start_stop методе удалите «корень» , как в следующем

 def start_stop(self):
        self.ids.start_stop_btn.text = ('Start'
                                         if self.start else 'Stop')