首页 文章

Tkinter GUI冻结 - 解锁/线程提示?

提问于
浏览
1

python3的新手,开始了我的第一个项目,即使用树莓派3创建一个界面来监控和控制温室中的元素 . 目前,该程序通过DHT11传感器读取温度和湿度,并通过GPIO引脚控制多个继电器和 Servo .

我创建了一个GUI来显示每250ms读取和更新的温度和湿度 . 还有许多控制特定继电器/ Servo 的按钮 .

我现在遇到了按钮按下tkinter GUI冻结的一些问题 . 我已经在论坛上看了一下,但不明白如何实现线程或检查功能,以防止我的GUI冻结 .

代码如下:

from tkinter import *
import tkinter.font
import RPi.GPIO as GPIO
import time
import Adafruit_DHT

#Logic Setup

temp = 0
humd = 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("Test")
win.geometry("200x300+0+0")

#Label Setup

Label (win, text="Temperature", fg="red", bg="black", font="24").grid(row=0, column=0)
Label (win, text="Humidity", fg="red", bg="black", font="24").grid(row=0, column=2)
Label (win, text="Water System", fg="red", bg="black", font="24").grid(row=3, column=0)

TEMP = Label (win, text="", fg="black", bg="white", font="36")
TEMP.grid(row=1, column=0)

HUMD = Label (win, text="", fg="black", bg="white", font="36")
HUMD.grid(row=1, column=2)

#Functions

def wait(time_lapse):
    time_start = time.time()
    time_end = (time_start+time_lapse)

    while time_end >= time.time():
        pass

def RTEMP ():
    global temp
    humidity, temperature = Adafruit_DHT.read_retry(11, 27)
    temp = temperature * 9/5.0 + 32
    TEMP.configure(text=str(temp))

def RHUMD ():
    global humd
    humidity, temperature = Adafruit_DHT.read_retry(11, 27)
    humd = humidity
    HUMD.configure(text=str(humd))        

def READ ():
    RTEMP()
    RHUMD()
    win.after(250, READ)

def PUMP ():
    if GPIO.input(18):
        WTR.config(bg="green")
        GPIO.output(16, GPIO.HIGH)
        wait (10)
        GPIO.output(16, GPIO.LOW)
        WTR.config(text="Water", bg="grey")
    else:
        GPIO.output(16, GPIO.LOW)
        WTR.config(text="LOW WATER", bg="red")

#Buttons

WTR = Button(win, text="Water", bg="grey", command = PUMP, height = 2, width = 8)
WTR.grid(row=4, column=0) #Water Pump Control

#Function Calls

READ()

mainloop()

1 回答

  • 1

    Tkinter GUI(以及大多数其他GUI)处于永久等待状态 . 没有理由引入明确的等待事件 .

    如果你需要运行一些函数,然后在10ms后再运行一些其他函数,你可以安排其他代码运行 after . 例如:

    GPIO.output(16, GPIO.HIGH)
        win.after(10, GPIO.output, 16, GPIO.LOW)
    

    当然,如果你想做多件事,你可以使用 lambda 或写另一个函数 .

相关问题