forms.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import logging
  2. import tkinter as tk
  3. from tkinter import E, W, filedialog, ttk
  4. from PIL import Image, ImageTk
  5. from utils.solver_checker import check_solver
  6. from spr.runthread import RunSprThread
  7. main_logger = logging.getLogger('spr')
  8. class FormUi:
  9. runspr_thread = None
  10. def __init__(self, frame, q):
  11. self.frame = frame
  12. self.q = q
  13. image = Image.open('gui/img/icons/icons8-play-16.png')
  14. self.photo = ImageTk.PhotoImage(image)
  15. opfile = Image.open('gui/img/icons/icons8-abrir-carpeta-16.png')
  16. self.opfile = ImageTk.PhotoImage(opfile)
  17. # Add a text field for file path
  18. self.file_path = tk.StringVar()
  19. ttk.Label(self.frame, text='Archivo:').grid(
  20. column=0, row=0, sticky=W, pady=(5, 5), padx=(0, 10))
  21. self.entry = ttk.Entry(self.frame, textvariable=self.file_path,
  22. width=50)
  23. self.entry.grid(column=1, row=0, sticky=(W, E), pady=(5, 5))
  24. self.button = ttk.Button(
  25. self.frame, image=self.opfile, compound='center',
  26. command=self.open_file_dialog, width=3)
  27. self.button.grid(column=2, row=0, sticky=W)
  28. self.all_day = tk.IntVar()
  29. self.all_day_cb = ttk.Checkbutton(self.frame, text="Ejecutar 24 períodos", variable=self.all_day, command=self.chkbox_state)
  30. self.all_day_cb.state(['selected'])
  31. self.all_day.set(1)
  32. self.all_day_cb.grid(column=1, row=1, sticky=W)
  33. periodos = [*range(0,24)]
  34. ttk.Label(self.frame, text='Periodo:').grid(
  35. column=0, row=2, sticky=W, pady=(5, 5), padx=(0, 10))
  36. self.period_combo = ttk.Combobox(self.frame, values=periodos)
  37. self.period_combo.current(0)
  38. self.period_combo.set(23)
  39. self.period_combo.configure(state='disabled')
  40. self.period_combo.grid(column=1, row=2, sticky=W)
  41. self.button_run = ttk.Button(self.frame, image=self.photo,
  42. compound="right", text='Ejecutar',
  43. command=self.run)
  44. self.button_run.grid(column=1, row=3, sticky=W)
  45. def open_file_dialog(self):
  46. # Open file dialog
  47. try:
  48. file = filedialog.askopenfilename(
  49. filetypes=[('Excel', '.xlsx')],
  50. title='Seleccione un archivo de predespacho...')
  51. except Exception as e:
  52. main_logger.error(e)
  53. self.file_path.set('')
  54. else:
  55. main_logger.info(f'Archivo seleccionado: {file}')
  56. self.file_path.set(file)
  57. def chkbox_state(self):
  58. if self.all_day_cb.instate(['selected']):
  59. self.period_combo.configure(state='disabled')
  60. self.period_combo.current(0)
  61. self.period_combo.set(23)
  62. else:
  63. self.period_combo.configure(state='normal')
  64. def run(self):
  65. try:
  66. check_solver()
  67. if not self.file_path.get():
  68. return
  69. inputfile = self.file_path.get()
  70. all_day = self.all_day.get()
  71. if all_day == 1:
  72. all_day = True
  73. else:
  74. all_day = False
  75. period = self.period_combo.get()
  76. self.button_run.configure(state='disabled')
  77. self.runspr_thread = RunSprThread(args=(inputfile,int(period),all_day))
  78. self.runspr_thread.start()
  79. self.check_thread()
  80. except Exception as e:
  81. main_logger.error(e)
  82. return
  83. def check_thread(self):
  84. if not self.runspr_thread.is_alive():
  85. self.button_run.configure(state='normal')
  86. self.q.put(False)
  87. else:
  88. self.q.put(True)
  89. self.frame.after(100, self.check_thread)