问题内容
我在尝试使用 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
类中定义的,但您尝试在 exampleapp
的 self.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)其它相关文章!