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