Advertisement
nicuf

demo

Sep 10th, 2023
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.01 KB | None | 0 0
  1. import tkinter as tk
  2. from tkinter import ttk
  3. import locale
  4. import qrcode
  5. from PIL import Image, ImageTk
  6. import tkinter.simpledialog
  7. import tkinter.messagebox
  8.  
  9. locale.setlocale(locale.LC_ALL, '')
  10.  
  11. root = tk.Tk() # Crearea ferestrei principale
  12. root.title("Analize Medicale") # Setarea titlului ferestrei
  13.  
  14. #canvas = tk.Canvas(root) # Crearea canvas-ului în cadrul ferestrei principale
  15. #canvas.pack(side=tk.LEFT)
  16.  
  17. valori_normale = {
  18. "UREE": (10, 50),
  19. "CREATININA_F": (0.6, 1.1),
  20. "CREATININA_B": (0.6, 1.2),
  21. "ACID_URIC_B": (2.4, 6.0),
  22. "ACID_URIC_F": (2.4, 6.0),
  23. "SODIU": (135, 145),
  24. "POTASIU": (3.5, 5.0),
  25. "CLORU": (95, 105),
  26. "Trigliceride": (50, 150),
  27. "MAGNEZIU": (1.7, 2.2),
  28. "CALCIU": (0.6, 1.2),
  29. "FIER_SERIC": (65, 175),
  30. "GLICEMIE": (70, 110),
  31. "HEMOGLOBINA": (14, 18),
  32. "LDH (lactat dehidrogenază)": (10, 190),
  33. "ACIRD_URIC_BARBATI": (3.5, 7.2),
  34. "ACIRD_URIC_FEMEI": (2.6, 6.0),
  35. "ALBUMINA": (3.5, 5.0),
  36. "AMILAZA": (25, 125),
  37. "Bilirubina_directa": (0, 0.3),
  38. "Bilirubina_totala": (0.3, 1.2),
  39. "LDH_lactat_dehidrogenaza1": (100, 190),
  40. "LDH_lactat_dehidrogenaza2": (100, 190),
  41. "HEMOGLOBINA_BARBATI": (14, 18),
  42. "HEMOGLOBINA_FEMEI": (14, 16),
  43. "TROMBOCITE": (150000, 450000),
  44. "COLESTEROL": (150000, 450000),
  45. "FIBRIOGEN1": (200, 400),
  46. "FIBRIOGEN2": (200, 400),
  47. "AST": (10, 20),
  48. "ALT": (7, 40),
  49. "Bilirubina_totala1": (0.1, 1.2),
  50. "Urocultura": (0, 100),
  51. }
  52.  
  53. info_medicala = {
  54. "UREE": {
  55. "Diagnostic": "Insuficiență renală, deshidratare",
  56. "Cauze": "Dietă bogată în proteine, deshidratare",
  57. "Recomandări": "Beți mai multă apă, reduceți aportul de proteine",
  58. "Uree_crescuta": {
  59. "Cauze_posibile": [
  60. "Insuficiență renală acută sau cronică: Rinichii nu pot filtra eficient deșeurile din sânge.",
  61. "Deshidratare: Volumul scăzut de sânge poate crește concentrația de uree.",
  62. "O dietă bogată în proteine: Consumul excesiv de proteine poate crește producția de uree.",
  63. "Hemoragie gastrointestinală: Sângerarea în tractul digestiv poate crește nivelul de uree datorită digestiei sângelui.",
  64. "Șoc sau stres sever: Poate reduce fluxul sanguin către rinichi.",
  65. "Obstrucție urinară: Blocajul căilor urinare poate împiedica eliminarea ureei."
  66. ],
  67. "Simptome_asociate": ["Letargie", "oboseală", "scăderea apetitului", "greață", "vărsături", "confuzie", "scurtarea respirației"]
  68. },
  69. "Uree_scazuta": {
  70. "Cauze_posibile": [
  71. "Malnutriție sau o dietă săracă în proteine: Aportul insuficient de proteine reduce producția de uree.",
  72. "Insuficiență hepatică: Ficatul nu poate produce suficientă uree.",
  73. "Sarcină: Poate duce la o scădere a nivelului de uree datorită creșterii volumului plasmatic.",
  74. "Consum excesiv de lichide: Poate dilua concentrația de uree din sânge."
  75. ],
  76. "Simptome_asociate": ["Depind de cauza subiacentă", "pierderea în greutate", "slăbiciune", "confuzie", "icter", "Slăbiciune", "Pierderea poftei de mâncare", "Greață", "Vărsături", "Dureri abdominale", "Insuficiență renală"]
  77. }
  78. },
  79. # ... adăugați informații similare pentru celelalte analize
  80. }
  81.  
  82. entries = {}
  83.  
  84. # Creează un frame pentru coloanele cu analize
  85. frame1 = ttk.Frame(root)
  86. frame2 = ttk.Frame(root)
  87. frame3 = ttk.Frame(root)
  88. frame4 = ttk.Frame(root)
  89.  
  90. frame1.grid(row=0, column=0, padx=10, pady=10)
  91. frame2.grid(row=0, column=1, padx=10, pady=10)
  92. frame3.grid(row=0, column=2, padx=10, pady=10)
  93. frame4.grid(row=0, column=3, padx=10, pady=10)
  94.  
  95. # Adaugă denumirile analizelor în prima coloană (frame1)
  96. for i, analiza in enumerate(valori_normale.keys()):
  97. if i < len(valori_normale) // 4:
  98. label = ttk.Label(frame1, text=analiza)
  99. label.grid(row=i, column=0, sticky="w")
  100.  
  101. # Adaugă input-urile în a doua coloană (frame2)
  102. for i, analiza in enumerate(valori_normale.keys()):
  103. if i < len(valori_normale) // 4:
  104. entry = ttk.Entry(frame2)
  105. entry.grid(row=i, column=0, padx=5)
  106. entries[analiza] = entry
  107.  
  108. # Adaugă denumirile analizelor în a treia coloană (frame3)
  109. for i, analiza in enumerate(valori_normale.keys()):
  110. if len(valori_normale) // 4 <= i < len(valori_normale) // 2:
  111. label = ttk.Label(frame3, text=analiza)
  112. label.grid(row=i - len(valori_normale) // 4, column=0, sticky="w")
  113.  
  114. # Adaugă input-urile în a patra coloană (frame4)
  115. for i, analiza in enumerate(valori_normale.keys()):
  116. if len(valori_normale) // 4 <= i < len(valori_normale) // 2:
  117. entry = ttk.Entry(frame4)
  118. entry.grid(row=i - len(valori_normale) // 4, column=0, padx=5)
  119. entries[analiza] = entry
  120.  
  121. # Funcția afiseaza_rezultate va trebui să fie actualizată pentru a verifica valorile introduse și afișa rezultatele corect.
  122. def afiseaza_rezultate():
  123. global raport
  124. global results_text # Folosim variabila globală
  125. # Crearea variabilei results_window
  126. results_window = tk.Toplevel(root)
  127.  
  128. # Crearea variabilei results_text
  129. results_text = tk.Text(results_window, wrap=tk.WORD, width=80, height=30)
  130.  
  131. raport = ""
  132. diagnostic = ""
  133. cauze = ""
  134. recomandari = ""
  135. campuri_necompletate = [] # Lista pentru a ține evidența câmpurilor necompletate
  136.  
  137. for analiza, entry in entries.items():
  138. rezultat_text = entry.get().strip()
  139.  
  140. if not rezultat_text:
  141. campuri_necompletate.append(analiza) # Adaugă câmpul necompletat în lista
  142. else:
  143. results_text.insert(tk.END, f"{analiza}: ")
  144.  
  145. try:
  146. rezultat_val = float(rezultat_text.replace(" ", ""))
  147. val_n_min, val_n_max = valori_normale.get(analiza, (None, None))
  148.  
  149. if val_n_min is not None and val_n_max is not None:
  150. if rezultat_val < val_n_min or rezultat_val > val_n_max:
  151. # Subliniază cu roșu linia cu mesajul de eroare
  152. results_text.tag_configure("red", foreground="red")
  153. results_text.insert(tk.END, f"Valoarea nu se încadrează în limitele normale.\n", "red")
  154. diagnostic = info_medicala.get(analiza, {}).get("Diagnostic", "N/A")
  155. cauze = info_medicala.get(analiza, {}).get("Cauze", "N/A")
  156. recomandari = info_medicala.get(analiza, {}).get("Recomandări", "N/A")
  157. else:
  158. results_text.insert(tk.END, f"Valoarea se încadrează în limitele normale.\n")
  159. else:
  160. results_text.insert(tk.END, "Valoare nevalidă introdusă.\n")
  161. except ValueError:
  162. raport += f"{analiza}: Valoare incorectă introdusă.\n"
  163.  
  164. # Verificați dacă există câmpuri necompletate
  165. if campuri_necompletate:
  166. # Construiți un mesaj cu câmpurile necompletate
  167. mesaj_campuri_necompletate = "Nu ați completat următoarele câmpuri:\n"
  168. for camp in campuri_necompletate:
  169. mesaj_campuri_necompletate += f"- {camp}\n"
  170.  
  171. # Afișați mesajul "pop-up" cu opțiunea de a vizualiza analizele sau de a reveni
  172. raspuns = tkinter.messagebox.askquestion("Câmpuri Necompletate", mesaj_campuri_necompletate + "\nDoriți să vizualizați analizele fără aceste câmpuri?")
  173.  
  174. if raspuns == "yes":
  175. # Afișați analizele fără câmpurile necompletate
  176. results_text.pack(padx=10, pady=10)
  177.  
  178. # Focusează textul în fereastra de rezultate
  179. results_text.focus_set()
  180.  
  181. # Așteaptă ca utilizatorul să închidă fereastra de rezultate
  182. results_window.wait_window()
  183. else:
  184. # Nu există câmpuri necompletate, așa că afișați analizele direct
  185. results_text.pack(padx=10, pady=10)
  186.  
  187. # Focusează textul în fereastra de rezultate
  188. results_text.focus_set()
  189.  
  190. # Așteaptă ca utilizatorul să închidă fereastra de rezultate
  191.  
  192. results_window.wait_window()
  193.  
  194. # Dacă au fost găsite probleme, afișați un mesaj de eroare
  195. if raport:
  196. results_text.insert(tk.END, "\n\n**Raport de eroare**\n\n")
  197. results_text.insert(tk.END, raport)
  198. results_text.tag_configure("red", foreground="red")
  199. results_text.pack(padx=10, pady=10)
  200. results_text.focus_set()
  201. results_window.wait_window()
  202.  
  203. if raport:
  204. results_text.insert(tk.END, "\n\n**Raport de eroare**\n\n")
  205.  
  206. # Crearea cadrului pentru valorile analizelor
  207. valori_frame = tk.Frame(results_window)
  208. valori_frame.pack(padx=10, pady=10)
  209.  
  210. # Crearea label-ului pentru titlul analizelor
  211. valori_label = tk.Label(valori_frame, text="Analize")
  212. valori_label.grid(row=0, column=0, columnspan=2, sticky="w")
  213.  
  214. # Crearea label-ului pentru titlul valorilor normale
  215. valori_normale_label = tk.Label(valori_frame, text="Valori normale")
  216. valori_normale_label.grid(row=1, column=0, columnspan=2, sticky="w")
  217.  
  218. # Parcurgerea listei de analize
  219. for analiza, valoare_text in entries.items():
  220. # Afisarea analizei în prima coloană
  221. valoare_label = tk.Label(valori_frame, text=analiza)
  222. valoare_label.grid(row=int(analiza[0]), column=0, sticky="w")
  223.  
  224. # Afisarea valorii normale în a doua coloană
  225. try:
  226. valoare_val = float(valoare_text.replace(" ", ""))
  227. val_n_min, val_n_max = valori_normale.get(analiza, (None, None))
  228.  
  229. if val_n_min is not None and val_n_max is not None:
  230. # Folosim o funcție pentru a afișa valoarea normală corectă
  231. valoare_normala_label = tk.Label(valori_frame, text=afiseaza_valoare_normala(analiza, val_n_min, val_n_max))
  232. valoare_normala_label.grid(row=int(analiza[0]), column=1, sticky="w")
  233. else:
  234. valoare_normala_label = tk.Label(valori_frame, text="Valoare nevalidă introdusă")
  235. valoare_normala_label.grid(row=int(analiza[0]), column=1, sticky="w")
  236. except ValueError:
  237. valoare_normala_label = tk.Label(valori_frame, text="Valoare incorectă introdusă")
  238. valoare_normala_label.grid(row=int(analiza[0]), column=1, sticky="w")
  239.  
  240. # Afisarea analizelor rămase
  241. for analiza in ["ACIRD URIC (BARBATI)", "ACIRD URIC (FEMEI)", "ALBUMINA", "AMILAZA", "Bilirubină directă", "Bilirubină totală", "LDH (lactat dehidrogenază)", "LDH (lactat dehidrogenază)", "HEMOGLOBINA BARBATI", "HEMOGLOBINA FEMEI", "TROMBOCITE", "COLESTEROL", "FIBRIOGEN", "FIBRIOGEN", "AST", "ALT", "Bilirubina totală", "Urocultura"]:
  242. valoare_label = tk.Label(valori_frame, text=analiza)
  243. valoare_label.grid(row=int(analiza[0]), column=2, sticky="w")
  244.  
  245. results_window.wait_window()
  246.  
  247. # Crearea butonului pentru afișarea rezultatelor
  248. button1 = ttk.Button(root, text="Arată Rezultatele", command=afiseaza_rezultate)
  249. button1.grid(row=1, column=0, columnspan=4, pady=10)
  250.  
  251. # Crearea butonului pentru generarea codului QR
  252. def generate_qr_code():
  253. data = {key: entry.get() for key, entry in entries.items()}
  254. qr = qrcode.QRCode(version=1, box_size=10, border=5)
  255. qr.add_data(str(data))
  256. qr.make(fit=True)
  257. img = qr.make_image(fill="black", back_color="white")
  258. img.save("analize.png")
  259.  
  260. def afiseaza_valoare_normala(analiza, val_n_min, val_n_max):
  261. if analiza[0] in ["A", "B", "C", "D"]:
  262. return f"{val_n_min} - {val_n_max} (bărbați și femei)"
  263. else:
  264. return f"{val_n_min} - {val_n_max} (bărbați)"
  265.  
  266.  
  267. def afiseaza_valoare_normala(analiza, val_n_min, val_n_max):
  268. if analiza[0] in ["A", "B", "C", "D"]:
  269. return f"{val_n_min} - {val_n_max} (bărbați și femei)"
  270. else:
  271. return f"{val_n_min} - {val_n_max} (bărbați)"
  272.  
  273. def generate_qr_code():
  274. data = {key: entry.get() for key, entry in entries.items()}
  275. qr = qrcode.QRCode(version=1, box_size=10, border=5)
  276. qr.add_data(str(data))
  277. qr.make(fit=True)
  278. img = qr.make_image(fill="black", back_color="white")
  279. img.save("analize.png")
  280.  
  281. # Pentru al doilea QR Code care redirecționează spre o pagină web
  282. qr2 = qrcode.QRCode(version=1, box_size=10, border=5)
  283. qr2.add_data('https://pagina-web-cu-rezultatele-analizelor.com')
  284. qr2.make(fit=True)
  285. img2 = qr2.make_image(fill="black", back_color="white")
  286. img2.save("redirection.png")
  287.  
  288. def clear_placeholder(event):
  289. current = text_widget.get("1.0", tk.END).strip()
  290. if current == "Introduceți simptomele aici...":
  291. text_widget.delete("1.0", tk.END)
  292.  
  293. button2 = ttk.Button(root, text="Generează Cod QR", command=generate_qr_code)
  294. button2.grid(row=2, column=0, columnspan=4, pady=10)
  295.  
  296. root.mainloop()
  297.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement