TK-grid problem, please help

James Stroud jstroud at mbi.ucla.edu
Sat Apr 21 06:08:27 EDT 2007


Ray wrote:
> hi, I have a question about how to use .grid_forget (in python/TK)
> 
> I need to work on grid repeatly. everytime when a button is pressed,
> the rows of grid is different. such like, first time, it generate 10 
> rows of data.
> 2nd time, it maybe only 5 rows. so I need a way to RESET the grid data
> every time. how can I do it? by grid_forger()?, then would anyone can 
> help on
> how to use grid_forget()
> the sample code as following:
> 
> #####begin of program###############
> 
> from Tkinter import *
> def mygrid(text):
>     ######## how to use grid_forget() to clean the grid??###########
>     rows = []
>     count=int(text)
>     for i in range(count):
>         cols = []
>         for j in range(4):
>             e = Entry(frame3, relief=RIDGE)
>             e.grid(row=i, column=j, sticky=NSEW)
>             e.insert(END, '%d.%d' % (i, j))
>             cols.append(e)
>             rows.append(cols)
> 
> 
> root=Tk()
> 
> frame1=Frame(root, width=150, height=100)
> frame1.pack()
> 
> text=Entry(frame1)
> text.pack(side=LEFT)
> 
> button=Button(frame1, text='generate grid', command=(lambda: 
> mygrid(text.get())))
> 
> button.pack()
> 
> frame2=Frame(root, width=150, height=100)
> frame2.pack()
> 
> button2=Button(frame2, text='exit', command=root.quit)
> button2.pack()
> 
> frame3=Frame(root, width=150, height=300)
> frame3.pack()
> 
> root.mainloop()
> 
> #####end of program###############


Using grid_forget() is probably optimization overkill, but may be handy 
for slower computers where you can watch the widgets appear one by one 
(older than about 5 years--for example original mac ibook). Also, you 
should get a good book on Tkinter because your design here will pretty 
difficult to maintain and is not very flexible.

But...if you want to know how it might be done with grid_forget using 
the code you already have (i.e. making widgets only if necessary):


#START#
from Tkinter import *
from tkMessageBox import showerror
def mygrid(text):
     ######## how to use grid_forget() to clean the grid??###########
     numrows = len(frame3.rows)
     try:
       count=int(text)
     except:
       showerror('Entry Error',
                 '''Hey, "%s" don't make an int, Fool!''' % text,
                 parent=frame3)
       return 'break'
     for i in range(count):
         if i < numrows:
           cols = frame3.rows[i]
         else:
           cols = [Entry(frame3, relief=RIDGE) for j in range(4)]
           frame3.rows.append(cols)
         for j in range(4):
             e = cols[j]
             e.grid(row=i, column=j, sticky=NSEW)
             e.delete(0,END)
             e.insert(END, '%d.%d' % (i, j))
     for i in range(i+1, numrows):
       for e in frame3.rows[i]:
         e.grid_forget()


root=Tk()

frame1=Frame(root, width=150, height=100)
frame1.pack()

text=Entry(frame1)
text.pack(side=LEFT)

button=Button(frame1, text='generate grid', command=(lambda: 
mygrid(text.get())))

button.pack()

frame2=Frame(root, width=150, height=100)
frame2.pack()

button2=Button(frame2, text='exit', command=root.quit)
button2.pack()

frame3=Frame(root, width=150, height=300)
# adding an attribute here
frame3.rows = []
frame3.pack()

root.mainloop()
#END#

Notice also the necessity for the "e.delete(0, END)" line to get the 
desired text in the entries.

Also demonstrated is how to handle poor input.

*Note*
Remember to always call the user "Fool" when he does something stupid.


James



More information about the Python-list mailing list