The "real" name

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • engsolnorm@hotmail.com

    #1

    The "real" name

    I'm playing with a sudoku GUI...just to learn more about python.

    I've made 81 'cells'...actua lly 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.999031 2, 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

  • Diez B. Roggisch

    #2
    Re: The "real&quot ; name

    > 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[color=blue]
    > 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.999031 2, but this nunber (name?) does not work in:
    >
    > cell-name of cell-.create_text(18 ,18, text = somevar, fill = 'blue' , font = ('arial', 18, 'bold'))[/color]

    I'm not entirely sure what you are after here. To me it sounds better to
    create names like

    "cell%i" % row * column

    just for the sake of having different names, but store the cell in a
    2-dimensional list called e.g. "cells"

    Then accessing the cell at x, y is simply

    cells[x][y].create_text(.. .)

    Does that make sense to you?
    [color=blue]
    >
    > Also, how can I declare a variable outside of the mainloop/callback scheme which would be 'known' to the callbacks?[/color]

    You can of course go for globals. Beside that, a callback can be
    anything callable. That means that you can go for something like this:

    class StatefulCallabl e(obkect):

    def __init__(self, some_state):
    self.state = some_state

    def __call__(self, *args): # I'm not sure what comes with the callback
    print "called with args %r and state %r" % (args, self.state)


    Then pass an instance of StatefulCallabl e as callback.

    Regards,

    Diez

    Comment

    • André

      #3
      Re: The "real&quot ; name

      engsolnorm@hotm ail.com wrote:[color=blue]
      > I'm playing with a sudoku GUI...just to learn more about python.
      >
      > I've made 81 'cells'...actua lly 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.999031 2, 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[/color]
      How about using a dict, something like (untested):
      cells = {}
      for row in range(1, 10):
      .. for column in range(1, 10):
      .. cells[(row, column)] = canvas() # or whatever you use to create
      a canvas

      Then, to put a value in a given cell, you simply to
      cell[(row, column)].create_text(.. .)

      André

      Comment

      • James Stroud

        #4
        Re: The "real&quot ; name

        engsolnorm@hotm ail.com wrote:[color=blue]
        > I'm playing with a sudoku GUI...just to learn more about python.
        >
        > I've made 81 'cells'...actua lly 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.999031 2, 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
        >[/color]

        I guess you are using tkinter.

        ".9919624.99903 12" 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(p arent, 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(ar ow)
        return cells

        def demo():
        """
        Tests out our make_canvases() function.
        """

        # tkinter stuff--setting up
        tk = Tk()
        f = Frame(tk)
        f.pack(expand=Y ES, 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(back ground='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(back ground='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(bac kground='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(exp and=YES, fill=X)
        tk.mainloop()

        demo()

        Comment

        • engsolnorm@hotmail.com

          #5
          Re: The &quot;real&quot ; name

          On Sat, 21 Jan 2006 14:23:49 -0800, James Stroud <jstroud@ucla.e du> wrote:
          [color=blue]
          >engsolnorm@hot mail.com wrote:[color=green]
          >> I'm playing with a sudoku GUI...just to learn more about python.
          >>
          >> I've made 81 'cells'...actua lly 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.999031 2, 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
          >>[/color]
          >
          >I guess you are using tkinter.
          >
          >".9919624.9990 312" 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(p arent, 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(ar ow)
          > return cells
          >
          >def demo():
          > """
          > Tests out our make_canvases() function.
          > """
          >
          > # tkinter stuff--setting up
          > tk = Tk()
          > f = Frame(tk)
          > f.pack(expand=Y ES, 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(back ground='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(back ground='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(bac kground='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(exp and=YES, fill=X)
          > tk.mainloop()
          >
          >demo()[/color]

          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,fr 8,fr9]
          can_list = ['can1','can2',' can3','can4','c an5','can6','ca n7','can8','can 9']
          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.as kopenfilename()
          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.as ksaveasfilename ()
          fp1 = open(filename, 'w' )
          fp1.close()

          def mouse_in(event) :
          event.widget.co nfig(highlightc olor = 'blue')
          event.widget.fo cus_set()
          print 'event', event.widget

          def see_key(event):
          event.widget.de lete(ALL)
          if event.keysym in '123456789':
          event.widget.cr eate_text(18,18 , text = event.keysym, font = ('arial', 18, 'bold'))
          else:
          event.widget.cr eate_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('<KeyPres s>', see_key)


          mainloop()



          Comment

          • James Stroud

            #6
            Re: The &quot;real&quot ; name

            engsolnorm@hotm ail.com wrote:[color=blue]
            > On Sat, 21 Jan 2006 14:23:49 -0800, James Stroud <jstroud@ucla.e du> wrote:
            >
            >[color=green]
            >>engsolnorm@ho tmail.com wrote:
            >>[color=darkred]
            >>>I'm playing with a sudoku GUI...just to learn more about python.
            >>>
            >>>I've made 81 'cells'...actua lly 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.999031 2, 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
            >>>[/color]
            >>
            >>I guess you are using tkinter.
            >>
            >>".9919624.999 0312" 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):
            >>[/color]
            >[color=green]
            >>from Tkinter import *[/color]
            >[color=green]
            >># This is how you may want to make a bunch of canvases in a grid.
            >>def make_canvases(p arent, 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(ar ow)
            >> return cells
            >>
            >>def demo():
            >> """
            >> Tests out our make_canvases() function.
            >> """
            >>
            >> # tkinter stuff--setting up
            >> tk = Tk()
            >> f = Frame(tk)
            >> f.pack(expand=Y ES, 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(back ground='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(back ground='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(bac kground='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(exp and=YES, fill=X)
            >> tk.mainloop()
            >>
            >>demo()[/color]
            >
            >
            > 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)[/color]

            Named references are useleless here, especially since you are putting
            these frames into a list later. In fact, you really don't need to create
            these frames because you can just use grid() to place your
            canvases...exce pt if you want resize behavior.
            [color=blue]
            > bfr = Frame(fred, relief = 'raised', borderwidth = 1, pady = 10)[/color]

            This frame you WILL want a named reference for, because you do adress it
            by name later.
            [color=blue]
            >
            > #------------------------------ 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,fr 8,fr9][/color]

            Better is to eliminate the fr# = Frame(fred) code above and replace this
            latter line with:

            fr_list = [Frame(fred) for i in xrange(9)]
            [color=blue]
            > can_list = ['can1','can2',' can3','can4','c an5','can6','ca n7','can8','can 9'][/color]

            This list is largely unecessary. Can do the same thing with xrange below.
            [color=blue]
            > 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[/color]

            1. "for item in can_list" could easily be "for item in xrange(9)", this
            would allow you to get rid of the can_list altogether, which will make
            your code easier to read and maintain.
            2. Are you sure you want to re-bind item here?
            [color=blue]
            > #------------------------------ 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.as kopenfilename()
            > 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.as ksaveasfilename ()
            > fp1 = open(filename, 'w' )
            > fp1.close()[/color]

            Instantiating another Tk here can cause difficut to track-down problems
            and erratic behavior if another Tk is already instantiated. Are you sure
            you want to do this? You do not want 2 Tk's!!
            [color=blue]
            > def mouse_in(event) :
            > event.widget.co nfig(highlightc olor = 'blue')
            > event.widget.fo cus_set()
            > print 'event', event.widget
            >
            > def see_key(event):
            > event.widget.de lete(ALL)
            > if event.keysym in '123456789':
            > event.widget.cr eate_text(18,18 , text = event.keysym, font = ('arial', 18, 'bold'))
            > else:
            > event.widget.cr eate_text(18,18 , text = '', font = ('arial', 18, 'bold'))[/color]

            Why are you re-binding event.keysym here? Clearer would be just binding
            the name keysym. You may not want to mess with event in this case
            because this event may get intercepted by another callback, etc.

            def see_key(event):
            event.widget.de lete(ALL)
            if keysym in '123456789':
            event.widget.cr eate_text(18,18 , text = keysym,
            font = ('arial', 18, 'bold'))
            else:
            event.widget.cr eate_text(18,18 , text = '',
            font = ('arial', 18, 'bold'))

            Note: these can now use the make_text() function below.
            [color=blue]
            >
            > #------------------------------ 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)[/color]

            Things like this are much better written:


            def button_row(pare nt, individual_opts , **options):
            for text, command in button_opts:
            Button(parent, text=text,
            command=command ,
            **options).pack (side = LEFT, padx = 10)

            button_opts = (('NEW', clr_scrn),
            ('OPEN', get_file),
            ('SAVE', save_file),
            ('CLEAR', clr_scrn),
            ('HINT', hint),
            ('SOLVE', solve),
            ('EXIT', fred.quit))

            button_row(bfr, button_opts, relief='raised' )
            [color=blue]
            > #------------------------------ 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'))
            >[/color]

            Again, use a loop and functions (approximately the same amount of typing
            but 1000 times more reusability):


            def make_text(acell , t, font=('arial', 18, 'bold'),
            fill='black', **options):
            acell.create_te xt(18,18, text=t, font=font, fill=fill, **options)

            def fill_cells(cell s, numbers)
            for (c,t) in zip(range(9)), numbers[:-1]):
            make_text(cell[c][0], t)
            make_text(cell[77][0], text=numbers[-1], fill='blue')

            numbers = '3697584215'

            fill_cells(cell , numbers)


            Notice how this makes filling numbers super easy, e.g.:
            fill_cells(cell , '9283571649')

            [color=blue]
            > for item in cell:
            > item[0].bind('<Enter>' , mouse_in)
            > item[0].bind('<KeyPres s>', see_key)
            >
            >
            > mainloop()
            >
            >[/color]


            James

            Comment

            Working...