卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章34834本站已运行393

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

kivy 屏幕管理器 kivyproperties.pyx keyerror 和 attributeerror:“super”对象没有属性“__getattr__”。您的意思是:“__setattr__”吗?

问题内容

我在尝试使用 kivy 实现屏幕管理器时遇到了问题。正如您所看到的“聊天”id 是在 main.kv 中定义的,所以我无法理解为什么会发生错误。我是 kivy 的新手,以前从未使用过屏幕管理器..请帮忙!

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)

注册.kv

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

我在这里看到了关于类似问题的其他问题,但不幸的是我对 kivy 不够熟练,无法将解决方案应用于我的特定场景。


正确答案


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

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

至:

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

然后,在任何非静态 exampleapp 方法内的任何位置,您都可以访问 chat id,如下所示:

self.main_screen.ids.chat
上一篇: 为什么从golang连接oracle自治数据库失败?
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏