【发布时间】:2016-06-10 16:23:48
【问题描述】:
更新:
所以我成功地实现了线程,以允许 GUI 在进程运行时保持畅通。现在我正试图弄清楚如何让这个 while 循环中断并仍然正常运行。
我尝试实现第二个变量,while 语句将其视为一个标志,以尝试在其中运行一次 PUMP 函数后打破 while 循环。但是,现在 PUMP 功能根本不运行。 GPIO 引脚永远不会变高。 我要做什么:
-按下按钮。 - 将标志设置为 1 - 如果浮子开关为高位,则在线程中运行 RUN() 函数/如果浮子开关为低位,则发出低水位信号 - RUN() 在运行 PUMP() 函数时检查标志和浮动开关的状态 - PUMP() 将 GPIO 引脚变为高电平,并在 5 秒后调用 OFF() 函数 - OFF () 将标志设置为 0,并将泵 GPIO 设置为低
如果在 PUMP() 期间浮动开关变低,它应该触发并调用 LOW() 函数,通过将 GPIO 引脚设置为低并显示状态来停止泵。这也将标志设置为 0。
代码:
from tkinter import *
import tkinter.font
import RPi.GPIO as GPIO
import threading
#Variables
Flag = 0
#GPIO Setup
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(16, GPIO.OUT) #Water Pump
GPIO.setup(18, GPIO.IN) #Tank Float Switch
GPIO.output(16, GPIO.LOW)
#Window Setup
win = Tk()
win.title("Pump Test")
win.geometry("150x150+0+0")
#Label Setup
Label (win, text="Water System", fg="red", bg="black", font="24").grid(row=0, column=0)
#Functions
def RUN ():
while GPIO.input(18) and Flag == 1:
PUMP()
if Flag == 0:
OFF()
elif GPIO.input(18) == False:
LOW()
def OFF ():
Flag = 0
GPIO.output(16, GPIO.LOW)
WTR.config(text="Water", bg="grey")
def LOW ():
Flag = 0
GPIO.output(16, GPIO.LOW)
WTR.config(text="LOW WATER", bg="red")
def WTR ():
Flag = 1
if GPIO.input(18):
threading.Thread(target=RUN).start()
if GPIO.input(18)== False:
threading.Thread(target=LOW).start()
def PUMP ():
GPIO.output(16, GPIO.HIGH)
win.after(5000, OFF)
#Buttons
WTR = Button(win, text="Water", bg="grey", command = WTR, height = 2, width = 8)
WTR.grid(row=1, column=0) #Water Pump Control
mainloop()
【问题讨论】:
-
很明显,我不需要使用 wait() 函数而是实现 win.after(time) 。但我仍然不确定如何中断实际过程。也许是一个 do-while 逻辑?
-
看来我实际上需要研究线程。一个线程处理 GUI 和 Pump,一个线程设置标志和跟踪 Float 传感器。
-
这不会有太大帮助,但摆脱繁忙的循环,只需使用
time.sleep() -
你可能想看看这个:stackoverflow.com/questions/459083/…
-
@mauenza:
time.sleep()在 GUI 的主线程中是个坏主意。它将阻止 GUI 响应所有事件,包括与刷新窗口相关的事件。
标签: python-3.x tkinter raspberry-pi