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 -- http://mail.python.org/mailman/listinfo/python-list