Advertisement
Vasilena

gui.py 12.04

Apr 12th, 2023
27
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.01 KB | None | 0 0
  1. import tkinter as tk
  2. from tkinter import *
  3. from tkinter import ttk
  4. from tkinter import messagebox
  5. import tkinter.messagebox
  6. from pump_two_on import PumpTwoOn
  7. from pump_two_off import PumpTwoOff
  8. from pump_one_on import PumpOneOn
  9. from pump_one_off import PumpOneOff
  10. from drain import TankDrain
  11. from exit import Exit
  12. import RPi.GPIO as GPIO
  13.  
  14. GPIO.setwarnings(False)
  15. GPIO.setmode(GPIO.BOARD)
  16.  
  17. GPIO.setup(40, GPIO.IN)
  18.  
  19. # tank one gpio senzors setup
  20. GPIO.setup(29, GPIO.IN)
  21. GPIO.setup(31, GPIO.IN)
  22. GPIO.setup(33, GPIO.IN)
  23. GPIO.setup(35, GPIO.IN)
  24. GPIO.setup(37, GPIO.IN)
  25.  
  26.  
  27. # tank two gpio senzors setup
  28. GPIO.setup(11, GPIO.IN)
  29. GPIO.setup(12, GPIO.IN)
  30. GPIO.setup(13, GPIO.IN)
  31. GPIO.setup(15, GPIO.IN)
  32. GPIO.setup(16, GPIO.IN)
  33.  
  34. # tank three gpio senzors setup
  35. GPIO.setup(18, GPIO.IN)
  36. GPIO.setup(22, GPIO.IN)
  37. GPIO.setup(21, GPIO.IN)
  38. GPIO.setup(23, GPIO.IN)
  39. GPIO.setup(24, GPIO.IN)
  40.  
  41.  
  42. class Window:
  43.  
  44. def __init__(self, root):
  45. # --------------------------------TK-------------------------------
  46. # root setup
  47. self.window = root
  48. self.background_color = '#999da0'
  49. self.window.attributes('-fullscreen', True)
  50. self.window.title("Control Panel")
  51. self.window.configure(background='#999da0')
  52.  
  53. # root geometry
  54. self.screen_width = self.window.winfo_screenwidth() # 1920
  55. self.screen_height = self.window.winfo_screenheight() # 1080
  56.  
  57. # manual mode
  58. self.manual = Label(root, text="РЪЧНО УПРАВЛЕНИЕ", font=('Arial', 30), bg=self.background_color, fg="black")
  59. self.manual.place(x=(self.screen_width / 3) * 2.15, y=self.screen_height / 20)
  60.  
  61. self.pumpOne = Label(root, text="ПОМПА 1", font=('Arial', 20), bg=self.background_color, fg="black")
  62. self.pumpOne.place(x=(self.screen_width / 3) * 2.17, y=self.screen_height / 8)
  63.  
  64. self.pumpTwo = Label(root, text="ПОМПА 2", font=('Arial', 20), bg=self.background_color, fg="black")
  65. self.pumpTwo.place(x=(self.screen_width / 3) * 2.6, y=self.screen_height / 8)
  66.  
  67. # buttons
  68. self.pump_one_on_btn = Button(root, text="ВКЛЮЧИ", font=("Arial", 15, "bold"), command=self.pump_one_on_func, bg="#198FF5", fg="white")
  69. self.pump_one_on_btn.place(x=(self.screen_width / 3) * 2.18, y=self.screen_height / 5.8)
  70.  
  71. self.pump_one_off_btn = Button(root, text="ИЗКЛЮЧИ", font=("Arial", 15, "bold"), command=self.pump_one_off_func, bg="#696969", fg="white")
  72. self.pump_one_off_btn.place(x=(self.screen_width / 3) * 2.16, y=self.screen_height / 4.5)
  73.  
  74. # separator
  75. self.separator_frame = Frame(root, bg="black", width=2, height=150)
  76. self.separator_frame.place(x=1590, y=137)
  77.  
  78. self.pump_two_on_btn = Button(root, text="ВКЛЮЧИ", font=("Arial", 15, "bold"), command=self.pump_two_on_func, bg="#198FF5", fg="white")
  79. self.pump_two_on_btn.place(x=(self.screen_width / 3) * 2.6, y=self.screen_height / 5.8)
  80.  
  81. self.pump_two_off_btn = Button(root, text="ИЗКЛЮЧИ", font=("Arial", 15, "bold"), command=self.pump_two_off_func, bg="#696969", fg="white")
  82. self.pump_two_off_btn.place(x=(self.screen_width / 3) * 2.6, y=self.screen_height / 4.5)
  83.  
  84. # draning
  85. self.manual = Label(root, text="ГЛАВЕН РЕЗЕРВОАР", font=('Arial', 30), bg=self.background_color, fg="black")
  86. self.manual.place(x=(self.screen_width / 3) * 2.15, y=self.screen_height / 3.3)
  87.  
  88. self.pump_two_off_btn = Button(root, text="ИЗТОЧВАНЕ", font=("Arial", 15, "bold"), command=self.drain_func, bg="#F06B5D", fg="white")
  89. self.pump_two_off_btn.place(x=(self.screen_width / 3) * 2.35, y=self.screen_height / 2.7)
  90.  
  91. # separator
  92. self.separator_frame = Frame(root, bg="black", width=470, height=2)
  93. self.separator_frame.place(x=1360, y=480)
  94.  
  95. # exit program button
  96. self.exit_btn = Button(root, text="X", height=1, width=2, font=("Arial", 15, "bold"),
  97. command=self.Exit_btn_func, bg="#EF4324", fg="white")
  98. self.exit_btn.place(x=self.screen_width - 55, y=self.screen_height - (self.screen_height - 5))
  99.  
  100. # automatic mode
  101. self.automatic = Label(root, text="АВТОМАТИЧНО УПРАВЛЕНИЕ", font=('Arial', 25), bg=self.background_color,
  102. fg="black")
  103. self.automatic.place(x=(self.screen_width / 3) * 2.1, y=self.screen_height / 2.1)
  104.  
  105. self.tankOne = Label(root, text="РЕЗЕРВОАР 1", font=('Arial', 20), bg=self.background_color, fg="black")
  106. self.tankOne.place(x=(self.screen_width / 3) * 2.13, y=self.screen_height / 1.9)
  107.  
  108. # separator
  109. self.separator_frame = Frame(root, bg="black", width=2, height=120)
  110. self.separator_frame.place(x=1590, y=570)
  111.  
  112. self.tankTwo = Label(root, text="РЕЗЕРВОАР 2", font=('Arial', 20), bg=self.background_color, fg="black")
  113. self.tankTwo.place(x=(self.screen_width / 3) * 2.55, y=self.screen_height / 1.9)
  114.  
  115. # dropdown menus
  116. self.tank1_label = tk.Label(root, text="избери:", bg=self.background_color, font=('Arial', 18))
  117. self.tank1_label.place(x=(self.screen_width / 3) * 2.17, y=self.screen_height / 1.7)
  118. self.tank1_value_inside = tk.StringVar(value="0%")
  119. self.tank1_options = ["0%", "20%", "40%", "60%", "80%", "100%"]
  120. self.tank1_dropdown = tk.OptionMenu(root, self.tank1_value_inside, *self.tank1_options)
  121. self.tank1_dropdown.place(x=(self.screen_width / 3) * 2.32, y=self.screen_height / 1.7)
  122.  
  123. # dropdown menus
  124. self.tank2_label = tk.Label(root, text="избери:", bg=self.background_color, font=('Arial', 18))
  125. self.tank2_label.place(x=(self.screen_width / 3) * 2.55, y=self.screen_height / 1.7)
  126. self.tank2_value_inside = tk.StringVar(value="0%")
  127. self.tank2_options = ["0%", "20%", "40%", "60%", "80%", "100%"]
  128. self.tank2_dropdown = tk.OptionMenu(root, self.tank2_value_inside, *self.tank2_options)
  129. self.tank2_dropdown.place(x=(self.screen_width / 3) * 2.70, y=self.screen_height / 1.7)
  130.  
  131. # sequence option
  132. self.automatic = Label(root, text="ИЗБЕРИ ПОСЛЕДОВАТЕЛНОСТ", font=('Arial', 25), bg=self.background_color,
  133. fg="black")
  134. self.automatic.place(x=(self.screen_width / 3) * 2.1, y=self.screen_height / 1.5)
  135.  
  136. # create a label and two radio buttons for the first sequence option
  137. self.sequence1_label = tk.Label(root, text='ЕДНО', bg=self.background_color, font=('Arial', 20))
  138. self.sequence1_label.place(x=(self.screen_width / 3) * 2.3, y=self.screen_height / 1.4)
  139.  
  140. self.sequence1_var = tk.StringVar(root)
  141. self.sequence1_var.set('Резервоар 1')
  142.  
  143. self.sequence1_rb1 = tk.Radiobutton(root, text='Резервоар 1 ', bg=self.background_color, font=('Arial', 15),
  144. variable=self.sequence1_var, value='Резервоар 1')
  145. self.sequence1_rb1.place(x=(self.screen_width / 3) * 2.15, y=self.screen_height / 1.31)
  146. self.sequence1_rb2 = tk.Radiobutton(root, text='Резервоар 2 ', bg=self.background_color, font=('Arial', 15),
  147. variable=self.sequence1_var, value='Резервоар 2')
  148. self.sequence1_rb2.place(x=(self.screen_width / 3) * 2.15, y=self.screen_height / 1.24)
  149.  
  150. # separator
  151. self.separator_frame = Frame(root, bg="black", width=2, height=122)
  152. self.separator_frame.place(x=1590, y=780)
  153.  
  154. # create a label and two radio buttons for the second sequence option
  155. self.sequence2_label = tk.Label(root, text='ДВЕ', font=('Arial', 20), bg=self.background_color, fg="black")
  156. self.sequence2_label.place(x=(self.screen_width / 3) * 2.55, y=self.screen_height / 1.4)
  157.  
  158. self.sequence2_var = tk.StringVar(root)
  159. self.sequence2_var.set('Резервоар 2')
  160.  
  161. self.sequence2_rb1 = tk.Radiobutton(root, text='Резервоар 1 ', bg=self.background_color, font=('Arial', 15),
  162. variable=self.sequence2_var, value='Резервоар 1')
  163. self.sequence2_rb1.place(x=(self.screen_width / 3) * 2.57, y=self.screen_height / 1.31)
  164. self.sequence2_rb2 = tk.Radiobutton(root, text='Резервоар 2 ', bg=self.background_color, font=('Arial', 15),
  165. variable=self.sequence2_var, value='Резервоар 2')
  166. self.sequence2_rb2.place(x=(self.screen_width / 3) * 2.57, y=self.screen_height / 1.24)
  167.  
  168. # start and stop button
  169.  
  170. self.start = Button(root, text="СТАРТИРАЙ", font=('Arial', 25), bg="#41be87", fg="white",
  171. command=self.overflow_btn_on)
  172. self.start.place(x=(self.screen_width / 3) * 2.17, y=self.screen_height / 1.15)
  173.  
  174. self.stop = Button(root, text="СПРИ", font=('Arial', 25), bg="#e2651d", fg="white",
  175. command=self.overflow_btn_off)
  176. self.stop.place(x=(self.screen_width / 3) * 2.6, y=self.screen_height / 1.15)
  177.  
  178. # --------------------------------Canvas-------------------------------
  179. # canvas setup
  180. self.canvas = Canvas(root, width=(self.screen_width / 3) * 2, height=self.screen_height,
  181. bg=self.background_color)
  182. self.canvas.pack()
  183. self.canvas.place(bordermode=OUTSIDE)
  184.  
  185. # heading
  186. self.canvas.create_text(self.screen_width / 3, self.screen_height / 18, text='C O N T R O L P A N E L',
  187. fill='black', font='Arial 25')
  188.  
  189. # create scale tank One
  190. self.canvas.create_line(65, 140, 65, 520, width=2)
  191. for i in range(6):
  192. self.p1 = 100 - i * 20
  193. self.y1 = 140
  194. self.y1 = self.y1 + i * 76
  195. self.canvas.create_text(25, self.y1, text=self.p1, font=("Arial", 13, "bold"))
  196. self.canvas.create_text(45, self.y1, text="%", font=("Arial", 13, "bold"))
  197. self.canvas.create_line(65, self.y1, 75, self.y1, width=2)
  198.  
  199. # create scale tank Two
  200. self.canvas.create_line(65, 600, 65, 980, width=2)
  201. for i in range(6):
  202. self.p = 100 - i * 20
  203. self.y = 600
  204. self.y = self.y + i * 76
  205. self.canvas.create_text(25, self.y, text=self.p, font=("Arial", 13, "bold"))
  206. self.canvas.create_text(45, self.y, text=" %", font=("Arial", 13, "bold"))
  207. self.canvas.create_line(65, self.y, 75, self.y, width=2)
  208.  
  209. # create scale tank Three
  210. self.canvas.create_line(785, 300, 785, 680, width=2)
  211. for i in range(6):
  212. self.p = 100 - i * 20
  213. self.y2 = 300
  214. self.y2 = self.y2 + i * 76
  215. self.canvas.create_text(745, self.y2, text=self.p, font=("Arial", 13, "bold"))
  216. self.canvas.create_text(765, self.y2, text=" %", font=("Arial", 13, "bold"))
  217. self.canvas.create_line(785, self.y2, 795, self.y2, width=2)
  218.  
  219. # tank One
  220. self.canvas.create_rectangle(80, 140, 360, 520, fill='#d9dddc')
  221. # tank One Water
  222. self.waterOne = self.canvas.create_rectangle(80, 140, 360, 520, fill='blue')
  223.  
  224. self.tank1_label_canvas = tk.Label(root, text="Резервоар 1", bg=self.background_color, font=('Arial', 18))
  225. self.tank1_label_canvas.place(x=80, y=100)
  226.  
  227. # tank Two
  228. self.canvas.create_rectangle(80, 600, 360, 980, fill='#d9dddc')
  229. # tank Two Water
  230. self.waterTwo = self.canvas.create_rectangle(80, 600, 360, 980, fill='blue')
  231.  
  232. self.tank2_label_canvas = tk.Label(root, text="Резервоар 2", bg=self.background_color, font=('Arial', 18))
  233. self.tank2_label_canvas.place(x=80, y=560)
  234.  
  235. self.pipe = self.canvas.create_rectangle(500, 600, 600, 700, fill='#d9dddc')
  236. self.pipeWater = self.canvas.create_rectangle(500, 695, 600, 700, fill='blue')
  237.  
  238.  
  239. # tank Three
  240. self.canvas.create_rectangle(800, 300, 1080, 680, fill='#d9dddc')
  241. # tank Three Water
  242. self.waterThree = self.canvas.create_rectangle(800, 300, 1080, 680, fill='blue')
  243.  
  244. self.tank3_label_canvas = tk.Label(root, text="Резервоар 3", bg=self.background_color, font=('Arial', 18))
  245. self.tank3_label_canvas.place(x=800, y=260)
  246.  
  247. def Exit_btn_func(self):
  248. self.Exit_btn = Exit().exit()
  249. if self.Exit_btn > 0:
  250. self.window.destroy()
  251. return
  252.  
  253. def check_condition_water_tank_one(self):
  254. if self.sum == 1:
  255. return 444
  256. elif self.sum == 2:
  257. return 368
  258. elif self.sum == 3:
  259. return 292
  260. elif self.sum == 4:
  261. return 216
  262. elif self.sum == 5:
  263. return 140
  264. else:
  265. return 515
  266.  
  267.  
  268. def check_condition_water_tank_two(self):
  269. if self.sum == 1:
  270. return 904
  271. elif self.sum == 2:
  272. return 828
  273. elif self.sum == 3:
  274. return 752
  275. elif self.sum == 4:
  276. return 676
  277. elif self.sum == 5:
  278. return 600
  279. else:
  280. return 975
  281.  
  282. def check_condition_water_tank_three(self):
  283. if self.sum == 1:
  284. return 604
  285. elif self.sum == 2:
  286. return 528
  287. elif self.sum == 3:
  288. return 452
  289. elif self.sum == 4:
  290. return 376
  291. elif self.sum == 5:
  292. return 300
  293. else:
  294. return 675
  295.  
  296. def update_water_tank_one(self):
  297. self.sum = GPIO.input(29) + GPIO.input(31) + GPIO.input(33) + GPIO.input(35) + GPIO.input(37)
  298.  
  299. self.y1 = self.check_condition_water_tank_one()
  300. self.canvas.coords(self.waterOne, 80, self.y1, 360, 520)
  301.  
  302. self.window.after(1000, self.update_water_tank_one)
  303.  
  304. def check_condition_pipe(self):
  305. if self.sum == 1:
  306. return 600
  307. else:
  308. return 700
  309.  
  310. def update_pipe(self):
  311. self.sum = GPIO.input(40)
  312.  
  313. self.y1 = self.check_condition_pipe()
  314. self.canvas.coords(self.pipeWater, 500, self.y1, 600, 700)
  315.  
  316. self.window.after(1000, self.update_pipe)
  317.  
  318. def update_water_tank_two(self):
  319. self.sum = GPIO.input(15) + GPIO.input(13) + GPIO.input(12) + GPIO.input(16) + GPIO.input(11)
  320.  
  321. self.y1 = self.check_condition_water_tank_two()
  322. self.canvas.coords(self.waterTwo, 80, self.y1, 360, 980)
  323.  
  324. self.window.after(1000, self.update_water_tank_two)
  325.  
  326. def update_water_tank_three(self):
  327. self.sum = GPIO.input(18) + GPIO.input(22) + GPIO.input(21) + GPIO.input(23) + GPIO.input(24)
  328.  
  329. self.y1 = self.check_condition_water_tank_three()
  330. self.canvas.coords(self.waterThree, 800, self.y1, 1080, 680)
  331.  
  332. self.window.after(1000, self.update_water_tank_three)
  333.  
  334. def pump_one_on_func(self):
  335. PumpOneOn()
  336.  
  337. def pump_one_off_func(self):
  338. PumpOneOff()
  339.  
  340. def pump_two_on_func(self):
  341. PumpTwoOn()
  342.  
  343. def pump_two_off_func(self):
  344. PumpTwoOff()
  345.  
  346. def drain_func(self):
  347. TankDrain()
  348.  
  349. def overflow_btn_on(self):
  350. if int(self.tank2_value_inside.get()[:-1]) + int(self.tank1_value_inside.get()[:-1]) != 100 \
  351. or self.sequence2_var.get() == self.sequence1_var.get():
  352. messagebox.showwarning("Предупреждение", "Въведените данни не са равни на 100%!")
  353. else:
  354. print("OK!")
  355.  
  356. def overflow_btn_off(self):
  357. ...
  358.  
  359.  
  360. if __name__ == "__main__":
  361. root = tk.Tk()
  362. obj = Window(root)
  363. obj.update_water_tank_one()
  364. obj.update_water_tank_two()
  365. obj.update_water_tank_three()
  366. obj.update_pipe()
  367. root.mainloop()
  368.  
  369.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement