A learning exercise...yet another Sudoku solver with GUI

2006-01-18 Thread engsolnorm

A co-worker and I want to increase our knowledge of Python. I have a tiny bit 
of exposure to python. He has none, but
has wide experience with C, C++, NET, C#, etc. We agreed we'd do a Sudoku 
solver.  I'd do the GUI, he would do the
solver code.

My question is this: I assume that once I invoke mauinloop, the loop just 
cycles between bound events...(if not true,
please tell me)...so how do I "branch" out to the solver code, which will be in 
another module? Is that the function of
my "SOLVE" button..i.e., the callback associated with the SOLVE button 'asks' 
for an updated cell list, then writes the
cell values to the GUI? I'm stuck..:)

I've posted the entire GUI code below..please forgive the length. Usage: when a 
cell has the focus (mouse-over),
pressing a number key will cause that number to be displayed in that cell. Any 
other key will 'erase' the currently
displayed cell number, if any.

Thanks,
Norm



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():
root = Tk()
root.withdraw() # do this to remove the "blank screen"
filepath = tkFileDialog.askopenfilename(filetypes=[("all files", "*")])
# return filepath # Do something with this later...but for now...
print filepath

def save_file():
root = Tk()
root.withdraw() # do this to remove the "blank screen"
filename = tkFileDialog.asksaveasfilename()
# return filename # Do something with this later...but for now...
print filename

def mouse_in(event):
  event.widget.config(highlightcolor = 'blue')
  event.widget.focus_set()

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'))

  for ia in range(81):
if event.widget is cell[ia][0]:
  cell[ia][2] = event.keysym
  #print cell[ia][1], '   ', cell[ia][2]
  
#-- 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', f

The "real" name

2006-01-21 Thread engsolnorm
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

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: The "real" name

2006-01-21 Thread engsolnorm
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("",
>  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...:)
ThanksNorm

# 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