关闭 DatePicker(多屏)时出现 Kivy 错误
Kivy Error when I close the DatePicker (MultiScreen)
我正在努力学习 Kivy。大多数东西在我单独编码时都能正常工作。但是当我像 MultiScreen 一样与其他代码结合时,我总是很挣扎。
这里我希望在关闭 DatePicker 后更改文本(id:date_label。相同的代码在没有 MultiScreen
的情况下工作
错误:第 31 行,在 on_cancel
self.root.ids.date_label.text = "取消"
AttributeError: 'CreateScreen' 对象没有属性 'root'
from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.core.window import Window
from kivy.uix.screenmanager import Screen, ScreenManager
from kivymd.uix.picker import MDDatePicker
Window.size = (350, 600)
class MenuScreen(Screen):
def input_user(self):
global username_1
username_1 = self.userinput.text
print(username_1)
class MainScreen(Screen):
def user_name(self):
print(username_1)
class CreateScreen(Screen):
# Click Ok
def on_save(self, instance, value, date_range):
print(instance, value, date_range)
# Click Close
def on_cancel(self, instance, value): # HERE IS THE ERROR
self.root.ids.date_label.text = "Cancel"
def show_date_picker(self):
date_dialog = MDDatePicker()
date_dialog.bind(on_save=self.on_save, on_cancel=self.on_cancel)
date_dialog.open()
sm = ScreenManager()
sm.add_widget(MenuScreen(name="menu"))
sm.add_widget(MainScreen(name="main-screen"))
sm.add_widget(CreateScreen(name="create-screen"))
class MyApp(MDApp):
def build(self):
screen = (Builder.load_file("kvfile.kv"))
return screen
if __name__ == '__main__':
MyApp().run()
KV 文件
ScreenManager:
MenuScreen:
MainScreen:
CreateScreen:
<MenuScreen>:
userinput: input
name: "menu"
BoxLayout:
padding: "50dp"
MDTextField:
id: input
padding: "10dp"
hint_text: "Enter Username"
pos_hint: {"center_x": 0.5, "center_y": 0.6}
MDRectangleFlatButton:
text: "Continue"
pos_hint: {"center_x": 0.5, "center_y":0.5}
on_release: root.manager.current = "main_screen"
on_press: root.input_user()
<MainScreen>:
name: "main_screen"
MDLabel:
text: "Welcome"
halign: "center"
pos_hint: {"center_x": 0.5, "center_y": 0.9}
MDRectangleFlatButton:
text: "Back"
pos_hint: {"center_x": 0.5, "center_y":0.2}
on_press: root.manager.current = "menu"
MDRectangleFlatButton:
text: "Print"
pos_hint: {"center_x": 0.5, "center_y":0.6}
on_release: root.manager.current = "create_screen"
MDRectangleFlatButton:
text: "Empty"
pos_hint: {"center_x": 0.5, "center_y":0.4}
on_press: root.manager.current = "menu"
<CreateScreen>
name: "create_screen"
MDRaisedButton:
text: "Date"
pos_hint: {"center_x": 0.5, "center_y" : 0.5}
on_release: root.show_date_picker()
MDLabel:
id: date_label
text: "Select Date"
pos_hint: {"center_x": 1, "center_y" : 0.4}
谢谢
错误告诉您'CreateScreen' object has no attribute 'root'
。您正试图在行中引用 root
:
self.root.ids.date_label.text = "Cancel"
在那一行中,self
是 CreateScreen
的实例,因此 self.root
正在尝试访问 self
的 root
属性(CreateScreen
).如果您尝试访问 CreateScreen
的 ids
,则只需使用:
self.ids.date_label.text = "Cancel"
我正在努力学习 Kivy。大多数东西在我单独编码时都能正常工作。但是当我像 MultiScreen 一样与其他代码结合时,我总是很挣扎。
这里我希望在关闭 DatePicker 后更改文本(id:date_label。相同的代码在没有 MultiScreen
的情况下工作错误:第 31 行,在 on_cancel self.root.ids.date_label.text = "取消" AttributeError: 'CreateScreen' 对象没有属性 'root'
from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.core.window import Window
from kivy.uix.screenmanager import Screen, ScreenManager
from kivymd.uix.picker import MDDatePicker
Window.size = (350, 600)
class MenuScreen(Screen):
def input_user(self):
global username_1
username_1 = self.userinput.text
print(username_1)
class MainScreen(Screen):
def user_name(self):
print(username_1)
class CreateScreen(Screen):
# Click Ok
def on_save(self, instance, value, date_range):
print(instance, value, date_range)
# Click Close
def on_cancel(self, instance, value): # HERE IS THE ERROR
self.root.ids.date_label.text = "Cancel"
def show_date_picker(self):
date_dialog = MDDatePicker()
date_dialog.bind(on_save=self.on_save, on_cancel=self.on_cancel)
date_dialog.open()
sm = ScreenManager()
sm.add_widget(MenuScreen(name="menu"))
sm.add_widget(MainScreen(name="main-screen"))
sm.add_widget(CreateScreen(name="create-screen"))
class MyApp(MDApp):
def build(self):
screen = (Builder.load_file("kvfile.kv"))
return screen
if __name__ == '__main__':
MyApp().run()
KV 文件
ScreenManager:
MenuScreen:
MainScreen:
CreateScreen:
<MenuScreen>:
userinput: input
name: "menu"
BoxLayout:
padding: "50dp"
MDTextField:
id: input
padding: "10dp"
hint_text: "Enter Username"
pos_hint: {"center_x": 0.5, "center_y": 0.6}
MDRectangleFlatButton:
text: "Continue"
pos_hint: {"center_x": 0.5, "center_y":0.5}
on_release: root.manager.current = "main_screen"
on_press: root.input_user()
<MainScreen>:
name: "main_screen"
MDLabel:
text: "Welcome"
halign: "center"
pos_hint: {"center_x": 0.5, "center_y": 0.9}
MDRectangleFlatButton:
text: "Back"
pos_hint: {"center_x": 0.5, "center_y":0.2}
on_press: root.manager.current = "menu"
MDRectangleFlatButton:
text: "Print"
pos_hint: {"center_x": 0.5, "center_y":0.6}
on_release: root.manager.current = "create_screen"
MDRectangleFlatButton:
text: "Empty"
pos_hint: {"center_x": 0.5, "center_y":0.4}
on_press: root.manager.current = "menu"
<CreateScreen>
name: "create_screen"
MDRaisedButton:
text: "Date"
pos_hint: {"center_x": 0.5, "center_y" : 0.5}
on_release: root.show_date_picker()
MDLabel:
id: date_label
text: "Select Date"
pos_hint: {"center_x": 1, "center_y" : 0.4}
谢谢
错误告诉您'CreateScreen' object has no attribute 'root'
。您正试图在行中引用 root
:
self.root.ids.date_label.text = "Cancel"
在那一行中,self
是 CreateScreen
的实例,因此 self.root
正在尝试访问 self
的 root
属性(CreateScreen
).如果您尝试访问 CreateScreen
的 ids
,则只需使用:
self.ids.date_label.text = "Cancel"