Edoruin commited on
Commit
ecdbbb5
·
1 Parent(s): 55b52f7

solving nothing to show

Browse files
Files changed (2) hide show
  1. Dockerfile +12 -1
  2. main.py +51 -77
Dockerfile CHANGED
@@ -1,6 +1,17 @@
1
  FROM python:3.9-slim
 
 
 
 
 
 
 
2
  WORKDIR /app
3
- RUN pip install --no-cache-dir flet
 
4
  COPY . .
 
5
  EXPOSE 7860
 
 
6
  CMD ["python", "main.py"]
 
1
  FROM python:3.9-slim
2
+
3
+ # Instalamos librerías necesarias para que Flet no falle al renderizar
4
+ RUN apt-get update && apt-get install -y \
5
+ libgtk-3-0 \
6
+ libasound2 \
7
+ && rm -rf /var/lib/apt/lists/*
8
+
9
  WORKDIR /app
10
+ COPY requirements.txt .
11
+ RUN pip install --no-cache-dir -r requirements.txt
12
  COPY . .
13
+
14
  EXPOSE 7860
15
+
16
+ # Ejecutamos la app
17
  CMD ["python", "main.py"]
main.py CHANGED
@@ -2,108 +2,82 @@ import flet as ft
2
  import datetime
3
 
4
  def main(page: ft.Page):
 
5
  page.title = "MI PESCA RD"
6
  page.theme_mode = ft.ThemeMode.LIGHT
7
- page.window_width = 400 # Optimizado para móvil
8
 
9
- # --- PERSISTENCIA LOCAL (Sustituto de SQLite para Web) ---
10
- def obtener_registros():
11
- return page.client_storage.get("pesca_data") or []
12
-
13
- def guardar_en_navegador(e):
14
  if not especie_dropdown.value or not peso_input.value:
15
- page.snack_bar = ft.SnackBar(ft.Text("Faltan datos críticos"))
16
  page.snack_bar.open = True
17
  page.update()
18
  return
19
 
20
- # Captura de datos según tu documento
21
- nuevo_registro = {
22
  "especie": especie_dropdown.value,
23
- "peso_lb": peso_input.value,
24
  "brazadas": prof_slider.value,
25
- "fecha": datetime.datetime.now().strftime("%Y-%m-%d %H:%M"),
26
- "gps": "18.4500, -68.9667", # Simulación de captura silenciosa
27
- "sst_status": "Pendiente NOAA"
28
  }
29
 
30
- registros = obtener_registros()
31
- registros.append(nuevo_registro)
32
- page.client_storage.set("pesca_data", registros)
33
-
34
- # Limpiar y Notificar
 
35
  especie_dropdown.value = None
36
  peso_input.value = ""
37
- page.snack_bar = ft.SnackBar(ft.Text("✅ Guardado en memoria local"))
 
 
38
  page.snack_bar.open = True
39
- renderizar_historial()
40
  page.update()
41
 
42
- # --- UI: COMPONENTES DE ALTO CONTRASTE ---
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  especie_dropdown = ft.Dropdown(
44
- label="Especie (CODOPESCA)",
45
  options=[
46
  ft.dropdown.Option("Chillo"),
47
  ft.dropdown.Option("Colirrubia"),
48
- ft.dropdown.Option("Mero Rojo"),
49
- ft.dropdown.Option("Langosta (Revisar Veda)"),
50
- ft.dropdown.Option("Loro (PROHIBIDO)"),
51
- ],
52
  )
 
 
 
53
 
54
- peso_input = ft.TextField(
55
- label="Peso en Libras",
56
- keyboard_type=ft.KeyboardType.NUMBER,
57
- prefix_icon=ft.icons.SCALE
58
- )
59
-
60
- prof_slider = ft.Slider(
61
- min=0, max=100, divisions=20,
62
- label="{value} Brazadas"
63
- )
64
-
65
- historial_view = ft.Column(scroll=ft.ScrollMode.ADAPTIVE, height=200)
66
-
67
- def renderizar_historial():
68
- datos = obtener_registros()
69
- historial_view.controls.clear()
70
- for d in reversed(datos): # Ver los más recientes primero
71
- historial_view.controls.append(
72
- ft.ListTile(
73
- leading=ft.Icon(ft.icons.PHISHING),
74
- title=ft.Text(f"{d['especie']} - {d['peso_lb']} lbs"),
75
- subtitle=ft.Text(f"{d['fecha']} | {d['brazadas']} Brazadas"),
76
- )
77
- )
78
-
79
- # --- DISEÑO DE PANTALLA ---
80
  page.add(
81
- ft.SafeArea(
82
- ft.Column([
83
- ft.Text("🎣 MI PESCA RD", size=32, weight="bold", color="blue800"),
84
- ft.Text("Manejo de Recursos Pesqueros", size=14, italic=True),
85
- ft.Divider(),
86
- especie_dropdown,
87
- peso_input,
88
- ft.Text("Profundidad (Brazadas):"),
89
- prof_slider,
90
- ft.ElevatedButton(
91
- "REGISTRAR CAPTURA",
92
- icon=ft.icons.SAVE,
93
- on_click=guardar_en_navegador,
94
- style=ft.ButtonStyle(shape=ft.RoundedRectangleBorder(radius=10)),
95
- height=60,
96
- bgcolor="blue800",
97
- color="white"
98
- ),
99
- ft.Divider(),
100
- ft.Text("REGISTROS LOCALES (OFFLINE):", weight="bold"),
101
- historial_view
102
- ])
103
- )
104
  )
105
- renderizar_historial()
106
 
107
- # Ejecución obligatoria para Hugging Face
108
  if __name__ == "__main__":
109
  ft.app(target=main, view=ft.AppView.WEB_BROWSER, port=7860, host="0.0.0.0")
 
2
  import datetime
3
 
4
  def main(page: ft.Page):
5
+ # Configuración básica de la página
6
  page.title = "MI PESCA RD"
7
  page.theme_mode = ft.ThemeMode.LIGHT
8
+ page.scroll = ft.ScrollMode.ADAPTIVE
9
 
10
+ # --- Lógica de Almacenamiento Local (Sustituye SQLite en Web) ---
11
+ def guardar_captura(e):
 
 
 
12
  if not especie_dropdown.value or not peso_input.value:
13
+ page.snack_bar = ft.SnackBar(ft.Text("Completa los campos"))
14
  page.snack_bar.open = True
15
  page.update()
16
  return
17
 
18
+ nueva_captura = {
 
19
  "especie": especie_dropdown.value,
20
+ "peso": peso_input.value,
21
  "brazadas": prof_slider.value,
22
+ "fecha": datetime.datetime.now().strftime("%d/%m/%Y %H:%M")
 
 
23
  }
24
 
25
+ # Guardar en el navegador del usuario
26
+ registros = page.client_storage.get("datos_pesca") or []
27
+ registros.append(nueva_captura)
28
+ page.client_storage.set("datos_pesca", registros)
29
+
30
+ # Limpiar y actualizar
31
  especie_dropdown.value = None
32
  peso_input.value = ""
33
+ renderizar_lista()
34
+
35
+ page.snack_bar = ft.SnackBar(ft.Text("✅ Guardado en el dispositivo"))
36
  page.snack_bar.open = True
 
37
  page.update()
38
 
39
+ def renderizar_lista():
40
+ datos = page.client_storage.get("datos_pesca") or []
41
+ lista_view.controls.clear()
42
+ for d in reversed(datos):
43
+ lista_view.controls.append(
44
+ ft.ListTile(
45
+ title=ft.Text(f"{d['especie']} - {d['peso']} lbs"),
46
+ subtitle=ft.Text(f"{d['fecha']} | {d['brazadas']} Brazadas"),
47
+ leading=ft.Icon(ft.icons.PHISHING)
48
+ )
49
+ )
50
+ page.update()
51
+
52
+ # --- Elementos Visuales ---
53
  especie_dropdown = ft.Dropdown(
54
+ label="Especie",
55
  options=[
56
  ft.dropdown.Option("Chillo"),
57
  ft.dropdown.Option("Colirrubia"),
58
+ ft.dropdown.Option("Mero"),
59
+ ft.dropdown.Option("Langosta"),
60
+ ]
 
61
  )
62
+ peso_input = ft.TextField(label="Peso (Lbs)", keyboard_type=ft.KeyboardType.NUMBER)
63
+ prof_slider = ft.Slider(min=0, max=100, label="{value} Brazadas")
64
+ lista_view = ft.Column()
65
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  page.add(
67
+ ft.Text("🎣 MI PESCA RD", size=30, weight="bold", color="blue"),
68
+ ft.Text("Registro de Recursos Pesqueros", size=16),
69
+ ft.Divider(),
70
+ especie_dropdown,
71
+ peso_input,
72
+ ft.Text("Profundidad (Brazadas):"),
73
+ prof_slider,
74
+ ft.ElevatedButton("REGISTRAR", on_click=guardar_captura, bgcolor="blue", color="white"),
75
+ ft.Divider(),
76
+ ft.Text("Historial Local (Offline):", weight="bold"),
77
+ lista_view
 
 
 
 
 
 
 
 
 
 
 
 
78
  )
79
+ renderizar_lista()
80
 
81
+ # ESTA LÍNEA ES LA MÁS IMPORTANTE PARA HUGGING FACE
82
  if __name__ == "__main__":
83
  ft.app(target=main, view=ft.AppView.WEB_BROWSER, port=7860, host="0.0.0.0")