1
1
import flet as ft
2
2
3
3
4
- class Task (ft .UserControl ):
4
+ class Task (ft .Column ):
5
5
def __init__ (self , task_name , task_status_change , task_delete ):
6
6
super ().__init__ ()
7
7
self .completed = False
8
8
self .task_name = task_name
9
9
self .task_status_change = task_status_change
10
10
self .task_delete = task_delete
11
-
12
- def build (self ):
13
11
self .display_task = ft .Checkbox (
14
12
value = False , label = self .task_name , on_change = self .status_changed
15
13
)
@@ -52,30 +50,32 @@ def build(self):
52
50
),
53
51
],
54
52
)
55
- return ft . Column ( controls = [self .display_view , self .edit_view ])
53
+ self . controls = [self .display_view , self .edit_view ]
56
54
57
- async def edit_clicked (self , e ):
55
+ def edit_clicked (self , e ):
58
56
self .edit_name .value = self .display_task .label
59
57
self .display_view .visible = False
60
58
self .edit_view .visible = True
61
- await self .update_async ()
59
+ self .update ()
62
60
63
- async def save_clicked (self , e ):
61
+ def save_clicked (self , e ):
64
62
self .display_task .label = self .edit_name .value
65
63
self .display_view .visible = True
66
64
self .edit_view .visible = False
67
- await self .update_async ()
65
+ self .update ()
68
66
69
- async def status_changed (self , e ):
67
+ def status_changed (self , e ):
70
68
self .completed = self .display_task .value
71
- await self .task_status_change (self )
69
+ self .task_status_change (self )
72
70
73
- async def delete_clicked (self , e ):
74
- await self .task_delete (self )
71
+ def delete_clicked (self , e ):
72
+ self .task_delete (self )
75
73
76
74
77
- class TodoApp (ft .UserControl ):
78
- def build (self ):
75
+ class TodoApp (ft .Column ):
76
+ # application's root control is a Column containing all other controls
77
+ def __init__ (self ):
78
+ super ().__init__ ()
79
79
self .new_task = ft .TextField (
80
80
hint_text = "What needs to be done?" , on_submit = self .add_clicked , expand = True
81
81
)
@@ -90,66 +90,63 @@ def build(self):
90
90
91
91
self .items_left = ft .Text ("0 items left" )
92
92
93
- # application's root control (i.e. "view") containing all other controls
94
- return ft .Column (
95
- width = 600 ,
96
- controls = [
97
- ft .Row (
98
- [ft .Text (value = "Todos" , style = ft .TextThemeStyle .HEADLINE_MEDIUM )],
99
- alignment = ft .MainAxisAlignment .CENTER ,
100
- ),
101
- ft .Row (
102
- controls = [
103
- self .new_task ,
104
- ft .FloatingActionButton (
105
- icon = ft .icons .ADD , on_click = self .add_clicked
106
- ),
107
- ],
108
- ),
109
- ft .Column (
110
- spacing = 25 ,
111
- controls = [
112
- self .filter ,
113
- self .tasks ,
114
- ft .Row (
115
- alignment = ft .MainAxisAlignment .SPACE_BETWEEN ,
116
- vertical_alignment = ft .CrossAxisAlignment .CENTER ,
117
- controls = [
118
- self .items_left ,
119
- ft .OutlinedButton (
120
- text = "Clear completed" , on_click = self .clear_clicked
121
- ),
122
- ],
123
- ),
124
- ],
125
- ),
126
- ],
127
- )
128
-
129
- async def add_clicked (self , e ):
93
+ self .width = 600
94
+ self .controls = [
95
+ ft .Row (
96
+ [ft .Text (value = "Todos" , theme_style = ft .TextThemeStyle .HEADLINE_MEDIUM )],
97
+ alignment = ft .MainAxisAlignment .CENTER ,
98
+ ),
99
+ ft .Row (
100
+ controls = [
101
+ self .new_task ,
102
+ ft .FloatingActionButton (
103
+ icon = ft .icons .ADD , on_click = self .add_clicked
104
+ ),
105
+ ],
106
+ ),
107
+ ft .Column (
108
+ spacing = 25 ,
109
+ controls = [
110
+ self .filter ,
111
+ self .tasks ,
112
+ ft .Row (
113
+ alignment = ft .MainAxisAlignment .SPACE_BETWEEN ,
114
+ vertical_alignment = ft .CrossAxisAlignment .CENTER ,
115
+ controls = [
116
+ self .items_left ,
117
+ ft .OutlinedButton (
118
+ text = "Clear completed" , on_click = self .clear_clicked
119
+ ),
120
+ ],
121
+ ),
122
+ ],
123
+ ),
124
+ ]
125
+
126
+ def add_clicked (self , e ):
130
127
if self .new_task .value :
131
128
task = Task (self .new_task .value , self .task_status_change , self .task_delete )
132
129
self .tasks .controls .append (task )
133
130
self .new_task .value = ""
134
- await self .new_task .focus_async ()
135
- await self .update_async ()
131
+ self .new_task .focus ()
132
+ self .update ()
136
133
137
- async def task_status_change (self , task ):
138
- await self .update_async ()
134
+ def task_status_change (self , task ):
135
+ self .update ()
139
136
140
- async def task_delete (self , task ):
137
+ def task_delete (self , task ):
141
138
self .tasks .controls .remove (task )
142
- await self .update_async ()
139
+ self .update ()
143
140
144
- async def tabs_changed (self , e ):
145
- await self .update_async ()
141
+ def tabs_changed (self , e ):
142
+ self .update ()
146
143
147
- async def clear_clicked (self , e ):
144
+ def clear_clicked (self , e ):
148
145
for task in self .tasks .controls [:]:
149
146
if task .completed :
150
- await self .task_delete (task )
147
+ self .task_delete (task )
151
148
152
- async def update_async (self ):
149
+ def before_update (self ):
153
150
status = self .filter .tabs [self .filter .selected_index ].text
154
151
count = 0
155
152
for task in self .tasks .controls :
@@ -161,16 +158,15 @@ async def update_async(self):
161
158
if not task .completed :
162
159
count += 1
163
160
self .items_left .value = f"{ count } active item(s) left"
164
- await super ().update_async ()
165
161
166
162
167
- async def main (page : ft .Page ):
163
+ def main (page : ft .Page ):
168
164
page .title = "ToDo App"
169
165
page .horizontal_alignment = ft .CrossAxisAlignment .CENTER
170
166
page .scroll = ft .ScrollMode .ADAPTIVE
171
167
172
168
# create app control and add it to the page
173
- await page .add_async (TodoApp ())
169
+ page .add (TodoApp ())
174
170
175
171
176
172
ft .app (main )
0 commit comments