Search code examples
pythontkintergpio

tkinter how to get a label to refresh without a button click to show GPIO state


This code is part of a aquarium controller gui which i am work on. When this starts up it automatically displays the current state of the GPIO pins in label****state LABEL. What i am trying to do is find away of getting it to refresh the labels every 20 Seconds. i would prefer if this could be done with a button click.. iam not sure if this is possible or not.I am new to python so any help would be appreciated

import RPi.GPIO as GPIO
import time
import tkinter as tk
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
#setup output pins for relay control
GPIO.setup(2, GPIO.OUT)   #return pump 1 ch 1 cutoff relay in series with GPIO(8)
GPIO.setup(3, GPIO.OUT)   #return pump 2 ch 2 relay
GPIO.setup(4, GPIO.OUT)   #gyre pump ch3 relay
GPIO.setup(8, GPIO.OUT)   #used for return pump 1
GPIO.setup(9, GPIO.OUT)   #power head 2 ch 5 relay
GPIO.setup(11, GPIO.OUT)  #power head 1 ch
GPIO.setup(19, GPIO.OUT)  #SPARE relay output
GPIO.setup(14, GPIO.OUT)  #SPARE relay output
GPIO.setup(15, GPIO.OUT)  #SPARE relay output
GPIO.setup(18, GPIO.OUT)  #SPARE relay outlet
#set the outputs to high on startup
#GPIO.output(2, GPIO.HIGH)  # return pump 1
#GPIO.output(3, GPIO.HIGH)  # return pump 2
#GPIO.output(4, GPIO.HIGH)  # gyre pump
#GPIO.output(9, GPIO.HIGH)  # powerhead 2
#GPIO.output(11, GPIO.HIGH) # powerhead 1
#GPIO.output(19, GPIO.HIGH) # Spare
#GPIO.output(14, GPIO.HIGH) # Spare
#GPIO.output(15, GPIO.HIGH) # Spare
#GPIO.output(18, GPIO.HIGH) # Spare
time.sleep(1)
#setup tkinter
root=tk.Tk()
root.title("Johns Aquarium")
root.geometry("800x550")
root.configure(bg="lightblue")
#setup image 
photo1 = tk.PhotoImage(file="fish.gif") #defines a photo and gives the file name
label1 = tk.Label(image=photo1)#puts label in the window in this case not text file must be in program folder
label1.grid(row=10, column=0, columnspan=12) #says how to place the label
#setup fonts
ftlab= 'Verdana', 13, 'bold'
ftb= 'Verdana', 11, 'bold'
#setup exit button
Exitbutton= tk.Button(root, text="Exit", font=(ftb), width=6, bg="red", fg="white", command=root.destroy)
Exitbutton.place(x=700, y=240)
#setup return pump 1
labelreturn1= tk.Label(root, text=("RETURN PUMP 1"), font=(ftlab), bg="yellow", fg="black")
labelreturn1.place(x=0, y=300)
labelreturn1gpio= tk.Label(root, text=("GPIO          2"), font=(ftlab), bg="black", fg="white")
labelreturn1gpio.place(x= 670, y=300)
labelreturn1state= tk.Label(root, font=(ftlab), fg="black")
labelreturn1state.place(x=550, y=296)
labelreturn1state.configure(text='   Auto   ' if GPIO.input(2) else '     Off   ')
#setup return pump 2
labelreturn2= tk.Label(root, text=("RETURN PUMP 2"), font=(ftlab), bg="yellow", fg="black")
labelreturn2.place(x=0, y=335)
labelreturn2gpio= tk.Label(root, text=("GPIO          3"), font=(ftlab), bg="black", fg="white")
labelreturn2gpio.place(x= 670, y=335)
labelreturn2state= tk.Label(root, font=(ftlab), fg="black")
labelreturn2state.place(x=550, y=331)
labelreturn2state.configure(text='     On    ' if GPIO.input(3) else '     Off   ')

#setup gyre pump buttons and labels
labelgyre= tk.Label(root, text=("GYRE WAVE       "), font=(ftlab), bg="green", fg="black")
labelgyre.place(x=0, y=400)
labelgyregpio= tk.Label(root, text=("GPIO         4"), font=(ftlab), bg="black", fg="white")
labelgyregpio.place(x= 670, y=400)
labelgyrestate= tk.Label(root, font=(ftlab), fg="black")
labelgyrestate.place(x=550, y=396)
labelgyrestate.configure(text='     On    ' if GPIO.input(4) else '     Off   ')
#setup power head 1 pump
labelpwrhd1= tk.Label(root, text=("POWER HEAD  1"), font=(ftlab), bg="orange", fg="black")
labelpwrhd1.place(x=0, y=450)
labelpwrhd1gpio= tk.Label(root, text=("GPIO        11"), font=(ftlab), bg="black", fg="white")
labelpwrhd1gpio.place(x= 670, y=450)
labelpwrhd1state= tk.Label(root, font=(ftlab), fg="black")
labelpwrhd1state.place(x=550, y=446)
labelpwrhd1state.configure(text='     On    ' if GPIO.input(11) else '     Off   ')
#setup powerhead 2 buttons and labels
labelpwrhd2= tk.Label(root, text=("POWER HEAD  2"), font=(ftlab), bg="orange", fg="black")
labelpwrhd2.place(x=0, y=496)
labelpwrhd2gpio= tk.Label(root, text=("GPIO          9"), font=(ftlab), bg="black", fg="white")
labelpwrhd2gpio.place(x= 670, y=496)
labelpwrhd2state= tk.Label(root, font=(ftlab), fg="black")
labelpwrhd2state.place(x=550, y=496)
labelpwrhd2state.configure(text='     On    ' if GPIO.input(9) else '     Off   ')

root.mainloop()

Solution

  • well after playing around i have managed to get the answer to get around this with the following code. the only issue i see is when i click the feed button the program calls for a 20 minute stop on the GPIO pins. so it will not update the labels during this break. but hope this helps people of ways it can be done

    import tkinter as tk
    import time
    import RPi.GPIO as GPIO
    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BCM)
    #setup output pins for relay control
    GPIO.setup(2, GPIO.OUT)   #return pump 1 ch 1 cutoff relay in series with GPIO(8)
    GPIO.setup(3, GPIO.OUT)   #return pump 2 ch 2 relay
    GPIO.setup(4, GPIO.OUT)   #gyre pump ch3 relay
    GPIO.setup(8, GPIO.OUT)   #used for return pump 1
    GPIO.setup(9, GPIO.OUT)   #power head 2 ch 5 relay
    GPIO.setup(11, GPIO.OUT)  #power head 1 ch 
    ftlab= 'Verdana', 13, 'bold'
    ftb= 'Verdana', 11, 'bold'
    #setup tkinter
    def rtn1auto():
        GPIO.output(2, GPIO.HIGH)
    def rtn1off():
        GPIO.output(2, GPIO.LOW)
    def rtn2on():
        GPIO.output(3, GPIO.HIGH)
    def rtn2off():
        GPIO.output(3, GPIO.LOW)
    def pwrhd1on():
        GPIO.output(11, GPIO.HIGH)
    def pwrhd1off():
        GPIO.output(11, GPIO.LOW)
    def pwrhd2on():
        GPIO.output(9, GPIO.HIGH)
    def pwrhd2off():
        GPIO.output(9, GPIO.LOW)
    def gyreon():
        GPIO.output(4, GPIO.HIGH)
    def gyreoff():
        GPIO.output(4, GPIO.LOW)
    def rtn1feed():
        time.sleep(15)
        GPIO.output(2, GPIO.LOW)
        time.sleep(3)
        GPIO.output(3, GPIO.LOW)
        time.sleep(3)
        GPIO.output(4, GPIO.LOW)
        time.sleep(3)
        GPIO.output(11, GPIO.LOW)
        time.sleep(3)
        GPIO.output(9, GPIO.LOW)
        time.sleep(1200)
        GPIO.output(2, GPIO.HIGH)
        time.sleep(3)
        GPIO.output(3, GPIO.HIGH)
        time.sleep(3)
        GPIO.output(4, GPIO.HIGH)
        time.sleep(3)
        GPIO.output(11, GPIO.HIGH)
        time.sleep(3)
        GPIO.output(9, GPIO.HIGH)
    class gpio(tk.Tk):
        def __init__(root, *args, **kwargs):
            tk.Tk.__init__(root, *args, **kwargs)
            root.title("johns")
            root.geometry("800x550")
            root.configure(bg="lightblue")
            #setup exit button
            Exitbutton= tk.Button(root, text="Exit", font=(ftb), width=6, bg="red", fg="white", command=root.destroy)
            Exitbutton.place(x=700, y=240)
            #setup image 
            #photo1 = tk.PhotoImage(file="fish.gif") #defines a photo and gives the file name
            #label1 = tk.Label(root, image=photo1)#puts label in the window in this case not text file must be in program folder
            #label1.place(x=0, y=0) #says how to place the label
    
        #set up return pump 1 buttons and labels
            root.rtnp1label = tk.Label(root, text="")
            root.rtnp1label.place(x=560, y=300)
            labelreturn1= tk.Label(root, text=("RETURN PUMP 1"), font=(ftlab), bg="yellow", fg="black")
            labelreturn1.place(x=0, y=300)
            butreturn1auto= tk.Button(root, text=("AUTO RUN"), font=(ftb), command=rtn1auto)
            butreturn1auto.place(x=180, y=296)
            butreturn1off= tk.Button(root, text=("PUMP OFF"), font=(ftb), command=rtn1off)
            butreturn1off.place(x= 300, y=296)
            labelreturn1gpio= tk.Label(root, text=("GPIO          2"), font=(ftlab), bg="black", fg="white")
            labelreturn1gpio.place(x= 670, y=300)
        #setup return pump 2 buttons and labels                  
            root.rtnp2label = tk.Label(root, text="")
            root.rtnp2label.place(x=560, y=335)
            labelreturn2= tk.Label(root, text=("RETURN PUMP 2"), font=(ftlab), bg="yellow", fg="black")
            labelreturn2.place(x=0, y=335)
            butreturn2on= tk.Button(root, text=("PUMP  ON"), font=(ftb), command=rtn2on)
            butreturn2on.place(x=180, y=331)
            butreturn2off= tk.Button(root, text=("PUMP OFF"), font=(ftb), command=rtn2off)
            butreturn2off.place(x= 300, y= 331)
            labelreturn2gpio= tk.Label(root, text=("GPIO          3"), font=(ftlab), bg="black", fg="white")
            labelreturn2gpio.place(x= 670, y=335)
        #setup powerhead 2 buttons and labels
            root.pwrhd2label = tk.Label(root, text="")
            root.pwrhd2label.place(x=560, y=496)
            labelpwrhd2= tk.Label(root, text=("POWER HEAD  2"), font=(ftlab), bg="orange", fg="black")
            labelpwrhd2.place(x=0, y=496)
            butpwrhd2= tk.Button(root, text=("PUMP  ON"), font=(ftb), command=pwrhd2on)
            butpwrhd2.place(x=180, y=492)
            butpwrhd2= tk.Button(root, text=("PUMP OFF"), font=(ftb), command=pwrhd2off)
            butpwrhd2.place(x= 300, y= 492)
            labelpwrhd2gpio= tk.Label(root, text=("GPIO          9"), font=(ftlab), bg="black", fg="white")
            labelpwrhd2gpio.place(x= 670, y=496)
        #setup powerhead 1 buttons and lbels
            root.pwrhd1label = tk.Label(root, text="")
            root.pwrhd1label.place(x=560, y=450)
            labelpwrhd1= tk.Label(root, text=("POWER HEAD  1"), font=(ftlab), bg="orange", fg="black")
            labelpwrhd1.place(x=0, y=450)
            butpwrhd1= tk.Button(root, text=("PUMP  ON"), font=(ftb), command=pwrhd1on)
            butpwrhd1.place(x=180, y=446)
            butpwrhd1= tk.Button(root, text=("PUMP OFF"), font=(ftb), command=pwrhd1off)
            butpwrhd1.place(x= 300, y= 446)
            labelpwrhd1gpio= tk.Label(root, text=("GPIO        11"), font=(ftlab), bg="black", fg="white")
            labelpwrhd1gpio.place(x= 670, y=450)
        #setup gyre pump buttons and labels
            root.gyrelabel =tk.Label(root, text="")
            root.gyrelabel.place(x=560, y=400)
            labelgyre= tk.Label(root, text=("GYRE WAVE       "), font=(ftlab), bg="green", fg="black")
            labelgyre.place(x=0, y=400)
            butgyreon= tk.Button(root, text=("PUMP  ON"), font=(ftb), command=gyreon)
            butgyreon.place(x=180, y=396)
            butgyreoff= tk.Button(root, text=("PUMP OFF"), font=(ftb), command=gyreoff)
            butgyreoff.place(x= 300, y= 396)
            labelgyregpio= tk.Label(root, text=("GPIO         4"), font=(ftlab), bg="black", fg="white")
            labelgyregpio.place(x= 670, y=400)
        #setup feed button       
            butreturn1feed= tk.Button(root, text=("20 MINUTE ") + ("FEED TIMER"),wraplength=90, font=(ftb),bg="red",
                                      height=12, command=rtn1feed)
            butreturn1feed.place(x= 420, y=296) 
            # start the GPIO checks"
            root.update_gpio()
    
        def update_gpio(root):
            rt1 = ('      On      ' if GPIO.input(2) else '      Off     ')
            root.rtnp1label.configure(text=rt1, bg ="yellow", font=(ftb))
            rt2 = ('      On      ' if GPIO.input(3) else '      Off     ')
            root.rtnp2label.configure(text=rt2, bg ="yellow", font=(ftb))
            ph2 = ('      On      ' if GPIO.input(9) else '      Off     ')
            root.pwrhd2label.configure(text=ph2, bg ="yellow", font=(ftb))
            ph1 = ('      On      ' if GPIO.input(11) else '      Off     ')
            root.pwrhd1label.configure(text=ph1, bg ="yellow", font=(ftb))
            gyr = ('      On      ' if GPIO.input(4) else '      Off     ')
            root.gyrelabel.configure(text=gyr, bg ="yellow", font=(ftb))
            # call this function again in one second
            root.after(200, root.update_gpio)
    
    
    
    if __name__== "__main__":
        app = gpio()
        app.mainloop()