Rumah >pembangunan bahagian belakang >Tutorial Python >Pengurus skrin Kivy kivy\properties.pyx KeyError dan AttributeError: objek 'super' tidak mempunyai atribut '__getattr__'. Adakah anda maksudkan: '__setattr__'?

Pengurus skrin Kivy kivy\properties.pyx KeyError dan AttributeError: objek 'super' tidak mempunyai atribut '__getattr__'. Adakah anda maksudkan: '__setattr__'?

WBOY
WBOYke hadapan
2024-02-09 12:39:14532semak imbas

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

Kandungan soalan

Saya menghadapi masalah semasa cuba melaksanakan pengurus skrin menggunakan kivy. Seperti yang anda lihat, id "sembang" ditakrifkan dalam main.kv jadi saya tidak faham mengapa ralat berlaku. Saya baru mengenali kivy dan tidak pernah menggunakan pengurus skrin sebelum ini.. tolong bantu!

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()

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)

Daftar.kv

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

Saya melihat soalan lain di sini tentang masalah yang sama, tetapi malangnya saya tidak cukup mahir dengan kivy untuk menggunakan penyelesaian pada senario khusus saya.


Jawapan betul


Dalam kaedah chat id 是在 mainscreen 类中定义的,但您尝试在 exampleappself.root.ids 中访问它。由于该 id 是在 2ce5072a52f86a18f348fe92d4deb633 规则中定义的,因此您必须通过 mainscreen 实例访问它。一种方法是仅保存对 mainscreen 实例的引用。在 build() anda, anda boleh menukar:

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

Kepada:

# 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)

Kemudian, dalam mana-mana id exampleapp 方法内的任何位置,您都可以访问 chat bukan statik, seperti ini:

self.main_screen.ids.chat

Atas ialah kandungan terperinci Pengurus skrin Kivy kivy\properties.pyx KeyError dan AttributeError: objek 'super' tidak mempunyai atribut '__getattr__'. Adakah anda maksudkan: '__setattr__'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam