I’m trying to learn Kivy. Most stuff works when I just code it separate. But when I combine like MultiScreen with other code I always strugle.
Here I want that after closing the DatePicker to change the Text(id: date_label. Same code worked without the MultiScreen
Error: line 31, in on_cancel self.root.ids.date_label.text = “Cancel” AttributeError: ‘CreateScreen’ object has no attribute ‘root’
JavaScript
x
55
55
1
from kivymd.app import MDApp
2
from kivy.lang import Builder
3
from kivy.core.window import Window
4
from kivy.uix.screenmanager import Screen, ScreenManager
5
from kivymd.uix.picker import MDDatePicker
6
7
Window.size = (350, 600)
8
9
10
11
class MenuScreen(Screen):
12
def input_user(self):
13
global username_1
14
username_1 = self.userinput.text
15
print(username_1)
16
17
18
class MainScreen(Screen):
19
def user_name(self):
20
print(username_1)
21
22
23
class CreateScreen(Screen):
24
25
# Click Ok
26
def on_save(self, instance, value, date_range):
27
print(instance, value, date_range)
28
29
30
# Click Close
31
def on_cancel(self, instance, value): # HERE IS THE ERROR
32
self.root.ids.date_label.text = "Cancel"
33
34
def show_date_picker(self):
35
date_dialog = MDDatePicker()
36
date_dialog.bind(on_save=self.on_save, on_cancel=self.on_cancel)
37
date_dialog.open()
38
39
40
sm = ScreenManager()
41
sm.add_widget(MenuScreen(name="menu"))
42
sm.add_widget(MainScreen(name="main-screen"))
43
sm.add_widget(CreateScreen(name="create-screen"))
44
45
46
class MyApp(MDApp):
47
def build(self):
48
49
screen = (Builder.load_file("kvfile.kv"))
50
return screen
51
52
53
if __name__ == '__main__':
54
MyApp().run()
55
KV File
JavaScript
1
55
55
1
ScreenManager:
2
MenuScreen:
3
MainScreen:
4
CreateScreen:
5
6
7
<MenuScreen>:
8
userinput: input
9
name: "menu"
10
BoxLayout:
11
padding: "50dp"
12
MDTextField:
13
id: input
14
padding: "10dp"
15
hint_text: "Enter Username"
16
pos_hint: {"center_x": 0.5, "center_y": 0.6}
17
MDRectangleFlatButton:
18
text: "Continue"
19
pos_hint: {"center_x": 0.5, "center_y":0.5}
20
on_release: root.manager.current = "main_screen"
21
on_press: root.input_user()
22
23
24
<MainScreen>:
25
name: "main_screen"
26
MDLabel:
27
text: "Welcome"
28
halign: "center"
29
pos_hint: {"center_x": 0.5, "center_y": 0.9}
30
MDRectangleFlatButton:
31
text: "Back"
32
pos_hint: {"center_x": 0.5, "center_y":0.2}
33
on_press: root.manager.current = "menu"
34
MDRectangleFlatButton:
35
text: "Print"
36
pos_hint: {"center_x": 0.5, "center_y":0.6}
37
on_release: root.manager.current = "create_screen"
38
MDRectangleFlatButton:
39
text: "Empty"
40
pos_hint: {"center_x": 0.5, "center_y":0.4}
41
on_press: root.manager.current = "menu"
42
43
44
<CreateScreen>
45
name: "create_screen"
46
MDRaisedButton:
47
text: "Date"
48
pos_hint: {"center_x": 0.5, "center_y" : 0.5}
49
on_release: root.show_date_picker()
50
51
MDLabel:
52
id: date_label
53
text: "Select Date"
54
pos_hint: {"center_x": 1, "center_y" : 0.4}
55
Thank you
Advertisement
Answer
The error is telling you that 'CreateScreen' object has no attribute 'root'
. You are trying to refer to root
in the line:
JavaScript
1
2
1
self.root.ids.date_label.text = "Cancel"
2
In that line, self
is the instance of CreateScreen
, so self.root
is trying to access a root
attribute of self
(CreateScreen
). If you are trying to access the ids
of CreateScreen
, then just use:
JavaScript
1
2
1
self.ids.date_label.text = "Cancel"
2