Search code examples
pythonfunctiontkintertk-toolkittkinter-entry

Why the 1st code runs and 2nd doesn't after defining it?


The 1st code completely works fine.

  • 1st Code

     from tkinter import *
     from tkinter import ttk
    
    
     win=Tk()  
     add=StringVar()
     sub=StringVar()
     pro=StringVar()
    
     def Find():
         add.set(float(ent00.get())+float(ent01.get()))
         sub.set(float(ent00.get())-float(ent01.get()))
         pro.set(float(ent00.get())*float(ent01.get()))
    
     ent00=Entry(win, width=15)
     ent00.grid(row=4, column=1, padx=10, pady=10, sticky='w')
     ent01=Entry(win, width=15)
     ent01.grid(row=5, column=1, padx=10, pady=10, sticky='w')
    
     lbl8=Label(win, text="Add", bg="crimson", fg="white", font=("times new roman",15,"bold")).grid(row=6, column=0, padx=20, pady=10, sticky='w')
     ent8=Entry(win, textvariable=add, width=15, state='readonly')
     ent8.grid(row=6, column=1, padx=10, pady=10, sticky='w')
    
     lbl15=Label(win, text="Subtract", bg="crimson", fg="white", font=("times new roman",15,"bold")).grid(row=7, column=0, padx=20, pady=10, sticky='w')
     ent15=Entry(win, textvariable=sub, width=15, state='readonly')
     ent15.grid(row=7, column=1, padx=10, pady=10, sticky='w')
    
     lbl9=Label(win, text="Product", bg="crimson", fg="white", font=("times new roman",15,"bold")).grid(row=8, column=0, padx=20, pady=10, sticky='w')
     ent9=Entry(win, textvariable=pro, width=15, state='readonly')
     ent9.grid(row=8, column=1, padx=10, pady=10, sticky='w')
    
     btn = Button(win, text = 'Calculate', command=Find, bd = '5', width=15, height=2)
     btn.grid(row=11, column=1, padx=20, pady=10)
    
     win.geometry("1400x700+250+250")
     win.mainloop()
    

But when I define it i.e. make it a function (As in the code below), it doesn't work. Also it doesn't even show any error. I am not understanding the reason for this issue.

  • 2nd Code:

     from tkinter import *
     from tkinter import ttk
    
     win=Tk()  
    
     def code():
         win=Tk()  
         add=StringVar()
         sub=StringVar()
         pro=StringVar()
    
         def Find():
             add.set(float(ent00.get())+float(ent01.get()))
             sub.set(float(ent00.get())-float(ent01.get()))
             pro.set(float(ent00.get())*float(ent01.get()))
    
         ent00=Entry(win, width=15)
         ent00.grid(row=4, column=1, padx=10, pady=10, sticky='w')
         ent01=Entry(win, width=15)
         ent01.grid(row=5, column=1, padx=10, pady=10, sticky='w')
    
         lbl8=Label(win, text="Add", bg="crimson", fg="white", font=("times new roman",15,"bold")).grid(row=6, column=0, padx=20, pady=10, sticky='w')
         ent8=Entry(win, textvariable=add, width=15, state='readonly')
         ent8.grid(row=6, column=1, padx=10, pady=10, sticky='w')
    
         lbl15=Label(win, text="Subtract", bg="crimson", fg="white", font=("times new roman",15,"bold")).grid(row=7, column=0, padx=20, pady=10, sticky='w')
         ent15=Entry(win, textvariable=sub, width=15, state='readonly')
         ent15.grid(row=7, column=1, padx=10, pady=10, sticky='w')
    
         lbl9=Label(win, text="Product", bg="crimson", fg="white", font=("times new roman",15,"bold")).grid(row=8, column=0, padx=20, pady=10, sticky='w')
         ent9=Entry(win, textvariable=pro, width=15, state='readonly')
         ent9.grid(row=8, column=1, padx=10, pady=10, sticky='w')
    
         btn = Button(win, text = 'Calculate', command=Find, bd = '5', width=15, height=2)
         btn.grid(row=11, column=1, padx=20, pady=10)
    
         win.geometry("1400x700+250+250")
         win.mainloop()
    
     btn1 = Button(win, text = 'OPEN CODE', command=code, bd = '5', width=20, height=2)
     btn1.grid(row=11, column=1, padx=20, pady=10)
     win.geometry("1400x700+250+250")
     win.mainloop()
    

Is there any kind of mistake I am doing leading to its non-working? ______________________


Solution

  • You are redefining win and then performing actions on that, which doesn't seem to play nice together. If you want to clear the screen and place new widgets, here's how I would do it:

    from tkinter import *
    from tkinter import ttk
    
    win=Tk()  
    
    def code():
        btn1.destroy()
        add=StringVar()
        sub=StringVar()
        pro=StringVar()
    
        def Find():
            add.set(float(ent00.get())+float(ent01.get()))
            sub.set(float(ent00.get())-float(ent01.get()))
            pro.set(float(ent00.get())*float(ent01.get()))
    
        ent00=Entry(win, width=15)
        ent00.grid(row=4, column=1, padx=10, pady=10, sticky='w')
        ent01=Entry(win, width=15)
        ent01.grid(row=5, column=1, padx=10, pady=10, sticky='w')
    
        lbl8=Label(win, text="Add", bg="crimson", fg="white", font=("times new roman",15,"bold")).grid(row=6, column=0, padx=20, pady=10, sticky='w')
        ent8=Entry(win, textvariable=add, width=15, state='readonly')
        ent8.grid(row=6, column=1, padx=10, pady=10, sticky='w')
    
        lbl15=Label(win, text="Subtract", bg="crimson", fg="white", font=("times new roman",15,"bold")).grid(row=7, column=0, padx=20, pady=10, sticky='w')
        ent15=Entry(win, textvariable=sub, width=15, state='readonly')
        ent15.grid(row=7, column=1, padx=10, pady=10, sticky='w')
    
        lbl9=Label(win, text="Product", bg="crimson", fg="white", font=("times new roman",15,"bold")).grid(row=8, column=0, padx=20, pady=10, sticky='w')
        ent9=Entry(win, textvariable=pro, width=15, state='readonly')
        ent9.grid(row=8, column=1, padx=10, pady=10, sticky='w')
    
        btn = Button(win, text = 'Calculate', command=Find, bd = '5', width=15, height=2)
        btn.grid(row=11, column=1, padx=20, pady=10)
    
    
    btn1 = Button(win, text = 'OPEN CODE', command=code, bd = '5', width=20, height=2)
    btn1.grid(row=11, column=1, padx=20, pady=10)
    win.geometry("1400x700+250+250")
    win.mainloop()
    

    I just removed the three lines modifying win in the code function and added btn1.destroy(), which removes the button we want to stop displaying from the window.