On Sat, 21 Jan 2006 14:23:49 -0800, James Stroud <[EMAIL PROTECTED]> wrote:
>[EMAIL PROTECTED] wrote: >> I'm playing with a sudoku GUI...just to learn more about python. >> >> I've made 81 'cells'...actually small canvases >> >> Part of my scheme to write the cells (all 81 of them in the gui) to a file >> (using the the SAVE callback/button), then >> restore the gui cells from the contents of the saved file, which depends on >> knowing the "name" of the cell with the >> focus, or one (or more) which have a number. >> >> The print shows .9919624.9990312, but this nunber (name?) does not work in: >> >> cell-name of cell-.create_text(18,18, text = somevar, fill = 'blue' , font = >> ('arial', 18, 'bold')) >> >> Also, how can I declare a variable outside of the mainloop/callback scheme >> which would be 'known' to the callbacks? >> >> Thanks, >> Norm >> > >I guess you are using tkinter. > >".9919624.9990312" in tkinter is just a string representation of the >underlying object, in this case a Canvas(). It is not up to a python >programmer to understand exactly what these numbers are. They are used >by Tcl/Tk internally. > >Tk objects are not pickleable. Better is to create a datastructure that >can be pickled from info gleaned specifically with the itemcget() >method. Example code is below. See the Pickle/cPickle documentation. >They are very easy to use. > >Since you haven't posted any code, I can only guess what you are doing. >But you may want to try variations on the following (read the comments): > >from Tkinter import * > ># This is how you may want to make a bunch of canvases in a grid. >def make_canvases(parent, rows=9, cols=9, **options): > """ > Pass in rows, cols, and any options the canvases should > require. > """ > cells = [] > for i in xrange(rows): > arow = [] > for j in xrange(cols): > c = Canvas(parent, **options) > c.grid(row=i, column=j) > arow.append(c) > cells.append(arow) > return cells > >def demo(): > """ > Tests out our make_canvases() function. > """ > > # tkinter stuff--setting up > tk = Tk() > f = Frame(tk) > f.pack(expand=YES, fill=BOTH) > > # make the canvases the gui-programmer way > canvases = make_canvases(f, height=25, width=25) > > # individual access to canvases (remember that indices start at 0) > canvases[0][0].configure(background='orange') > canvases[7][8].create_text(14, 8, text='Bob', > fill='blue', > font=('arial', 14, 'bold')) > canvases[8][8].create_text(14, 8, text='9,9', > fill='blue', > font=('arial', 14, 'bold')) > > # accessing inside loops > for i in xrange(9): > canvases[i][8-i].configure(background='red') > > # fun with bindings (see your last question) > # you should study this one! > for i in xrange(9): > for j in xrange(9): > c = canvases[i][j] > c.bind("<Button-1>", > lambda e=None, c=c: c.configure(background='green')) > > # getting out info > texts = [] > for i in xrange(9): > for j in xrange(9): > c = canvases[i][j] > for t in c.find_all(): > try: > text = c.itemcget(t, 'text') > texts.append((i,j,text)) > except: > pass > > # reporting the got-out info > Label(tk, text="Texts are: %s" % texts).pack(expand=YES, fill=X) > tk.mainloop() > >demo() Thanks for your reply, and those of others...all are helpful. As to the code I wrote (so far), her it is, complete with some expressions that didn't work too well...:) Thanks....Norm #======== Start GUI CODE ====================== from Tkinter import * import tkFileDialog fred = Tk() # Notice I have a bias against 'top', 'master', 'root', etc fred.title(' SUDOKU SCREEN') #fred.geometry('400x400') #fred.resizable(0,0) #------------------------------ Declare 9 frames plus one for the buttons fr1 = Frame(fred); fr2 = Frame(fred); fr3 = Frame(fred) fr4 = Frame(fred); fr5 = Frame(fred); fr6 = Frame(fred) fr7 = Frame(fred); fr8 = Frame(fred); fr9 = Frame(fred) bfr = Frame(fred, relief = 'raised', borderwidth = 1, pady = 10) #------------------------------ Set some vars ind = [3,4,5,12,13,14,21,22,23,27,28,29,33,34,35,36,37,38,42,43,44,45,46,47,51,52,53,57,58,59,66,67,68,75,76,77] fr_list = [fr1,fr2,fr3,fr4,fr5,fr6,fr7,fr8,fr9] can_list = ['can1','can2','can3','can4','can5','can6','can7','can8','can9'] cell = [] myvar = '' mykey = 'K' myadd = 'one' iy = 0 #------------------------------ Create 9 frames with 9 canvases in each for fitem in fr_list: for item in can_list: item = Canvas(fitem, width = 30, height = 30, borderwidth = 1, relief = 'solid') item.pack(side = LEFT, fill = BOTH) cell.append([item, iy, '-']) # List of [IDs, 0 to 80, key text] iy += 1 #------------------------------ Create some supporting (callback) functions def clr_scrn(): for iz in range(81): cell[iz][0].delete(ALL) def hint(): print 'Hint not implemented yet' def solve(): print 'Solve not implemented yet' def get_file(): cell_ID = "" cell_list = [] root = Tk() root.withdraw() # do this to remove the "blank screen" filename = tkFileDialog.askopenfilename() fp2 = open(filename, 'r+') for line in fp2: fp2.close() def save_file(): cell_num = "" cell_val = "" total = "" iy = 0 root = Tk() root.withdraw() # do this to remove the "blank screen" filename = tkFileDialog.asksaveasfilename() fp1 = open(filename, 'w' ) fp1.close() def mouse_in(event): event.widget.config(highlightcolor = 'blue') event.widget.focus_set() print 'event', event.widget def see_key(event): event.widget.delete(ALL) if event.keysym in '123456789': event.widget.create_text(18,18, text = event.keysym, font = ('arial', 18, 'bold')) else: event.widget.create_text(18,18, text = '', font = ('arial', 18, 'bold')) #------------------------------ Create some control buttons b_new = Button(bfr, text = 'NEW', relief = 'raised', command = clr_scrn ).pack(side = LEFT, padx = 10) b_open = Button(bfr, text = 'OPEN', relief = 'raised', command = get_file ).pack(side = LEFT, padx = 10) b_save = Button(bfr, text = 'SAVE', relief = 'raised', command = save_file).pack(side = LEFT, padx = 10) b_clr = Button(bfr, text = 'CLEAR', relief = 'raised', command = clr_scrn ).pack(side = LEFT, padx = 10) b_hint = Button(bfr, text = 'HINT', relief = 'raised', command = hint ).pack(side = LEFT, padx = 10) b_solve = Button(bfr, text = 'SOLVE', relief = 'raised', command = solve ).pack(side = LEFT, padx = 10) b_exit = Button(bfr, text = 'EXIT', relief = 'raised', command = fred.quit).pack(side = LEFT, padx = 10) #------------------------------ Now pass everything to the packer for item in fr_list: item.pack(side = TOP) bfr.pack(side = TOP) # Don't forget to add the buttons #------------------------------ Shade the sub-blocks for ix in ind: cell[ix][0].config(bg = 'grey') #------------------------------ Fill in a few cells just for drill cell[0][0].create_text(18,18, text = '3', fill = 'black', font = ('arial', 18, 'bold')) cell[1][0].create_text(18,18, text = '6', fill = 'black', font = ('arial', 18, 'bold')) cell[2][0].create_text(18,18, text = '9', fill = 'black', font = ('arial', 18, 'bold')) cell[3][0].create_text(18,18, text = '7', fill = 'black', font = ('arial', 18, 'bold')) cell[4][0].create_text(18,18, text = '5', fill = 'black', font = ('arial', 18, 'bold')) cell[5][0].create_text(18,18, text = '8', fill = 'black', font = ('arial', 18, 'bold')) cell[6][0].create_text(18,18, text = '4', fill = 'black', font = ('arial', 18, 'bold')) cell[7][0].create_text(18,18, text = '2', fill = 'black', font = ('arial', 18, 'bold')) cell[8][0].create_text(18,18, text = '1', fill = 'black', font = ('arial', 18, 'bold')) cell[77][0].create_text(18,18, text = '5', fill = 'blue' , font = ('arial', 18, 'bold')) for item in cell: item[0].bind('<Enter>', mouse_in) item[0].bind('<KeyPress>', see_key) mainloop() -- http://mail.python.org/mailman/listinfo/python-list