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