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

时间:2016-06-10 14:52:48

标签: python-3.x tkinter

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

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

我现在遇到了按下按钮时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 个答案:

答案 0 :(得分:1)

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

如果您需要运行某些功能,然后在10ms后运行其他功能,您可以安排其他代码与after一起运行。例如:

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

当然,如果你想做多件事,你可以使用lambda或写另一个功能。