On 19/04/17 23:48, Phil wrote:
> I created a 9 x 9 grid on a canvas which looks much better.

> I can display digits in the centre of the squares but 
> entering the digits from the keyboard seems to be beyond me.

Eek! that's a recipe for premature baldness!
Canvas is designed to display things not for user input.
Trying to read keypresses and the like is going to be very
hard to get right. Use the widgets that are designed for
that, namely Entry boxes.

As to layout, use Frames. Lots of frames.
Frames are the key to layout in most GUIs and especialy
so in Tkinter.

So, for a Suduko grid put 3x3 Entry boxes into a Frame.
Then put 3x3 such frames into another frame. Personally
I'd create a class to represent the 3x3 Entry frame
and then create 9 instances of these.

As to the spacing between widgets (the frames in
this case) use the various padx/pady and fill options.
You can have incredibly fine grained control over
layout using the tools that Tkinter gives you. If
you combine that with the different layout managers
(pack, grid,place) - which can be mixed and matched
as needed using more Frames - you have hugely
powerful control over layout.

Don't try to reinvent all of that yourself, it will
result in tears. (Think about how you will control
cursor movement, deletions, selections etc etc)

BTW I posted a simple display-only grid here a
few weeks ago. It might prove helpful as a basis
for the 3x3 cells so, here it is again:

  import Tkinter as tk  # v2
except ImportError:
  import tkinter as tk  # v3

class DisplayTable(tk.Frame):
    def __init__(self, parent, headings, data,
                 hdcolor='red', datacolor='black',
                 gridcolor= 'black', cellcolor='white'):
        tk.Frame.__init__(self, parent, bg=gridcolor)

        if len(headings) != len(data[0]): raise ValueError
        self.headings = headings

        for index,head in enumerate(headings):
            width = len(str(head))
            cell = tk.Label(self,text=str(head),
                            bg=cellcolor, fg=hdcolor, width=width)
            cell.grid(row=0,column=index, padx=1, pady=1)

        for index,row in enumerate(data):

    def addRow(self, row, data, fg='black', bg='white'):
        for index, item in enumerate(data):
            width = len(str(self.headings[index]))
            cell = tk.Label(self,text=str(item),
                            fg=fg, bg=bg, width=width)
            cell.grid(row=row, column=index, padx=1,pady=1)

if __name__ == "__main__":
    top = tk.Tk()
    tab = DisplayTable(top,

Alan G
Author of the Learn to Program web site
Follow my photo-blog on Flickr at:

Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:

Reply via email to