Python Forum
Where should I place GPIO.cleanup()
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Where should I place GPIO.cleanup()
#1
My code is really long with multiple programs running at the same time. Is it really a must to use GPIO.cleanup()? And if it is, where should I use it in my code?

from tkinter import *
import RPi.GPIO as GPIO
from tkinter import ttk
from tkinter import font as tkfont
import time


GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

GPIO.setup(17,GPIO.OUT)#motor
GPIO.setup(27,GPIO.OUT)#LED
GPIO.setup(26,GPIO.OUT)#buzzer
GPIO.output (17, False)
GPIO.output (27, False)
GPIO.output (26, False)


root = Tk()
root.geometry("2000x1900")
root.config(bg="light blue")
root.frame = Frame(root)

label = Label(root, bg = "light blue", fg = "dark blue", font=("Arial 50 italic"))
label.place(relx=0.48, rely = 0.32, anchor = CENTER)
title_label=Label(root, text="MEDICATION SCHEDULE", font = "Arial 80 ",bg="light grey",fg='black',relief='solid',bd=8)
title_label.place(relx=0.47, rely = 0.16,anchor = CENTER)


root.title("Smart Medicine Box")
alarm1_input_compare= ''
alarm2_input_compare= ''
alarm3_input_compare = ''
AFTER=None


def set_alarm1():
    global alarm1_input_compare
    alarm1_input_compare=comboHour1.get()+":"+comboMin1.get()+":00"+comboAM1.get()
    alarm1_input_display=comboHour1.get()+":"+comboMin1.get()+" "+comboAM1.get()
    alarm1_label.config(text="Time Set: "+alarm1_input_display)
    alarm1_label.place(relx=0.135, rely = 0.5, anchor = NW)
    print(alarm1_input_compare)
    comboHour1.place_forget()
    comboMin1.place_forget()
    comboAM1.place_forget()
    colon1_label.place_forget()
    morning_alarm_button.place_forget()
    change_morn_alarm_button.place(relx=0.2, rely = 0.58, anchor = CENTER)

def change_alarm1():
    change_morn_alarm_button.place_forget()
    morning_alarm_button.place(relx=0.198, rely = 0.58, anchor = CENTER)
    comboHour1.place(relx=0.16, rely = 0.52, anchor = CENTER)
    comboMin1.place(relx=0.2, rely = 0.52, anchor = CENTER)
    comboAM1.place(relx=0.235, rely = 0.52, anchor = CENTER)
    alarm1_label.place_forget()
    
def set_alarm2():
    global alarm2_input_compare
    alarm2_input_compare=comboHour2.get()+":"+comboMin2.get()+":00"+comboAM2.get()
    alarm2_input_display=comboHour2.get()+":"+comboMin2.get()+" "+comboAM2.get()
    alarm2_label.config(text="Time Set: "+alarm2_input_display)
    alarm2_label.place(relx=0.38, rely = 0.5, anchor = NW)
    print(alarm2_input_compare)
    comboHour2.place_forget()
    comboMin2.place_forget()
    comboAM2.place_forget()
    noon_alarm_button.place_forget()
    colon2_label.place_forget()
    change_aft_alarm_button.place(relx=0.45, rely = 0.58, anchor = CENTER)
   
def change_alarm2():
    change_aft_alarm_button.place_forget()
    noon_alarm_button.place(relx=0.45, rely = 0.58, anchor = CENTER)
    comboHour2.place(relx=0.415, rely = 0.52, anchor = CENTER)
    comboMin2.place(relx=0.46, rely = 0.52, anchor = CENTER)
    comboAM2.place(relx=0.495, rely = 0.52, anchor = CENTER)
    alarm2_label.place_forget()
    
def set_alarm3():
    global alarm3_input_compare
    alarm3_input_compare=comboHour3.get()+":"+comboMin3.get()+":00"+comboAM3.get()
    alarm3_input_display=comboHour3.get()+":"+comboMin3.get()+" "+comboAM3.get()
    alarm3_label.config(text="Time Set: "+alarm3_input_display)
    alarm3_label.place(relx=0.64, rely = 0.5, anchor = NW)
    print(alarm3_input_compare)
    comboHour3.place_forget()
    comboMin3.place_forget()
    comboAM3.place_forget()
    colon3_label.place_forget()
    change_even_alarm_button.place(relx=0.705, rely = 0.58, anchor = CENTER)
   
def change_alarm3():
    change_even_alarm_button.place_forget()
    even_alarm_button.place(relx=0.705, rely = 0.58, anchor = CENTER)
    comboHour3.place(relx=0.67, rely = 0.52, anchor = CENTER)
    comboMin3.place(relx=0.718, rely = 0.52, anchor = CENTER)
    comboAM3.place(relx=0.753, rely = 0.52, anchor = CENTER) 
    alarm3_label.place_forget()
    

def add_medication1():
    noon_med_button["state"]='disabled'
    even_med_button["state"]='disabled'
    morn_med_Text.place(relx=0.21, rely = 0.85, anchor = CENTER)
    morn_med_label.place_forget()
    morn_med_button.place_forget()
    confirm_button1.place(relx=0.105, rely = 0.85, anchor = CENTER)
    keyboard(1)
    
    
def confirm1():
    noon_med_button["state"]='normal'
    even_med_button["state"]='normal'
    morn_med=morn_med_Text.get("1.0",END)
    morn_med_label.place(relx=0.21, rely = 0.88, anchor = CENTER)
    morn_med_Text.place_forget()
    confirm_button1.place_forget()
    morn_med_button.place(relx=0.21, rely = 0.72, anchor = CENTER)
    morn_med_label.config(text=morn_med)
    root.frame.grid_forget()

            
def add_medication2():
    morn_med_button["state"]='disabled'
    even_med_button["state"]='disabled'
    noon_med_Text.place(relx=0.45, rely = 0.845, anchor = CENTER)
    noon_med_button.place_forget()
    noon_med_label.place_forget()
    confirm_button2.place(relx=0.345, rely = 0.85, anchor = CENTER)
    keyboard(2)


def confirm2():
    morn_med_button["state"]='normal'
    even_med_button["state"]='normal'
    noon_med=noon_med_Text.get("1.0",END)
    noon_med_label.place(relx=0.46, rely = 0.88,anchor = CENTER)
    noon_med_Text.place_forget()
    confirm_button2.place_forget()
    noon_med_button.place(relx=0.458, rely = 0.72, anchor = CENTER)
    noon_med_label.config(text=noon_med)
    root.frame.grid_forget()
        
    
def add_medication3():
    noon_med_button["state"]='disabled'
    morn_med_button["state"]='disabled'
    even_med_Text.place(relx=0.72, rely = 0.85, anchor = CENTER)
    even_med_button.place_forget()
    even_med_label.place_forget()
    confirm_button3.place(relx=0.615, rely = 0.85, anchor = CENTER)
    keyboard(3)

def confirm3():
    noon_med_button["state"]='normal'
    morn_med_button["state"]='normal'
    even_med=even_med_Text.get("1.0",END)
    even_med_label.place(relx=0.72, rely = 0.88,anchor = CENTER)
    even_med_Text.place_forget()
    confirm_button3.place_forget()
    even_med_button.place(relx=0.72, rely = 0.72, anchor = CENTER)
    even_med_label.config(text=even_med)
    root.frame.grid_forget()


def keyboard(number):
    root.frame = Frame(bg="light blue")
    root.frame.grid()
    
    def select(value):
        if number==1:
            cursor_position=morn_med_Text.index(INSERT)
            if value == "Clear":
                morn_med_Text.delete(1.0,END)
            elif value == "Enter":
                morn_med_Text.insert(INSERT,'\n')
            elif value=="Bkspce":
                text=morn_med_Text.get(1.0,cursor_position)
                newtext=text[:-1]
                morn_med_Text.delete(1.0,cursor_position)
                morn_med_Text.insert(INSERT,newtext)
            else:
                morn_med_Text.insert(cursor_position, value)
        elif number==2:
            cursor_position=noon_med_Text.index(INSERT)
            if value == "Clear":
                noon_med_Text.delete(1.0,END)
            elif value == "Enter":
                noon_med_Text.insert(INSERT,'\n')
            elif value=="Bkspce":
                text=noon_med_Text.get(1.0,cursor_position)
                newtext=text[:-1]
                noon_med_Text.delete(1.0,cursor_position)
                noon_med_Text.insert(INSERT,newtext)

            else:
                noon_med_Text.insert(cursor_position,value)
        else:
            cursor_position=even_med_Text.index(INSERT)
            if value == "Clear":
                even_med_Text.delete(1.0,END)
            elif value == "Enter":
                even_med_Text.insert(INSERT,'\n')
            elif value=="Bkspce":
                text=even_med_Text.get(1.0,cursor_position)
                newtext=text[:-1]
                even_med_Text.delete(1.0,cursor_position)
                even_med_Text.insert(INSERT,newtext)
            else:
                even_med_Text.insert(cursor_position, value)
    buttons=[
    '~','1','2','3','4','5','6','7','8','9','0','Bkspce',
    'q','w','e','r','t','y','u','i','o','p','-','"',
    'a','s','d','f','g','h','j','k','l','+','Enter','Clear',
    'z','x','c','v','b','n','m',',','.','/','(',')',
    ' '
]

    label1=Label(root.frame,text='\n\n\n\n\n\n\n\n')
    label1.grid(row=7,columnspan=1)
    label2=Label(root.frame,text='\n\n\n\n\n\n\n')
    label2.grid(row=15,columnspan=1)
    varRow=9
    varColumn=0

    for button in buttons:
        command=lambda x=button: select(x)
        if button!=" ":
            Button(root.frame,text=button,width=7,bg="black",fg="white",
                       activebackground="white",activeforeground="black",relief='raised',padx=0,
                       pady=7,bd=4,command=command,font=("Arial",28 )).grid(row=varRow,column=varColumn)
        if button==" ":
            Button(root.frame,text=button,width=80,bg="black",fg="white",
                       activebackground="white",activeforeground="black",relief='raised',padx=4,
                       pady=7,bd=8,command=command,font=("Arial",15 )).grid(row=13,columnspan=17)
        varColumn+=1
        if varColumn>11 and varRow==9:
            varColumn=0
            varRow+=1
        if varColumn>11 and varRow==10:
            varColumn=0
            varRow+=1
        if varColumn>11 and varRow==11:
            varColumn=0
            varRow+=1
            
def alarm_message():
    root.frame = Frame(bg="red")
    root.frame.grid()
    change_colour()
    title_message=Label(root.frame, text="TAKE YOUR \n MEDICATION ", font = "Arial 150 ",fg='white',bg='black')
    title_message.grid(row=0,column=0,padx=80,pady=300)
    taken_button = Button(root.frame, text="Done",command=button_pressed, font=("Arial", 80),bd=10)  
    taken_button.grid(row=0,column=1,padx=45,pady=100)
        
def change_colour():
    global AFTER
    colour1=root.frame.cget("bg")
    if colour1=="red":
        GPIO.output(27, True)
        root.frame.config(bg="blue")
    if colour1=="blue":
        GPIO.output(27, False)
        root.frame.config(bg="red")                

    AFTER=root.after(1000,change_colour)
    
root.after(1000,change_colour)

    
def button_pressed():
    root.frame.grid_forget()
    print('Button pressed')
    root.after_cancel(AFTER)
    GPIO.output (27, False)
    GPIO.output (26, False)
    time.sleep(0.2)


def tick():
    current_time_display = time.strftime("%I:%M %p, %d %B %Y, %A", time.localtime())
    current_time_compare = time.strftime("%I:%M:%S%p", time.localtime())
    label.config(text=current_time_display)

    if (alarm1_input_compare == current_time_compare) or (alarm2_input_compare== current_time_compare) or (alarm3_input_compare== current_time_compare):
        root.frame.grid_forget()
        root.after_cancel(AFTER)
        print("1on")
        #GPIO.output (27, True)#LED
        GPIO.output (26, True)#buzzer            
        GPIO.output (17, True)#motor
        time.sleep(5)
        GPIO.output (17, False)
        alarm_message()
            
    #updates label every 200ms
    label.after(200, tick)

#morning combobox
comboHour1= ttk.Combobox(root,  width = 3, values=["01","02","03","04","05","06","07","08","09","10","11","12"],font=("Arial", 20))
comboMin1 = ttk.Combobox(root, width = 3,values=["00","01","02","03","04","05","06","07","08","09", "10","11","12","13","14" ,"15","16","17","18","19","20","21","22","23","24", "25", "26","27","28","29","30","31","32","33","34", "35","36","37", "40","41","42","43" ,"44","45","47","48", "50","51","54", "55","57"],font=("Arial", 20))
comboHour1.current(0)
comboMin1.current(0)
comboAM1 = ttk.Combobox(root, width = 3,values=["AM","PM"],font=("Arial", 20))
comboAM1.current(0)

#set font for "Morning/Afternoon/Evening" labels
fontlabel=tkfont.Font(family='Arial', size=46,weight=tkfont.BOLD,underline=1)

#"Morning" label
alarm1_label1=Label(root, text="Morning", font = fontlabel,bg="light blue")
alarm1_label1.place(relx=0.135, rely = 0.4, anchor = NW)
#time set label
alarm1_label=Label(root,bg="light blue",font="Arial 20 italic bold",fg="maroon")
#colon in between morning combobox
colon1_label=Label(root, text=":", font = "Arial 20",bg="light blue")
colon1_label.place(relx=0.176, rely = 0.504, anchor = NW)

#button to set morning alarm
morning_alarm_button = Button(root, text="Set Morning Alarm", command=set_alarm1,font=("Arial", 18))
change_morn_alarm_button = Button(root, text="Change Morning Alarm", command=change_alarm1,font=("Arial", 18))
change_alarm1()
#afternoon combobox
comboHour2= ttk.Combobox(root,  width = 3, values=["01","02","03","04","05","06","07","08","09","10","11","12"],font=("Arial", 20))
comboMin2 = ttk.Combobox(root, width = 3,values=["00", "05", "10", "15", "20", "22","23","24","25", "30", "35", "40", "45", "50", "55"],font=("Arial", 20))
comboHour2.current(0)
comboMin2.current(0)
comboAM2 = ttk.Combobox(root, width = 3,values=["AM","PM"],font=("Arial", 20))
comboAM2.current(0)

#"Afternoon" label
alarm2_label1=Label(root, text="Afternoon", font = fontlabel,bg="light blue")
alarm2_label1.place(relx=0.37, rely = 0.4, anchor = NW)

#colon in between afternoon combobox
colon2_label=Label(root, text=":", font = "Arial 20 ",bg="light blue")
colon2_label.place(relx=0.435, rely = 0.504, anchor = NW)
alarm2_label=Label(root, bg="light blue",font="Arial 20 bold italic",fg="maroon")
#button to set afternoon alarm
noon_alarm_button = Button(root, text="Set Afternoon Alarm", command=set_alarm2, font=("Arial", 18))  
change_aft_alarm_button = Button(root, text="Change Afternoon Alarm", command=change_alarm2,font=("Arial", 18))
change_alarm2()
#evening combobox
comboHour3= ttk.Combobox(root,  width = 3, values=["01","02","03","04","05","06","07","08","09","10","11","12"],font=("Arial", 20))
comboMin3 = ttk.Combobox(root, width = 3,values=["00", "05", "10", "15", "20", "25", "30", "35", "40", "45", "50", "55"],font=("Arial", 20))
comboHour3.current(0)
comboMin3.current(0)
comboAM3 = ttk.Combobox(root, width = 3,values=["AM","PM"],font=("Arial", 20))
comboAM3.current(0)

#"Evening" label
alarm3_label1=Label(root, text="Evening", font = fontlabel,bg="light blue")
alarm3_label1.place(relx=0.64, rely = 0.4, anchor = NW)
alarm3_label=Label(root, bg="light blue",font="Arial 20 bold italic",fg="maroon")
#colon in between evening combobox
colon3_label=Label(root, text=":", font = "Times 20",bg="light blue")
colon3_label.place(relx=0.69, rely = 0.504, anchor = NW)

#button to set evening alarm
even_alarm_button = Button(root, text="Set Evening Alarm", command=set_alarm3, font=("Arial", 18))  
change_even_alarm_button = Button(root, text="Change Evening Alarm", command=change_alarm3,font=("Arial", 18))
change_alarm3()
#Textbox to input morning medications
morn_med_Text=Text(root,width=18,height=8,font=("Arial", 20))
morn_med_label=Label(root,bg="light blue", font=("Arial",20))
morn_med_button = Button(root, text="Add Medication(s)", command=add_medication1, font=("Arial", 18),state='normal')  
morn_med_button.place(relx=0.21, rely = 0.72, anchor = CENTER)
confirm_button1=Button(root, text="Confirm", command=confirm1, font=("Arial", 18)) 


med_label1=Label(root, text="Morning Medication(s): ",bg="light blue", font=("Arial 18 bold"))
med_label1.place(relx=0.14, rely = 0.66)
#Textbox to input afternoon medications
noon_med_Text=Text(root,width=18,height=8,font=("Arial", 20))
noon_med_label=Label(root,bg="light blue", font=("Arial",20 ))

#button to input medications;converts input in textbox to label
noon_med_button = Button(root, text="Add Medication(s)", command=add_medication2, font=("Arial", 18),state='normal')  
noon_med_button.place(relx=0.458, rely = 0.72, anchor = CENTER)
confirm_button2=Button(root, text="Confirm", command=confirm2, font=("Arial", 18)) 

med_label2=Label(root, text="Afternoon Medication(s): ",bg="light blue", font=("Arial 18 bold"))
med_label2.place(relx=0.385, rely = 0.66)
even_med_label=Label(root, bg="light blue", font=("Arial",20 ))
#Textbox to input evening medications
even_med_Text=Text(root,width=18,height=8,font=("Arial", 20))

#button to input medications;converts input in textbox to label
even_med_button = Button(root, text="Add Medication(s)", command=add_medication3, font=("Arial", 18),state='normal')  
even_med_button.place(relx=0.72, rely = 0.72, anchor = CENTER)
confirm_button3=Button(root, text="Confirm", command=confirm3, font=("Arial", 18)) 


med_label3=Label(root, text="Evening Medication(s): ",bg="light blue", font=("Arial 18 bold"))
med_label3.place(relx=0.65, rely = 0.66)



#call clock function
tick()
root.mainloop()
Reply
#2
You don't have to use it.

If you set a pin as output and then connect it incorrectly (say set the pin to HIGH and then connect to ground), you can damage the device. GPIO.cleanup() just notices any pins you've set to output and returns them to input when called.

If your program runs forever, you may not have any clean exit points. If you were really worried about this, you should probably set the pins to output only when actually controlling something, and then set them back to input when complete and waiting in between.

But if it's in a case and you're not moving wires around, I wouldn't bother.
LouF likes this post
Reply
#3
Alright, thank you!
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  place 2 windows exactly above each other janeik 3 923 Jul-23-2023, 03:12 AM
Last Post: deanhystad
  function return boolean based on GPIO pin reading caslor 2 1,170 Feb-04-2023, 12:30 PM
Last Post: caslor
  class Update input (Gpio pin raspberry pi) caslor 2 785 Jan-30-2023, 08:05 PM
Last Post: caslor
  Webhook, post_data, GPIO partial changes DigitalID 2 980 Nov-10-2022, 09:50 PM
Last Post: deanhystad
  Seemingly unstable GPIO output while executing from RetroPie LouF 6 3,915 Feb-19-2021, 06:29 AM
Last Post: LouF
  Cannot 'break' from a "for" loop in a right place tester_V 9 3,961 Feb-17-2021, 01:03 AM
Last Post: tester_V
  Picture changing triggered by GPIO q_nerk 2 2,561 Dec-14-2020, 03:32 PM
Last Post: DeaD_EyE
  GPIO high if network IP has good ping duckredbeard 3 2,326 Oct-12-2020, 10:41 PM
Last Post: bowlofred
  raspberry pi tank gpio help jatgm1 1 2,396 May-06-2020, 09:00 PM
Last Post: Larz60+
  Orange PI Win steering LEDs connect to GPIO djmcg 0 1,529 Dec-27-2019, 08:26 AM
Last Post: djmcg

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020