Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Grid within a frame?

Is it possible to place a grid of buttons in Tkinter inside another frame?

I'm wanting to create a tic-tac-toe like game and want to use the grid feature to put gamesquares (that will be buttons). However, I'd like to have other stuff in the GUI other than just the game board so it's not ideal to just have everything in the one grid.

To illustrate:

O | X | X   |
----------  |
O | O | X   | Player 2 wins!
----------  | 
X | O | X   |

The tic tac toe board is in a grid that is made up of all buttons and the 'player 2 wins' is a label inside a frame.

This is an oversimplification of what I'm trying to do so bear with me, for the way I've designed the program so far (the board is dynamically created) a grid makes the most sense.

Edit: Had a thought but when I run it, nothing happens? If I take out the frame bit it does. Any ideas?

from Tkinter import * 

root = Tk()

b = Button(root, text = "1")
b.grid(row=1, column=3)
b2 = Button(root, text = "2")
b2.grid(row=1, column=4)

f = Frame(root, bg = "red")
f.pack(side=RIGHT)

root.mainloop()
like image 715
Sam Avatar asked May 04 '10 06:05

Sam


2 Answers

Figured out a way to do it finally:

from Tkinter import * 

root = Tk()

f = Frame(root, bg = "orange", width = 500, height = 500)
f.pack(side=LEFT, expand = 1)

f3 = Frame(f, bg = "red", width = 500)
f3.pack(side=LEFT, expand = 1, pady = 50, padx = 50)

f2 = Frame(root, bg = "black", height=100, width = 100)
f2.pack(side=LEFT, fill = Y)

b = Button(f2, text = "test")
b.pack()

b = Button(f3, text = "1", bg = "red")
b.grid(row=1, column=3)
b2 = Button(f3, text = "2")
b2.grid(row=1, column=4)
b3 = Button(f3, text = "2")
b3.grid(row=2, column=0)

root.mainloop()

Having the grid inside a frame inside a frame is a bit of a hack to get the padding around the grid working but it works so I'm happy.

like image 166
Sam Avatar answered Oct 22 '22 07:10

Sam


You can nest Tk widgets arbitrarily deep. Quoth the manual:

The size of any master widget is determined by the size of the “slave widgets” inside. The packer is used to control where slave widgets appear inside the master into which they are packed. You can pack widgets into frames, and frames into other frames, in order to achieve the kind of layout you desire. Additionally, the arrangement is dynamically adjusted to accommodate incremental changes to the configuration, once it is packed.

Indeed, a frame containing a (frame of buttons) and a label is how you must structure the layout you describe.

like image 22
msw Avatar answered Oct 22 '22 08:10

msw