覆盆子与穿线

2024-06-08 22:40:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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()

Tags: textgpiodefcountcolumnvalredroot