Киви: Не может ссылаться на атрибут файла .kv - PullRequest
0 голосов
/ 21 октября 2018

Я использую Python 3.7 и Kivy 1.10.1.Я не могу понять это.Я пытаюсь добавить анимацию метки (в конце концов, кнопки) в Kivy.Но я продолжаю получать:

AttributeError: 'IntroScreen' object has no attribute 'lbl'

class IntroScreen(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.animate()

    def animate(self):
        anim = Animation(opacity=0, duration=3)
        anim.start(self.lbl)

class MainScreen(GridLayout, Screen):
    pass

class AnotherScreen(GridLayout, Screen):
    pass

class ScreenManagement(ScreenManager):
    pass

presentation = Builder.load_file("blank.kv")

class SimpleKivy(App):
    def build(self):
        self.title = "woods"
        return presentation

if __name__ == '__main__':
    SimpleKivy().run()

И соответствующая часть моего файла .kv выглядит так:

# File name: text_game.py
#: import FadeTransition kivy.uix.screenmanager.FadeTransition

ScreenManagement:
    transition: FadeTransition()
    IntroScreen:
    MainScreen:
    AnotherScreen:

<CustButton@Button>:
    font_size: 50
    font_name: "silly"
    color: 0,1,0,1

<IntroScreen>:
    lbl: lbl

    canvas.before:
        Rectangle:
            size: 20, 20
            source: "cabin.png"

    Label:
        id: lbl
        text: "Howdy"

Любая помощь будет принята с благодарностью.Я не понимаю, почему он не находит атрибут lbl в файле .kv.Заранее спасибо!

1 Ответ

0 голосов
/ 21 октября 2018

При компиляции .kv необходимо использовать базовые классы, объявленные в .py, перед добавлением свойств, указанных в .kv, так что в этот момент будет вызван метод animate(), гдепопробуйте использовать lbl, и он явно не определен в то время, поэтому вы выдаете эту ошибку.

Так что в этих случаях вы должны вызывать animate() сразу после добавления .kv других свойств, и для этого мы используемClock.schedule_once(), как показано ниже:

from kivy.clock import Clock


class IntroScreen(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        Clock.schedule_once(lambda *args: self.animate())

    def animate(self):
        anim = Animation(opacity=0, duration=3)
        anim.start(self.lbl)
...