在Tkinter中使用Grid和Pack与Frame
在一个框架里使用网格布局,然后再把这个框架放到主窗口里,这样做可以吗?比如说:
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 个回答
1
是的,这是可能的。实际上,这也是构建复杂图形用户界面的推荐方法。
我觉得你可能误解了这一点:每个使用网格布局的控件都有自己的“网格”。这个网格并不一定和应用程序中其他地方的网格对齐。没有一个统一的列或行的设置。比如,框架A的第1列可能在框架B的第10列右边,而框架A的第1行可能在框架B的第1行下面。
在你的具体情况中,你把按钮框架放在了顶部,但因为你没有指定任何选项,它将不会填满父窗口的宽度。它会尽量缩小到最小,并位于父窗口的顶部中间部分。
当你在里面放两个控件时,框架会扩展到刚好能容纳这些控件的大小。这个框架的第0列会因为是空的而没有宽度,第1列会有开始按钮的宽度,第2列会因为是空的而没有宽度,第3列会有停止按钮的宽度。如果你想让它们之间有空隙,一个简单的办法是强制第2列设置一个特定的大小(例如:buttonsFrame.grid_columnconfigure(2, minsize=100);
)
当你在解决布局问题时,给一些控件设置不同的背景颜色会非常有帮助,这样它们就能突出显示。例如,如果你给buttonsFrame
设置一个粉色背景,你会很快发现它并没有填满整个窗口的宽度。