我是 RaspberryPi 和 Python 的新手,尤其是 Tkinter。我尝试为我制造的机器制作 GUI。有两个部分。一个是树莓派内向信号的检查部分(def Heater condition)。另一个是激励电路中继电器的命令部分(定义雾、定义触发等)。
但是当我运行 GUI 并按下 GUI 中的加热器条件检查按钮时,它不再起作用。因为在我的条件检查代码中,有 while 循环。我使用 while 循环来检查 RaspberryPi 向内信号。所以我想使用 Threading 模块来分离我的代码的两部分。我阅读了许多与此类问题相关的页面。但我仍然不知道如何使用类和线程。
如何将代码的两部分分开?
from tkinter import *
import RPi.GPIO as GPIO
import time
import tkinter.ttk as ttk
import threading
root = Tk()
root.wm_title("Air Cannon")
root.configure(bg='orange')
#root.geometry("640x480")
def Heat_condition():
GPIO.setmode(GPIO.BCM)
temp_in = 5
red_out = 13
blue_out = 6
triger = 18
GPIO.setup(temp_in, GPIO.IN)
GPIO.setup(red_out, GPIO.OUT)
GPIO.setup(blue_out, GPIO.OUT)
GPIO.setup(triger, GPIO.OUT)
blue_count = 0
red_count = 0
try:
while True:
if GPIO.input(temp_in) == True:
GPIO.output(red_out, True)
GPIO.output(blue_out, False)
#lb_heat["text"]="ON"
#red_count += 1
else:
GPIO.output(red_out, False)
GPIO.output(blue_out, True)
#lb_heat["text"]="OFF"
blue_count += 1
time.sleep(0.1)
except KeyboardInterrupt:
GPIO.cleanup()
print('red_count is {}'.format(red_count))
print('blue_count is {}'.format(blue_count))
print('End!!')
def fog():
GPIO.setmode(GPIO.BCM)
relay_1 = 18
relay_2 = 21
GPIO.setup(relay_1, GPIO.OUT)
GPIO.setup(relay_2, GPIO.OUT)
count_1 = 0
count_2 = 0
val = eval(Entry.get(dis_fog))
try:
GPIO.output(relay_2, True)
time.sleep(val) #val:3
GPIO.output(relay_2, False)
time.sleep(1)
count_2 += 1
GPIO.cleanup()
lb_fog["text"] = "Ready"
except KeyboardInterrupt:
GPIO.cleanup()
print('relay_2 counts {}'.format(count_2))
print('End!!')
def p_fog():
val = eval(Entry.get(dis_fog))
i = 0
for i in range(1,61):
time.sleep(val/100)
p_var_fog.set(i)
progbar_fog.update()
lb_fog["text"] = "Fog ON"
def fog_bar():
threading.Thread(target = fog).start()
threading.Thread(target = p_fog).start()
def trigger():
GPIO.setmode(GPIO.BCM)
relay_1 = 18
relay_2 = 21
GPIO.setup(relay_1, GPIO.OUT)
GPIO.setup(relay_2, GPIO.OUT)
count_1 = 0
count_2 = 0
val_1 = eval(Entry.get(dis_trig))
try:
GPIO.output(relay_1, True)
time.sleep(val_1) #val:0.15
GPIO.output(relay_1, False)
time.sleep(1)
count_1 += 1
GPIO.cleanup()
lb_trig["text"]="Ready"
except KeyboardInterrupt:
GPIO.cleanup()
print('relay_1 counts {}'.format(count_1))
print('End!!')
def p_trig():
val_1 = eval(Entry.get(dis_trig))
i = 0
for i in range(1,61):
time.sleep(val_1/100)
p_var_trig.set(i)
progbar_trig.update()
lb_trig_1["text"] = "!Fire!"
def trig_bar():
threading.Thread(target = trigger).start()
threading.Thread(target = p_trig).start()
#GUI name
lb_name = Label(root, text = "Air Cannon", font= "Verdana 26 bold", fg = 'black', bg='orange')
lb_name.grid(row=0, column=0)
#Heating Condition Text
Btn_con = Button(root, text = "Heater Condition", width=15, font= "Verdana 18" ,command = Heat_condition, bg='red')
lb_heat = Label(root, text = "Ready", font= "Verdana 15", fg = 'black', bg='orange')
Btn_con.grid(row=1, column=0)
lb_heat.grid(row=1, column=1)
#Fog Machine Button, text
Btn_fog = Button(root, text = "Fog Machine", width=15, font= "Verdana 18", command = fog_bar, bg='light gray')
dis_fog = Entry(root, width=15, justify="right")
inf_fog = Label(root, text = "(2~5 seconds)", font= "Verdana 12", fg = 'black', bg='orange')
lb_fog = Label(root, text = "Ready", font= "Verdana 15 bold", fg = 'black', bg='orange')
Btn_fog.grid(row=3, column=0)
dis_fog.grid(row=4, column=0)
inf_fog.grid(row=5, column=0)
lb_fog.grid(row=7, column=0)
p_var_fog = DoubleVar()
progbar_fog = ttk.Progressbar(root, maximum=60, length=100, variable=p_var_fog)
progbar_fog.grid(row=6, column=0)
#Trigger Button, text
Btn_trig = Button(root, text = "Fire", width=15, font= "Verdana 18", command = trig_bar, bg= 'light blue')
dis_trig = Entry(root, width=15, justify="right")
inf_trig = Label(root, text = "(0.1~0.3 seconds)", font= "Verdana 12", fg = 'black', bg='orange')
lb_trig = Label(root, text="Ready", font= "Verdana 15 bold", fg = 'black', bg='orange')
Btn_trig.grid(row=3, column=1)
dis_trig.grid(row=4, column=1)
inf_trig.grid(row=5, column=1)
lb_trig.grid(row=7, column=1)
p_var_trig = DoubleVar()
progbar_trig = ttk.Progressbar(root, maximum=60, length=100, variable=p_var_trig)
progbar_trig.grid(row=6, column=1)
def end():
root.destroy()
Btn_end = Button(root, text="END", command = end)
Btn_end.grid(row=10, column=3)
root.mainloop()