Tkinter

Francesco Bochicchio bockman at virgilio.it
Wed Feb 4 14:33:10 EST 2009


Luke ha scritto:
> Hello, I'm an inexperienced programmer and I'm trying to make a
> Tkinter window and have so far been unsuccessful in being able to
> delete widgets from the main window and then add new ones back into
> the window without closing the main window.
> 
> The coding looks similar to this:
> 
...


> It may just be bad coding but either way I could use some help.
> 
> Thanks


I fixed your code to do what you want, although I have no idea why you 
want it...

The main change is that you need to place the code to be executed when 
the button is clicked in a different function, and use the name of that
function as value of the on_command property of the button. Then you 
need to give back the control to Tkinter, calling the mainloop function
and when the button is clicked, your function is called.
This sort of ping-pong is called event-driven programming, and it is how 
most GUI toolkit work. The functions called when a GUI event occurs are 
called callbacks.

A secondary thing is that since both the main function and the callback 
read and change some 'variable' pointing to the widgets, you need to 
share them using python 'global' statement. Now, a better way to do it
would be incapsulate all in a class, but I wanted to stay as much as 
possible close to your code.

Finally, if you plan to to something that requires to dynamically create 
and destroy - or move arounds - graphical objects (not widgets), you 
might want to  have a look to the 'Canvas' widget.

Code follows after signature. Since the frame and the button are 
recreated just after having been destroyed, you just see them flicker.

Ciao
----
FB


--------------------------------------------

#
# Module-level variables referring to widgets
# used/changed by more than one function
#
back_ground = None
frame1 = None


def make_frame_and_button():
     global frame1, back_ground
     print 'background', back_ground
     frame1=Frame(back_ground,width=213,height=480,bg='white')
     print 'Frame1',  frame1
     frame1.pack_propagate(0)
     frame1.pack(side=TOP,anchor=N)
     frame1.pack_propagate(0)
     frame1.pack(side=TOP,anchor=N)
     close_frame1=Button(frame1,text='close', bg='blue',
                         command=on_close_button )
     print 'close_frame1', close_frame1
     close_frame1.pack_propagate(0)
     close_frame1.pack(side=TOP, anchor=N,pady=25)


def on_close_button():
     global frame1
     frame1.destroy()
     make_frame_and_button()


def MainWin():
     global back_ground, frame1
     main=Tk()
     main.geometry('640x480')
     back_ground=Frame(main,width=640,height=480,bg='black')
     back_ground.pack_propagate(0)
     back_ground.pack(side=TOP,anchor=N)
     make_frame_and_button()
     main.mainloop()


MainWin()



More information about the Python-list mailing list