The "real" name

engsolnorm at hotmail.com engsolnorm at hotmail.com
Sat Jan 21 18:40:29 EST 2006


On Sat, 21 Jan 2006 14:23:49 -0800, James Stroud <jstroud at ucla.edu> wrote:

>engsolnorm at hotmail.com 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()






More information about the Python-list mailing list