Tkinter
Scott David Daniels
Scott.Daniels at Acm.Org
Wed Feb 4 14:37:43 EST 2009
Luke wrote:
> 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:
> ...
> from Tkinter import *
> def MainWin():
> main=Tk()
> ...
> close_frame1=Button(frame1,text='close',bg='light gray',
> command=frame1.destroy)
> close_frame1.pack_propagate(0)
> close_frame1.pack(side=TOP, anchor=N,pady=25)
> if frame1.destroy==True:
> frame1=Frame(back_ground,width=213,height=480,bg='white')
> frame1.pack_propagate(0)
> frame1.pack(side=TOP,anchor=N)
> main.mainloop()
> MainWin()
>
> It may just be bad coding but either way I could use some help.
I'll tell you what I find helps me in exploring Tkinter: running
Idle in the "no-subprocesses" mode. Now the resulting system _is_
less stable and may well require you to restart from time to time,
but there is a compensation: you can see the effect of each
operation as you do it by hand, as well as checking expressions:
If in Windows:
run cmd
C:\> python -m idlelib.idle -n
If in Linux / MacOSx:
Start a terminal:
$ python -m idlelib.idle -n &
Once idle shows up,
>>> import Tkinter
>>> main = Tkinter.Tk()
<a window shows up>
...
Following through your code, you'll see you start the frame,
add the button, and, immediately after getting everything set
up, you check:
> if frame1.destroy==True:
Which it will never be (frame1.destroy is a method, not data).
Once you get the base set up, your code should runfrom events.
So, to get a single step farther:
At the top of the MainWin function, insert:
global frame1, close_frame1
Replace your "close_frame1 =" line down to end-o-function with:
def on_click():
global frame1, close_frame1
frame1.destroy()
frame1 =Frame(back_ground,width=213,height=480,bg='white')
frame1.pack_propagate(0)
frame1.pack(side=TOP,anchor=N)
close_frame1 = Button(frame1,text='retry', bg='light blue',
command=on_click)
close_frame1.pack_propagate(0)
close_frame1.pack(side=TOP, anchor=N,pady=25)
close_frame1 = Button(frame1,text='close',bg='light gray',
command=on_click)
close_frame1.pack_propagate(0)
close_frame1.pack(side=TOP, anchor=N,pady=25)
The "global" lines are needed so that on_click and MainWin (which both
set the two names) are talking about the same objects.
--Scott David Daniels
Scott.Daniels at Acm.Org
More information about the Python-list
mailing list