我在嘗試使用 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
類別中定義的,但您嘗試在exampleapp
的self.root.ids
中存取它。由於該 id 是在 <mainscreen>
規則中定義的,因此您必須透過 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 螢幕管理器 kivy\properties.pyx KeyError 和 AttributeError:「super」物件沒有屬性「__getattr__」。您的意思是:「__setattr__」嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!