rdsrrr commited on
Commit
bb170df
·
verified ·
1 Parent(s): 05d2191

Update telas/telas_tela1.py

Browse files
Files changed (1) hide show
  1. telas/telas_tela1.py +216 -216
telas/telas_tela1.py CHANGED
@@ -1,216 +1,216 @@
1
- import flet as ft
2
- import os
3
- import navigation
4
- import estado
5
- import unicodedata
6
- from datetime import datetime
7
-
8
- # Função para remover acentos e deixar minúsculo
9
- def normalizar_texto(texto):
10
- if not texto: return ""
11
- return "".join(c for c in unicodedata.normalize('NFKD', texto) if not unicodedata.combining(c)).lower()
12
-
13
- def carregar_dados_cidades():
14
- cidades = []
15
- cidade_rm = {}
16
- try:
17
- caminho_arquivo = os.path.join(os.path.dirname(__file__), "..", "assets", "municipios_completo.txt")
18
- with open(caminho_arquivo, "r", encoding="utf-8") as f:
19
- for linha in f:
20
- linha = linha.strip()
21
- if not linha: continue
22
- partes = linha.split(';')
23
- if len(partes) < 2: partes = linha.split(',')
24
- cidade = partes[0].strip()
25
- rm = partes[1].strip() if len(partes) > 1 else "Outros"
26
- if cidade:
27
- cidades.append(cidade)
28
- cidade_rm[normalizar_texto(cidade)] = rm
29
- if not cidades: return ["São Paulo", "Sorocaba", "Santos"], {}
30
- return cidades, cidade_rm
31
- except Exception as e:
32
- print(f"Erro ao ler municipios: {e}")
33
- return ["São Paulo", "Sorocaba", "Santos"], {}
34
-
35
- def carregar_criterios():
36
- pares_validos = set()
37
- try:
38
- caminho_criterios = os.path.join(os.path.dirname(__file__), "..", "assets", "Criterios.txt")
39
- if not os.path.exists(caminho_criterios): return set()
40
- with open(caminho_criterios, "r", encoding="utf-8") as f:
41
- for linha in f:
42
- linha = linha.strip()
43
- if not linha: continue
44
- partes = linha.split(';')
45
- if len(partes) >= 2:
46
- pares_validos.add((partes[0].strip(), partes[1].strip()))
47
- except Exception as e:
48
- print(f"Erro ao ler criterios: {e}")
49
- return pares_validos
50
-
51
- def carregar_classes():
52
- classes = {}
53
- try:
54
- caminho_classes = os.path.join(os.path.dirname(__file__), "..", "assets", "corresp_bloco_dist.txt")
55
- if not os.path.exists(caminho_classes): return {}
56
- with open(caminho_classes, "r", encoding="utf-8") as f:
57
- next(f, None)
58
- for linha in f:
59
- linha = linha.strip()
60
- if not linha: continue
61
- partes = linha.split(';')
62
- if len(partes) >= 4:
63
- ori = normalizar_texto(partes[2].strip())
64
- dest = normalizar_texto(partes[3].strip())
65
- cod = partes[-1].strip()
66
- classes[(ori, dest)] = cod
67
- except Exception as e:
68
- print(f"Erro ao ler classes: {e}")
69
- return classes
70
-
71
- def carregar_modos():
72
- modos = {}
73
- try:
74
- caminho = os.path.join(os.path.dirname(__file__), "..", "assets", "corresp_modo.txt")
75
- if not os.path.exists(caminho): return {}
76
- with open(caminho, "r", encoding="utf-8") as f:
77
- next(f, None)
78
- for linha in f:
79
- linha = linha.strip()
80
- if not linha: continue
81
- partes = linha.split(';')
82
- if len(partes) >= 3:
83
- modos[partes[0].strip()] = partes[2].strip()
84
- except Exception as e:
85
- print(f"Erro ao ler modos: {e}")
86
- return modos
87
-
88
- def tela_1(page: ft.Page, navigator):
89
- municipios_sp, mapa_rm = carregar_dados_cidades()
90
- criterios_rm = carregar_criterios()
91
- mapa_classes = carregar_classes()
92
- mapa_modos = carregar_modos()
93
-
94
- state = estado.get_state(page)
95
- respostas = state["respostas"]
96
-
97
- txt_erro = ft.Text("", color=ft.Colors.RED, size=12, visible=False, text_align="center")
98
- tentativa_sem_preencher = False
99
-
100
-
101
- sugestoes_container = ft.Column(scroll="auto", height=200, spacing=0)
102
- card_sugestoes = ft.Card(content=sugestoes_container, visible=False, elevation=10, width=300)
103
-
104
- def selecionar_cidade(e):
105
- t1_cidade_origem.value = e.control.data
106
- card_sugestoes.visible = False
107
- t1_cidade_origem.update()
108
- card_sugestoes.update()
109
-
110
- def filtrar_cidades(e):
111
- if not respostas.get("T1_Hora_Orig"): respostas["T1_Hora_Orig"] = datetime.now().strftime("%H:%M:%S")
112
- digitado = normalizar_texto(t1_cidade_origem.value)
113
- if not digitado: card_sugestoes.visible = False; card_sugestoes.update(); return
114
- matches = [c for c in municipios_sp if digitado in normalizar_texto(c)][:30]
115
- if not matches: card_sugestoes.visible = False; card_sugestoes.update(); return
116
- sugestoes_container.controls = [ft.ListTile(title=ft.Text(c, size=14, color=ft.Colors.BLACK), data=c, height=40, on_click=selecionar_cidade, bgcolor=ft.Colors.WHITE) for c in matches]
117
- card_sugestoes.visible = True; card_sugestoes.update(); sugestoes_container.update()
118
-
119
- t1_cidade_origem = ft.TextField(label="Cidade Origem", width=300, on_change=filtrar_cidades)
120
-
121
- sugestoes_container_dest = ft.Column(scroll="auto", height=200, spacing=0)
122
- card_sugestoes_dest = ft.Card(content=sugestoes_container_dest, visible=False, elevation=10, width=300)
123
-
124
- def selecionar_cidade_dest(e):
125
- t1_cidade_destino.value = e.control.data
126
- card_sugestoes_dest.visible = False
127
- t1_cidade_destino.update()
128
- card_sugestoes_dest.update()
129
-
130
- def filtrar_cidades_dest(e):
131
- digitado = normalizar_texto(t1_cidade_destino.value)
132
- if not digitado: card_sugestoes_dest.visible = False; card_sugestoes_dest.update(); return
133
- matches = [c for c in municipios_sp if digitado in normalizar_texto(c)][:30]
134
- if not matches: card_sugestoes_dest.visible = False; card_sugestoes_dest.update(); return
135
- sugestoes_container_dest.controls = [ft.ListTile(title=ft.Text(c, size=14, color=ft.Colors.BLACK), data=c, height=40, on_click=selecionar_cidade_dest, bgcolor=ft.Colors.WHITE) for c in matches]
136
- card_sugestoes_dest.visible = True; card_sugestoes_dest.update(); sugestoes_container_dest.update()
137
-
138
- t1_cidade_destino = ft.TextField(label="Cidade Destino", width=300, on_change=filtrar_cidades_dest)
139
-
140
- categorias = ["Carro (motorista)", "Carro (passageiro)", "Carro (APP)", "Moto", "Ônibus EMTU", "Ônibus Rodoviário", "Ônibus Fretado", "Van Fretada", "Outro"]
141
- t1_categoria = ft.Dropdown(label="Categoria / Modo", options=[ft.dropdown.Option(x) for x in categorias], width=300, value=respostas.get("T1_8_Categ"))
142
-
143
- def salvar_memoria():
144
- cod_modo = mapa_modos.get((t1_categoria.value or "").strip(), "")
145
- respostas.update({
146
- "T1_1_UF_Orig": "São Paulo", "T1_2_Cid_Orig": t1_cidade_origem.value,
147
- "T1_4_UF_Dest": "São Paulo", "T1_5_Cid_Dest": t1_cidade_destino.value,
148
- "T1_8_Categ": t1_categoria.value, "T1_9_ModoID": cod_modo,
149
- })
150
- estado.set_state(page, state)
151
-
152
- def processar(e):
153
- nonlocal tentativa_sem_preencher
154
- campos_vazios = []
155
- for ctrl, nome in [(t1_cidade_origem, "Cidade Origem"), (t1_cidade_destino, "Cidade Destino"), (t1_categoria, "Categoria / Modo")]:
156
- if not ctrl.value: campos_vazios.append(nome); ctrl.error_text = "Obrigatório"
157
- else: ctrl.error_text = None
158
- ctrl.update()
159
-
160
- if campos_vazios:
161
- txt_erro.value = "Preencha todos os campos marcados antes de prosseguir."
162
- txt_erro.visible = True
163
- txt_erro.update()
164
- return
165
-
166
- c_ori = normalizar_texto(t1_cidade_origem.value); c_dest = normalizar_texto(t1_cidade_destino.value)
167
- rm_o = mapa_rm.get(c_ori, "Desconhecido"); rm_d = mapa_rm.get(c_dest, "Desconhecido")
168
-
169
- if (rm_o, rm_d) not in criterios_rm:
170
- salvar_memoria(); estado.persistir(page, is_final=True); estado.finalizar_e_limpar(page); navigator.go("agradecimento")
171
- return
172
-
173
- respostas["T1_7_Classe"] = mapa_classes.get((c_ori, c_dest)) or mapa_classes.get((c_dest, c_ori), "")
174
- salvar_memoria(); estado.persistir(page, is_final=False)
175
- navigator.go("t2")
176
-
177
- confirmacao_parar = False
178
- def parar(e):
179
- nonlocal confirmacao_parar
180
- if not confirmacao_parar:
181
- confirmacao_parar = True
182
- btn_parar.text = "Confirmar?"
183
- btn_parar.bgcolor = ft.Colors.ORANGE_700
184
- btn_parar.update()
185
- return
186
- salvar_memoria()
187
- estado.persistir(page, is_final=True)
188
- estado.finalizar_e_limpar(page)
189
- navigator.go("agradecimento")
190
-
191
- btn_parar = ft.ElevatedButton("Parar", on_click=parar, bgcolor=ft.Colors.GREY_700, color=ft.Colors.WHITE, width=100)
192
-
193
- return ft.Container(
194
- expand=True,
195
- alignment=ft.Alignment(0, 0),
196
- padding=ft.padding.only(top=80, left=20, right=20, bottom=20),
197
- content=ft.Column(
198
- width=300,
199
- horizontal_alignment="center",
200
- spacing=10,
201
- scroll="auto",
202
- controls=[
203
- ft.Text("Caracterização da Viagem (1/5)", size=20, weight=ft.FontWeight.BOLD),
204
- ft.Text("Origem", weight=ft.FontWeight.BOLD),
205
- t1_cidade_origem, card_sugestoes,
206
- ft.Text("Destino", weight=ft.FontWeight.BOLD),
207
- t1_cidade_destino, card_sugestoes_dest,
208
- ft.Divider(height=10, color=ft.Colors.TRANSPARENT),
209
- ft.Text("Modo de transporte utilizado na viagem", weight=ft.FontWeight.BOLD), t1_categoria,
210
- ft.Divider(), txt_erro,
211
- ft.Row([btn_parar,
212
- ft.ElevatedButton("Seguir", on_click=processar, bgcolor=ft.Colors.GREEN_700, color=ft.Colors.WHITE, width=180)], alignment="center"),
213
- ft.Container(height=20)
214
- ]
215
- )
216
- )
 
1
+ import flet as ft
2
+ import os
3
+ import navigation
4
+ import estado
5
+ import unicodedata
6
+ from datetime import datetime
7
+
8
+ # Função para remover acentos e deixar minúsculo
9
+ def normalizar_texto(texto):
10
+ if not texto: return ""
11
+ return "".join(c for c in unicodedata.normalize('NFKD', texto) if not unicodedata.combining(c)).lower()
12
+
13
+ def carregar_dados_cidades():
14
+ cidades = []
15
+ cidade_rm = {}
16
+ try:
17
+ caminho_arquivo = os.path.join(os.path.dirname(__file__), "..", "assets", "municipios_completo.txt")
18
+ with open(caminho_arquivo, "r", encoding="utf-8") as f:
19
+ for linha in f:
20
+ linha = linha.strip()
21
+ if not linha: continue
22
+ partes = linha.split(';')
23
+ if len(partes) < 2: partes = linha.split(',')
24
+ cidade = partes[0].strip()
25
+ rm = partes[1].strip() if len(partes) > 1 else "Outros"
26
+ if cidade:
27
+ cidades.append(cidade)
28
+ cidade_rm[normalizar_texto(cidade)] = rm
29
+ if not cidades: return ["São Paulo", "Sorocaba", "Santos"], {}
30
+ return cidades, cidade_rm
31
+ except Exception as e:
32
+ print(f"Erro ao ler municipios: {e}")
33
+ return ["São Paulo", "Sorocaba", "Santos"], {}
34
+
35
+ def carregar_criterios():
36
+ pares_validos = set()
37
+ try:
38
+ caminho_criterios = os.path.join(os.path.dirname(__file__), "..", "assets", "Criterios.txt")
39
+ if not os.path.exists(caminho_criterios): return set()
40
+ with open(caminho_criterios, "r", encoding="utf-8") as f:
41
+ for linha in f:
42
+ linha = linha.strip()
43
+ if not linha: continue
44
+ partes = linha.split(';')
45
+ if len(partes) >= 2:
46
+ pares_validos.add((partes[0].strip(), partes[1].strip()))
47
+ except Exception as e:
48
+ print(f"Erro ao ler criterios: {e}")
49
+ return pares_validos
50
+
51
+ def carregar_classes():
52
+ classes = {}
53
+ try:
54
+ caminho_classes = os.path.join(os.path.dirname(__file__), "..", "assets", "corresp_bloco_dist.txt")
55
+ if not os.path.exists(caminho_classes): return {}
56
+ with open(caminho_classes, "r", encoding="utf-8") as f:
57
+ next(f, None)
58
+ for linha in f:
59
+ linha = linha.strip()
60
+ if not linha: continue
61
+ partes = linha.split(';')
62
+ if len(partes) >= 4:
63
+ ori = normalizar_texto(partes[2].strip())
64
+ dest = normalizar_texto(partes[3].strip())
65
+ cod = partes[-1].strip()
66
+ classes[(ori, dest)] = cod
67
+ except Exception as e:
68
+ print(f"Erro ao ler classes: {e}")
69
+ return classes
70
+
71
+ def carregar_modos():
72
+ modos = {}
73
+ try:
74
+ caminho = os.path.join(os.path.dirname(__file__), "..", "assets", "corresp_modo.txt")
75
+ if not os.path.exists(caminho): return {}
76
+ with open(caminho, "r", encoding="utf-8") as f:
77
+ next(f, None)
78
+ for linha in f:
79
+ linha = linha.strip()
80
+ if not linha: continue
81
+ partes = linha.split(';')
82
+ if len(partes) >= 3:
83
+ modos[partes[0].strip()] = partes[2].strip()
84
+ except Exception as e:
85
+ print(f"Erro ao ler modos: {e}")
86
+ return modos
87
+
88
+ def tela_1(page: ft.Page, navigator):
89
+ municipios_sp, mapa_rm = carregar_dados_cidades()
90
+ criterios_rm = carregar_criterios()
91
+ mapa_classes = carregar_classes()
92
+ mapa_modos = carregar_modos()
93
+
94
+ state = estado.get_state(page)
95
+ respostas = state["respostas"]
96
+
97
+ txt_erro = ft.Text("", color=ft.Colors.RED, size=12, visible=False, text_align="center")
98
+ tentativa_sem_preencher = False
99
+
100
+
101
+ sugestoes_container = ft.Column(scroll="auto", height=200, spacing=0)
102
+ card_sugestoes = ft.Card(content=sugestoes_container, visible=False, elevation=10, width=300)
103
+
104
+ def selecionar_cidade(e):
105
+ t1_cidade_origem.value = e.control.data
106
+ card_sugestoes.visible = False
107
+ t1_cidade_origem.update()
108
+ card_sugestoes.update()
109
+
110
+ def filtrar_cidades(e):
111
+ if not respostas.get("T1_Hora_Orig"): respostas["T1_Hora_Orig"] = datetime.now().strftime("%H:%M:%S")
112
+ digitado = normalizar_texto(t1_cidade_origem.value)
113
+ if not digitado: card_sugestoes.visible = False; card_sugestoes.update(); return
114
+ matches = [c for c in municipios_sp if digitado in normalizar_texto(c)][:30]
115
+ if not matches: card_sugestoes.visible = False; card_sugestoes.update(); return
116
+ sugestoes_container.controls = [ft.ListTile(title=ft.Text(c, size=14, color=ft.Colors.BLACK), data=c, height=40, on_click=selecionar_cidade, bgcolor=ft.Colors.WHITE) for c in matches]
117
+ card_sugestoes.visible = True; card_sugestoes.update(); sugestoes_container.update()
118
+
119
+ t1_cidade_origem = ft.TextField(label="Cidade Origem", width=300, on_change=filtrar_cidades)
120
+
121
+ sugestoes_container_dest = ft.Column(scroll="auto", height=200, spacing=0)
122
+ card_sugestoes_dest = ft.Card(content=sugestoes_container_dest, visible=False, elevation=10, width=300)
123
+
124
+ def selecionar_cidade_dest(e):
125
+ t1_cidade_destino.value = e.control.data
126
+ card_sugestoes_dest.visible = False
127
+ t1_cidade_destino.update()
128
+ card_sugestoes_dest.update()
129
+
130
+ def filtrar_cidades_dest(e):
131
+ digitado = normalizar_texto(t1_cidade_destino.value)
132
+ if not digitado: card_sugestoes_dest.visible = False; card_sugestoes_dest.update(); return
133
+ matches = [c for c in municipios_sp if digitado in normalizar_texto(c)][:30]
134
+ if not matches: card_sugestoes_dest.visible = False; card_sugestoes_dest.update(); return
135
+ sugestoes_container_dest.controls = [ft.ListTile(title=ft.Text(c, size=14, color=ft.Colors.BLACK), data=c, height=40, on_click=selecionar_cidade_dest, bgcolor=ft.Colors.WHITE) for c in matches]
136
+ card_sugestoes_dest.visible = True; card_sugestoes_dest.update(); sugestoes_container_dest.update()
137
+
138
+ t1_cidade_destino = ft.TextField(label="Cidade Destino", width=300, on_change=filtrar_cidades_dest)
139
+
140
+ categorias = ["Carro (motorista)", "Carro (passageiro)", "Carro (Aplicativo)", "Moto", "Ônibus EMTU", "Ônibus Rodoviário", "Ônibus Fretado", "Van Fretada", "Outro"]
141
+ t1_categoria = ft.Dropdown(label="Categoria / Modo", options=[ft.dropdown.Option(x) for x in categorias], width=300, value=respostas.get("T1_8_Categ"))
142
+
143
+ def salvar_memoria():
144
+ cod_modo = mapa_modos.get((t1_categoria.value or "").strip(), "")
145
+ respostas.update({
146
+ "T1_1_UF_Orig": "São Paulo", "T1_2_Cid_Orig": t1_cidade_origem.value,
147
+ "T1_4_UF_Dest": "São Paulo", "T1_5_Cid_Dest": t1_cidade_destino.value,
148
+ "T1_8_Categ": t1_categoria.value, "T1_9_ModoID": cod_modo,
149
+ })
150
+ estado.set_state(page, state)
151
+
152
+ def processar(e):
153
+ nonlocal tentativa_sem_preencher
154
+ campos_vazios = []
155
+ for ctrl, nome in [(t1_cidade_origem, "Cidade Origem"), (t1_cidade_destino, "Cidade Destino"), (t1_categoria, "Categoria / Modo")]:
156
+ if not ctrl.value: campos_vazios.append(nome); ctrl.error_text = "Obrigatório"
157
+ else: ctrl.error_text = None
158
+ ctrl.update()
159
+
160
+ if campos_vazios:
161
+ txt_erro.value = "Preencha todos os campos marcados antes de prosseguir."
162
+ txt_erro.visible = True
163
+ txt_erro.update()
164
+ return
165
+
166
+ c_ori = normalizar_texto(t1_cidade_origem.value); c_dest = normalizar_texto(t1_cidade_destino.value)
167
+ rm_o = mapa_rm.get(c_ori, "Desconhecido"); rm_d = mapa_rm.get(c_dest, "Desconhecido")
168
+
169
+ if (rm_o, rm_d) not in criterios_rm:
170
+ salvar_memoria(); estado.persistir(page, is_final=True); estado.finalizar_e_limpar(page); navigator.go("agradecimento")
171
+ return
172
+
173
+ respostas["T1_7_Classe"] = mapa_classes.get((c_ori, c_dest)) or mapa_classes.get((c_dest, c_ori), "")
174
+ salvar_memoria(); estado.persistir(page, is_final=False)
175
+ navigator.go("t2")
176
+
177
+ confirmacao_parar = False
178
+ def parar(e):
179
+ nonlocal confirmacao_parar
180
+ if not confirmacao_parar:
181
+ confirmacao_parar = True
182
+ btn_parar.text = "Confirmar?"
183
+ btn_parar.bgcolor = ft.Colors.ORANGE_700
184
+ btn_parar.update()
185
+ return
186
+ salvar_memoria()
187
+ estado.persistir(page, is_final=True)
188
+ estado.finalizar_e_limpar(page)
189
+ navigator.go("agradecimento")
190
+
191
+ btn_parar = ft.ElevatedButton("Parar", on_click=parar, bgcolor=ft.Colors.GREY_700, color=ft.Colors.WHITE, width=100)
192
+
193
+ return ft.Container(
194
+ expand=True,
195
+ alignment=ft.Alignment(0, 0),
196
+ padding=ft.padding.only(top=80, left=20, right=20, bottom=20),
197
+ content=ft.Column(
198
+ width=300,
199
+ horizontal_alignment="center",
200
+ spacing=10,
201
+ scroll="auto",
202
+ controls=[
203
+ ft.Text("Caracterização da Viagem (1/5)", size=20, weight=ft.FontWeight.BOLD),
204
+ ft.Text("Origem", weight=ft.FontWeight.BOLD),
205
+ t1_cidade_origem, card_sugestoes,
206
+ ft.Text("Destino", weight=ft.FontWeight.BOLD),
207
+ t1_cidade_destino, card_sugestoes_dest,
208
+ ft.Divider(height=10, color=ft.Colors.TRANSPARENT),
209
+ ft.Text("Modo de transporte utilizado na viagem", weight=ft.FontWeight.BOLD), t1_categoria,
210
+ ft.Divider(), txt_erro,
211
+ ft.Row([btn_parar,
212
+ ft.ElevatedButton("Seguir", on_click=processar, bgcolor=ft.Colors.GREEN_700, color=ft.Colors.WHITE, width=180)], alignment="center"),
213
+ ft.Container(height=20)
214
+ ]
215
+ )
216
+ )