Search code examples
pythonpython-3.xtkintergpio

tkinter image change within a label when i gpio state changes


i am trying to use an image inside a label to show a change in the gpio state, i have been able to use text to change but now would like to use a picture of and led and a fish image. but i cant get it to find the image.

import tkinter as tk
import time
import RPi.GPIO as GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
#Setup input GPIO pins for use with optical infrared sensors
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)  # SUMP LOW WATER LEVEL SENSOR
GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_UP)  # SUMP NORM WATER LEVEL SENSOR
GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_UP)  # SUMP HIGH WATER LEVEL SENSOR
GPIO.setup(26, GPIO.IN, pull_up_down=GPIO.PUD_UP)  # RO LOW WATER LEVEL SENSOR
GPIO.setup(5, GPIO.IN, pull_up_down=GPIO.PUD_UP)   # DISPLAY HIGH WATER LEVEL
#GPIO.setup(6, GPIO.IN, pull_up_down=GPIO.PUD_UP)  # MAY USE AS PROTIEN SKIMMER SENSOR
GPIO.setup(13, GPIO.IN, pull_up_down=GPIO.PUD_UP)  # DISPLAY LOW WATER LEVEL SENSOR
#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(7, GPIO.OUT)   # AUTO TOP OFF PUMP
#Setup output GPIO pins for use with Red Yellow and Green LEDS
GPIO.setup(23, GPIO.OUT)  # DISPLAY HIGH WATER LEVEL RED LED
GPIO.setup(24, GPIO.OUT)  # DISPLAY NORM WATER LEVEL GREEN LED
GPIO.setup(25, GPIO.OUT)  # DISPLAY LOW WATER LEVEL YELLOW LED
GPIO.setup(12, GPIO.OUT)  # AUTO TOP OFF LOW LEVEL RED LED
GPIO.setup(16, GPIO.OUT)  # SUMP HIGH WATER LEVEL RED LED
GPIO.setup(20, GPIO.OUT)  # SUMP NORMAL WATER LEVEL GREEN LED
GPIO.setup(21, GPIO.OUT)  # SUMP LOW WATER LEVEL YELLOW LED
#setup fonts
ftb= 'Verdana', 12, 'bold'
def photo2():

    photo2= oraled.png
#setup class for the tk program
class gpio(tk.Tk):
    def __init__(root, *args, **kwargs):
        tk.Tk.__init__(root, *args, **kwargs)
        root.title("trial")
        root.geometry("430x830")
        root.configure(bg="lightblue")
    #setup image 
        root.photo1 = tk.PhotoImage(file="fish.gif") #defines a photo and gives the file name
        root.label1 = tk.Label(root, image=root.photo1)#puts label in the window in this case not text file must be in program folder
        root.label1.place(x=0, y=0) #says how to place the label
#setup display high sensor label
        root.photo2 = tk.PhotoImage(file='oraled.png')
        root.dishisensorlabel= tk.Label(root, image="")
        root.dishisensorlabel.place(x=210, y=500)

        labeldishisensor= tk.Label(root,text=("Display High"), font=(ftb), fg="black")
        labeldishisensor.place(x=0, y=500)        


        root.update_gpio()
    def update_gpio(root):
        dhsen =('fish.gif' if GPIO.input(5) else 'oraled')
        root.dishisensorlabel.configure(image=dhsen)    

        root.after(200, root.update_gpio)

if __name__== "__main__":
    app = gpio()
    app.mainloop()

i get the following errors i am running this in thorney while i delevelop the script

>>> %Run 'use of images for leds.py'
Traceback (most recent call last):
  File "/home/pi/use of images for leds.py", line 63, in <module>
    app = gpio()
  File "/home/pi/use of images for leds.py", line 55, in __init__
    root.update_gpio()
  File "/home/pi/use of images for leds.py", line 58, in update_gpio
    root.dishisensorlabel.configure(image=dhsen)
  File "/usr/lib/python3.7/tkinter/__init__.py", line 1485, in configure
    return self._configure('configure', cnf, kw)
  File "/usr/lib/python3.7/tkinter/__init__.py", line 1476, in _configure
    self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
_tkinter.TclError: image "fish.gif" doesn't exist
>>> 

any help would be appreciated


Solution

  • final code

    import tkinter as tk
    import time
    import RPi.GPIO as GPIO
    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BCM)
    #Setup input GPIO pins for use with optical infrared sensors
    GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)  # SUMP LOW WATER LEVEL SENSOR
    GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_UP)  # SUMP NORM WATER LEVEL SENSOR
    GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_UP)  # SUMP HIGH WATER LEVEL SENSOR
    GPIO.setup(26, GPIO.IN, pull_up_down=GPIO.PUD_UP)  # RO LOW WATER LEVEL SENSOR
    GPIO.setup(5, GPIO.IN, pull_up_down=GPIO.PUD_UP)   # DISPLAY HIGH WATER LEVEL
    #GPIO.setup(6, GPIO.IN, pull_up_down=GPIO.PUD_UP)  # MAY USE AS PROTIEN SKIMMER SENSOR
    GPIO.setup(13, GPIO.IN, pull_up_down=GPIO.PUD_UP)  # DISPLAY LOW WATER LEVEL SENSOR
    #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(7, GPIO.OUT)   # AUTO TOP OFF PUMP
    #Setup output GPIO pins for use with Red Yellow and Green LEDS
    GPIO.setup(23, GPIO.OUT)  # DISPLAY HIGH WATER LEVEL RED LED
    GPIO.setup(24, GPIO.OUT)  # DISPLAY NORM WATER LEVEL GREEN LED
    GPIO.setup(25, GPIO.OUT)  # DISPLAY LOW WATER LEVEL YELLOW LED
    GPIO.setup(12, GPIO.OUT)  # AUTO TOP OFF LOW LEVEL RED LED
    GPIO.setup(16, GPIO.OUT)  # SUMP HIGH WATER LEVEL RED LED
    GPIO.setup(20, GPIO.OUT)  # SUMP NORMAL WATER LEVEL GREEN LED
    GPIO.setup(21, GPIO.OUT)  # SUMP LOW WATER LEVEL YELLOW LED
    #setup fonts
    ftb= 'Verdana', 12, 'bold'
    #setup class for the tk program
    class gpio(tk.Tk):
        def __init__(root, *args, **kwargs):
            tk.Tk.__init__(root, *args, **kwargs)
            root.title("Heads Up")
            root.geometry("430x830")
            root.Greenoff= tk.PhotoImage(file="greenoff.png")
            root.Greenon= tk.PhotoImage(file="GreenOnworking.png")
            root.Yellowoff= tk.PhotoImage(file="yellowoff.png")
            root.Yellowon= tk.PhotoImage(file="yellowon.png")        
            root.Redoff= tk.PhotoImage(file="redoff.png")
            root.Redon= tk.PhotoImage(file="redon.png")    
            root.pumpoffnew= tk.PhotoImage(file="pumpoffnew.png")
            root.pumponnew= tk.PhotoImage(file="pumponnew.png")
            root.pumpoffr= tk.PhotoImage(file="pumpoffr.png")
            root.pumponr= tk.PhotoImage(file="pumponr.png")
            root.pwrhdon= tk.PhotoImage(file="pwrhdon.png")
            root.pwrhdoff= tk.PhotoImage(file="pwrhdoff.png")
            root.gyreon= tk.PhotoImage(file="gyreon.png")
            root.gyreoff= tk.PhotoImage(file="gyreoff.png")
            root.sensorin= tk.PhotoImage(file="sensorin.png")
            root.sensorout= tk.PhotoImage(file="sensorout.png")
            root.lowsensorin= tk.PhotoImage(file="lowsensorin.png")
            root.lowsensorout= tk.PhotoImage(file="lowsesorout.png")
            root.normsensorin= tk.PhotoImage(file="normsensorin.png")
            root.normsensorout= tk.PhotoImage(file="normsesorout.png")
            root.highsensorin= tk.PhotoImage(file="highsensorin.png")
            root.disphighsensorout= tk.PhotoImage(file="disphighsesorout.png")
        #setup image 
            root.photo1 = tk.PhotoImage(file="background.png") #defines a photo and gives the file name
            root.label1 = tk.Label(root, image=root.photo1)#puts label in the window in this case not text file must be in program folder
            root.label1.place(x=0, y=0) #says how to place the label
        #setup exit button
            Exitbutton= tk.Button(root, text="Exit", font=(ftb), width=5, bg="red", fg="white", command=root.destroy)
            Exitbutton.place(x=20, y=600)
        # setup display water high light
            root.dishighlabel =tk.Label(root,)
            root.dishighlabel.place(x=291, y=91)
    
        # setup display water norm  light
            root.disnormlabel =tk.Label(root,)
            root.disnormlabel.place(x=203, y=91)
    
        # setup display water low light
            root.dislowlabel =tk.Label(root,)
            root.dislowlabel.place(x=114, y=91)
    
        # setup sump water high light
            root.sumphighlabel =tk.Label(root,)
            root.sumphighlabel.place(x=218, y=287)
    
        # setup sump water norn light
            root.sumpnormlabel=tk.Label(root,)
            root.sumpnormlabel.place(x=154, y=287)
    
            root.sumplowlabel=tk.Label(root,)
            root.sumplowlabel.place(x=90, y=287)
    
        # setup Ato water low light label
            root.atopledsensorlabel=tk.Label(root,)
            root.atopledsensorlabel.place(x=337, y=287)
    
        #set up return pump 1 labels
            root.rtnp1label = tk.Label(root,)
            root.rtnp1label.place(x=45, y=330)
    
    
        #setup return pump 2 labels                  
            root.rtnp2label = tk.Label(root,)
            root.rtnp2label.place(x=250, y=330)
    
    
        #setup gyre pump labels
            root.gyrelabel =tk.Label(root, text="")
            root.gyrelabel.place(x=357, y=65)
    
    
        #setup powerhead 1 labels
            root.pwrhd1label = tk.Label(root, text="")
            root.pwrhd1label.place(x=43, y=65)
    
    
        #setup powerhead 2 labels
            root.pwrhd2label = tk.Label(root, text="")
            root.pwrhd2label.place(x=43, y=95)
    
        #setup ato pump labels
            root.atoppumplabel = tk.Label(root, text="")
            root.atoppumplabel.place(x=312, y=330)
    
    
    
        #setup display high sensor label
            root.dishisensorlabel= tk.Label(root, text="")
            root.dishisensorlabel.place(x=0, y=30)
    
    
        #setup display low sensor label
            root.dislosensorlabel= tk.Label(root, text="")
            root.dislosensorlabel.place(x=0, y=82)
    
    
        #setup sump high sensor label
            root.sumhisensorlabel= tk.Label(root, text="")
            root.sumhisensorlabel.place(x=0, y=227)
    
        #setup sump norm sensor label
            root.sumnorsensorlabel= tk.Label(root, text="")
            root.sumnorsensorlabel.place(x=0, y=279)
            
        #setup sump low sensor label
            root.sumlowsensorlabel= tk.Label(root, text="")
            root.sumlowsensorlabel.place(x=0, y=332)
    
        #setup ato sensor label
            root.atopsensorlabel= tk.Label(root, text="")
            root.atopsensorlabel.place(x=399, y=335)
    
    
    # start the GPIO checks"        
            root.update_gpio()
    
        def update_gpio(root):
        #sensors
            dhsen =(root.disphighsensorout if GPIO.input(5) else root.highsensorin)
            root.dishisensorlabel.configure(image=dhsen,)
            dlsen =(root.lowsensorout if GPIO.input(13) else root.lowsensorin)
            root.dislosensorlabel.configure(image=dlsen,)
            shsen =(root.disphighsensorout if GPIO.input(22) else root.highsensorin)
            root.sumhisensorlabel.configure(image=shsen,)
            snsen =(root.normsensorout if GPIO.input(27) else root.normsensorin)
            root.sumnorsensorlabel.configure(image=snsen,)
            slsen =(root.lowsensorout if GPIO.input(17) else root.lowsensorin)
            root.sumlowsensorlabel.configure(image=slsen,)
            atosen =(root.sensorout if GPIO.input(26) else root.sensorin)
            root.atopsensorlabel.configure(image=atosen,)
    
        #leds
            atop = (root.Redon if GPIO.input(12) else root.Greenon)
            root.atopledsensorlabel.configure(image=atop,)
            sumh = (root.Redon if GPIO.input(16) else root.Redoff)
            root.sumphighlabel.configure(image=sumh,)
            sumn = (root.Greenon if GPIO.input(20) else root.Greenoff)
            root.sumpnormlabel.configure(image=sumn,)
            suml = (root.Yellowon if GPIO.input(21) else root.Yellowoff)
            root.sumplowlabel.configure(image=suml,)
            dish = (root.Redon if GPIO.input(23) else root.Redoff)
            root.dishighlabel.configure(image=dish,)
            disn = (root.Greenon if GPIO.input(24) else root.Greenoff)
            root.disnormlabel.configure(image=disn,)
            disl = (root.Yellowon if GPIO.input(25) else root.Yellowoff)
            root.dislowlabel.configure(image=disl,)                            
        #pumps
            rt1 = (root.pumponnew if GPIO.input(2) else root.pumpoffnew)
            root.rtnp1label.configure(image=rt1,)
            rt2 = (root.pumponr if GPIO.input(3) else root.pumpoffr)
            root.rtnp2label.configure(image=rt2,)
            ph2 = (root.pwrhdon if GPIO.input(9) else root.pwrhdoff)
            root.pwrhd2label.configure(image=ph2,)
            ph1 = (root.pwrhdon if GPIO.input(11) else root.pwrhdoff)
            root.pwrhd1label.configure(image=ph1,)
            gyr = (root.gyreon if GPIO.input(4) else root.gyreoff)
            root.gyrelabel.configure(image=gyr,)
            top1 =(root.pumpoffnew if GPIO.input(7) else root.pumponnew)
            root.atoppumplabel.configure(image=top1,)
            
            # call this function again in one second
            root.after(1000, root.update_gpio)
    
    if __name__== "__main__":
        app = gpio()
        app.mainloop()
    

    hope this helps others trying to do this type of thing.