Grid within a frame?

2020-02-11 02:52发布

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

2条回答
别忘想泡老子
2楼-- · 2020-02-11 03:23

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.

查看更多
我想做一个坏孩纸
3楼-- · 2020-02-11 03:26

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.

查看更多
登录 后发表回答