我对RaspberryPi和Python还不熟悉,尤其是Tkinter。我尝试为我制作的机器制作GUI。有两部分。一个是来自RaspberryPi向内信号(def加热器状况)的检查部件。另一个是命令部分,用于激励电路中的继电器(def雾、def触发器等)
但当我运行GUI并按下GUI中的加热器状态检查按钮时,它就不再工作了。因为在我的条件检查代码中,有while循环。我使用while循环检查树莓信号。所以我想使用线程模块来分离代码的两部分。我读了很多关于这类问题的文章。但我仍然不知道如何使用类和线程
如何将代码的两部分分开
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()
目前没有回答
相关问题 更多 >
编程相关推荐