Kivy-Bildschirmmanager kivy\properties.pyx KeyError und AttributeError: Das Objekt „super' hat kein Attribut „__getattr__'. Meinten Sie: „__setattr__'?

WBOY
Freigeben: 2024-02-09 12:39:14
nach vorne
499 Leute haben es durchsucht

Kivy 屏幕管理器 kivy\properties.pyx KeyError 和 AttributeError:“super”对象没有属性“__getattr__”。您的意思是:“__setattr__”吗?

Frageninhalt

Ich bin auf ein Problem gestoßen, als ich versuchte, einen Bildschirmmanager mit Kivy zu implementieren. Wie Sie sehen können, ist die „Chat“-ID in main.kv definiert, sodass ich nicht verstehen kann, warum der Fehler auftritt. Ich bin neu bei Kivy und habe noch nie zuvor einen Bildschirmmanager verwendet. Bitte helfen Sie!

app_cleaned.py

from kivy.app import app
from kivy.lang import builder
from kivy.uix.label import label
from kivy.core.window import window
from kivy.uix.screenmanager import screen, screenmanager
from kivy.clock import mainthread

from range_key_dict import rangekeydict

from math import inf

from threading import thread

from powerbot import chatbot

#remove
from kivy.clock import clock

window.size = (500, 500)

class signupscreen(screen):
    pass

class mainscreen(screen):
    pass

class message(label):
    pass

class user:
    def __init__(self, years_lifting, weight, height, unavailable_equipment, unavailable_muscle_groups, aim):

        # lifting experience classification
        expclassdict = rangekeydict({
            (0.0, 1.9): 1, # beginner
            (2.0, 3.9): 2, # intermediate
            (4, inf): 3 # advanced
        })
        expclass = expclassdict[years_lifting]

        # bmi classification
        bmiclassdict = rangekeydict({
            (0.0, 9.9): 1, # severely underweight
            (10.0, 18.5): 2, # underweight
            (18.6, 24.9): 3, # healthy weight
            (25.0, 34.9): 2, # overweight
            (35.0, inf): 1, # severely overweight
        })
        bmi = weight/(height/100)**2 # calculate bmi
        bmiclass = bmiclassdict[bmi]

        self.experience_level = expclass
        self.bmi_level = bmiclass
        self.unavailable_equipment = unavailable_equipment
        self.unavailable_muscle_groups = unavailable_muscle_groups
        self.aim = aim



class exampleapp(app):
    def build(self):
        sm = screenmanager()

        # load the signup.kv file and add its content to the signupscreen
        builder.load_file('signup.kv')

        # create the signupscreen instance and add it to the screenmanager
        signup_screen = signupscreen(name='signup')
        sm.add_widget(signup_screen)
        
        # load the main application screen from main.kv
        builder.load_file('main.kv')
        main_screen = mainscreen(name='main')
        sm.add_widget(main_screen)

        return sm

    def switch_to_main_screen(self):
        self.root.current = 'main'
    
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.ai = chatbot("powerbot")

    def on_start(self):
        print("root ids:", self.root.ids)
        # assuming you expect 'chat' to be available here, you can print its contents as well
        if 'chat' in self.root.ids:
            print("chat widget:", self.root.ids.chat)
        self.root.current = 'signup'
        initial_messages = ["powerbot is initializing, please wait (this could take a minute)"]
        for message in initial_messages:
            self.system_message(message)
        message = "000000"
        thread = thread(target=self.background_message_receiver,args=(message,))
        thread.start()
        self.root.ids.sv.scroll_y = 0

    def sign_up(self, years_lifting, weight, height):
        # convert input values to appropriate data types (e.g., int, float)
        years_lifting = float(years_lifting)
        weight = float(weight)
        height = float(height)

        # create a user object with the provided sign-up details
        user = user(years_lifting, weight, height)  # pass other sign-up details as needed

        self.root.ids.years_lifting_input.text = ''
        self.root.ids.weight_input.text = ''
        self.root.ids.height_input.text = ''

    def background_message_receiver(self, message):
        response = self.ai.message_to_bot(message)
        self.incoming_message(response)

    def send_message(self, message):
        self.root.ids.ti.text = ""
        if message:
            m = message(text=f"[color=dd2020]you[/color] > {message}")
            self.root.ids.chat.add_widget(m)
            self.root.ids.ti.focus = true
            thread = thread(target=self.background_message_receiver,args=(message,))
            thread.start()

    @mainthread
    def incoming_message(self, message):
        m = message(text=f"[color=20dd20]powerbot[/color] > {message}")
        self.root.ids.chat.add_widget(m)
        self.root.ids.ti.focus = true

    def system_message(self, message):
        m = message(text=f"[color=ffffff]system[/color] > {message}")
        self.root.ids.chat.add_widget(m)
        self.root.ids.ti.focus = true
    
# execute
if __name__ == '__main__':
    exampleapp().run()
Nach dem Login kopieren

main.kv

<message>:
    size_hint: 1, none
    text_size: self.width, none
    size: self.texture_size
    markup: true
    
<mainscreen>:
    boxlayout:
        orientation: 'vertical'
        padding: 10
        scrollview:
            id: sv
            boxlayout:
                id: chat  # add the id for the chat messages
                spacing: 5
                padding: 10
                orientation: 'vertical'
                size_hint_y: none
                height: self.minimum_height
                widget: # used as a spacer, push message to bottom
                    size_hint_y: none
                    height: sv.height
        boxlayout:
            size_hint_y: none
            height: 40
            spacing: 10
            textinput:
                id: ti
                multiline: false
                on_text_validate: app.send_message(self.text)
            button:
                text: 'submit'
                size_hint_x: none
                width: 75
                on_release: app.send_message(ti.text)
Nach dem Login kopieren

Register.kv

<SignupScreen>:
    BoxLayout:
        orientation: 'vertical'
        padding: 10
        
        Button:
            text: 'Continue'
            size_hint_y: None
            height: '48dp'
            on_release: app.switch_to_main_screen()
Nach dem Login kopieren

Ich habe hier weitere Fragen zu ähnlichen Problemen gesehen, aber leider beherrsche ich Kivy nicht ausreichend, um die Lösung auf mein spezielles Szenario anzuwenden.


Richtige Antwort


In Ihrer chat id 是在 mainscreen 类中定义的,但您尝试在 exampleappself.root.ids 中访问它。由于该 id 是在 <mainscreen> 规则中定义的,因此您必须通过 mainscreen 实例访问它。一种方法是仅保存对 mainscreen 实例的引用。在 build()-Methode können Sie Folgendes ändern:

# load the main application screen from main.kv
    builder.load_file('main.kv')
    main_screen = mainscreen(name='main')
    sm.add_widget(main_screen)
Nach dem Login kopieren

An:

# load the main application screen from main.kv
    builder.load_file('main.kv')
    self.main_screen = mainscreen(name='main')
    sm.add_widget(self.main_screen)
Nach dem Login kopieren

Dann, in jeder nicht statischen exampleapp 方法内的任何位置,您都可以访问 chat ID, so:

self.main_screen.ids.chat
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonKivy-Bildschirmmanager kivy\properties.pyx KeyError und AttributeError: Das Objekt „super' hat kein Attribut „__getattr__'. Meinten Sie: „__setattr__'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!