Как решить ошибку "Нетипичный объект не имеет атрибута" связать "? - PullRequest
1 голос
/ 20 марта 2020

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

Python:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import StringProperty
from kivy.clock import Clock

kv = Builder.load_file("autogeo.kv")
kujund = "null"

class autogeo(App):
    manager = ScreenManager()

    Screen1 = Screen(name="esimene")
    Screen2 = Screen(name='teine')
    Screen3 = Screen(name="kolmas")
    Screen4 = Screen(name='neljas')
    Screen5 = Screen(name="viies")
    kujund = StringProperty()

    def update(self, *args):
        pass
    def build(self):
        Clock.schedule_interval(self.update, 0.1)
        return kv

if __name__ == "__main__":
    autogeo().run()

Kv:

ScreenManager:
    id: manager
    size: root.width, root.height

    Screen:
        name: "esimene"
        GridLayout:
            cols: 2
            rows: 3
            Button:
                text: "ruut"
                on_press:
                    manager.current = "teine"
                    manager.transition.direction ="left"
                    app.kujund: "ruut"

            Button:
                text: "ristkylik"
                on_press:
                    manager.current = "teine"
                    manager.transition.direction ="left"
            Button:
                text: "kolmnurk"
                on_press:
                    manager.current = "teine"
                    manager.transition.direction ="left"
            Button:
                text: "taisnurkne kolmnurk"
                on_press:
                    manager.current = "teine"
                    manager.transition.direction ="left"
            Button:
                text: "ring"
                on_press:
                    manager.current = "teine"
                    manager.transition.direction ="left"
            Button:
                text: "vordhaarne trapets"
                on_press:
                    manager.current = "teine"
                    manager.transition.direction ="left"
    Screen:
        name: "teine"
        FloatLayout:
            Label:
                text: "Valisid kujundi " + app.kujund
                font_size: self.width * 0.1
            Button:
                text: "tagasi"
                size_hint: 1, 0.2
                on_press:
                    manager.current = "esimene"
                    manager.transition.direction = "right"

Traceback:

 Traceback (most recent call last):
   File "C:\Users\ricsi\Anaconda3\lib\site-packages\kivy\lang\builder.py", line 249, in create_handler
     return eval(value, idmap), bound_list
   File "C:\Users\ricsi\PycharmProjects\ToolsforMaths\autogeo.kv", line 46, in <module>
     text: "Valisid kujundi " + app.kujund
   File "C:\Users\ricsi\Anaconda3\lib\site-packages\kivy\lang\parser.py", line 75, in __getattribute__
     object.__getattribute__(self, '_ensure_app')()
   File "C:\Users\ricsi\Anaconda3\lib\site-packages\kivy\lang\parser.py", line 70, in _ensure_app
     app.bind(on_stop=lambda instance:
 AttributeError: 'NoneType' object has no attribute 'bind'

1 Ответ

1 голос
/ 20 марта 2020

Вы загружаете файл .kv, который использует «app» перед созданием «app», так что «Нет» выдает эту ошибку. Решение состоит в том, чтобы проанализировать его после создания «приложения», например, метода сборки.

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import StringProperty
from kivy.clock import Clock


class autogeo(App):
    manager = ScreenManager()

    Screen1 = Screen(name="esimene")
    Screen2 = Screen(name="teine")
    Screen3 = Screen(name="kolmas")
    Screen4 = Screen(name="neljas")
    Screen5 = Screen(name="viies")
    kujund = StringProperty()

    def update(self, *args):
        pass

    def build(self):
        <b>kv = Builder.load_file("autogeo.kv")</b>
        Clock.schedule_interval(self.update, 0.1)
        return kv


if __name__ == "__main__":
    autogeo().run()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...