使用Grid和Pack with Frames Tkinter

时间:2014-05-06 20:54:00

标签: python tkinter

是否可以在框架中使用网格然后打包在根窗口中?例如:

from Tkinter import *
import ttk as ttk
root = Tk()
text = Text(root)

buttonsFrame = Frame(root)
start = Button(buttonsFrame)
start["text"] = "Start"
start.grid(row = 0, column=1)
stop = Button(buttonsFrame, )
stop["text"] = "Stop"
stop.grid(row = 0, column=3)
buttonsFrame.pack(side=TOP)

tabbedPane = ttk.Notebook(root)

raw =  ttk.Frame(tabbedPane)
interpreted =  ttk.Frame(tabbedPane)
text = Text(raw)
text.pack(fill=BOTH, expand=1, side=TOP)

textInterpreted = Text(interpreted)
textInterpreted.pack(fill=BOTH, expand=1, side=TOP)

tabbedPane.add(raw, text="RAW")
tabbedPane.add(interpreted, text="Application")
tabbedPane.pack(fill=BOTH, expand=1, side=TOP)
checkBoxesFrame = Frame(root)
stkCheck = Checkbutton(checkBoxesFrame, text="STK/CAT")
stkCheck.pack(side=LEFT)
stkFile = Checkbutton(checkBoxesFrame, text="File IO")
stkFile.pack(side=LEFT)
stkAuth = Checkbutton(checkBoxesFrame, text="Auth")
stkAuth.pack(side=LEFT)
checkBoxesFrame.pack()

root.mainloop()

因为我想要按钮之间的间距,因此它使用不同的列。有可能这样做吗?

1 个答案:

答案 0 :(得分:1)

是的,有可能。实际上,它是构建复杂GUI的推荐方法。

我认为你误解的是:每个有网格管理子节点的小部件都有自己的"网格"。此网格无法与应用中可能使用的任何其他网格对齐。没有通用的列或行集。帧A中的第1列可能位于帧B中第10列的右侧,帧A中的第1行可能位于帧B中的第1行之下。

在您的特定情况下,您将按钮框打包在顶部,但由于您没有指定任何选项,因此填充父窗口的宽度。它将尝试尽可能小,并在其父级的中上部分。

当你在其中放置两个小部件时,框架会扩展到足以容纳这些小部件。该帧的第0列将具有零宽度,因为它是空的,第1列将具有开始按钮的宽度,第2列将具有零宽度,因为它是空的,第3列将具有停止按钮的宽度。如果你想要它们之间的空格,一个简单的解决方案是强制第2列为特定大小(例如:buttonsFrame.grid_columnconfigure(2, minsize=100);

当您尝试解决布局问题时,真的有助于为您的某些小部件提供独特的背景颜色,以便它们脱颖而出。例如,如果您为buttonsFrame提供粉红色背景,您很快就会发现它不会填满窗口的整个宽度。