框架内的网格?

8

在Tkinter中,是否可以将按钮网格放置在另一个框架内?

我想创建类似于井字棋的游戏,并希望使用网格功能来放置游戏方块(将成为按钮)。但是,我希望GUI中还有其他东西,而不仅仅是游戏板,因此将所有内容都放在一个网格中并不理想。

举个例子:

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

井字棋盘是由所有按钮组成的网格,"玩家2获胜"是框架内的标签。

这只是我正在尝试做的事情的过度简化,所以请耐心等待,就目前为止我设计的程序(棋盘是动态创建的)中,网格是最合理的选择。

编辑:我有一个想法,但运行时什么也没有发生?如果我去掉框架部分,它就可以了。有什么想法吗?

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

1
没有任何东西出现的原因是您在同一个父级中同时使用了grid和pack(b.grid()和f.pack()都会影响根部小部件)。这可能会导致各种不良行为。在单个容器内,您应该只使用其中之一。在整个应用程序中,只要您不直接在同一个容器中使用两者,就可以混合使用它们。 - Bryan Oakley
2个回答

11

最终找到一种方法做到了:

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

将网格嵌套在一个框架内部再嵌套在另一个框架内部有点小技巧,但它能让网格周围的填充生效,所以我很满意。


2
网格不是一个“东西”,它是小部件在框架内排列自己的一种方法;请注意,没有构建Grid。这是Tk组合模型,类似于TeX,后者本身源于500年的印刷经验。嵌套盒子是我们发现用来排列类似文本对象的方法:这不是一个hack。 - msw
很棒的答案 = 帮助我解决了我苦苦挣扎了几天的问题。 - xxmbabanexx

1

您可以任意嵌套Tk小部件。引用手册

任何主小部件的大小都由其内部“从属小部件”的大小确定。Packer用于控制从属小部件出现在它们被打包到其中的主小部件中的位置。您可以将小部件打包到框架中,然后将框架打包到其他框架中,以实现所需的布局。此外,一旦打包完成,排列会动态调整以适应配置的增量更改。

确实,一个包含(按钮框架和标签的框架)的框架是您必须构建所描述的布局的方式。


你是在说我所问的事情不可能吗?我知道我可以将一个框架放在另一个框架内,但能否在一个框架内放置一个网格呢? - Sam
1
@Sam:你不能“在框架内放置网格”,因为网格不是你可以随意放置的东西。grid()方法仅仅是将小部件放置在容器中。你不是“添加网格”,而是仅仅“按网格模式布置小部件”。正如答案所说,你可以任意深度地嵌套Tk小部件(尽管根据我的多年经验,你很少需要超过3或4个层级)。 - Bryan Oakley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接