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

2024年 2月 9日 77.7k 0

kivy 屏幕管理器 kivy\properties.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

:
size_hint: 1, none
text_size: self.width, none
size: self.texture_size
markup: true

:
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

:
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

登录后复制

以上就是Kivy 屏幕管理器 kivyproperties.pyx KeyError 和 AttributeError:“super”对象没有属性“__getattr__”。您的意思是:“__setattr__”吗?的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论