如何在tkinter中使用gridlayout创建扩展的PanedWindow?

Dis*_*dTK 5 tkinter python-3.x

基本上我想用gridlayout重新创建这个代码:

from tkinter import *

m1 = PanedWindow()
m1.pack(fill=BOTH, expand=1)

left = Label(m1, text="left pane")
m1.add(left)

m2 = PanedWindow(m1, orient=VERTICAL)
m1.add(m2)

top = Label(m2, text="top pane")
m2.add(top)

bottom = Label(m2, text="bottom pane")
m2.add(bottom)

mainloop()
Run Code Online (Sandbox Code Playgroud)

我的代码看起来像这样:

from tkinter import *
from tkinter import ttk

root = Tk()

root.title("PanedWindows")
root.columnconfigure(0, weight=1)
root.columnconfigure(1, weight=1)
root.rowconfigure(0, weight=1)
root.rowconfigure(1, weight=1)

left_right_pane = PanedWindow(root, orient=HORIZONTAL, relief='groove', borderwidth=2)
left_right_pane.grid(column=0, row=0, sticky=(W,S,E,N), columnspan=2)
left_right_pane.rowconfigure(0, weight=1)
left_right_pane.columnconfigure(0, weight=1)
left_right_pane.rowconfigure(1, weight=1)
left_right_pane.columnconfigure(1, weight=1)

leftframe = ttk.Frame(root, relief='groove', borderwidth=2)
leftframe.grid(column=0, row=0, sticky=(N, W, E, S), rowspan=2)
leftframe.rowconfigure(0, weight=1)
leftframe.columnconfigure(0, weight=1)
left_right_pane.add(leftframe)

top_bottom_pane = PanedWindow(root, orient=VERTICAL)
top_bottom_pane.grid(column=1, row=0, rowspan=2, sticky=(N, W, E, S))
top_bottom_pane.rowconfigure(0, weight=1)
top_bottom_pane.columnconfigure(0, weight=1)
left_right_pane.add(top_bottom_pane)

upperframe = ttk.Frame(root, relief='groove', borderwidth=2)
upperframe.grid(column=1, row=0, sticky=(N, W, E, S))
upperframe.columnconfigure(1, weight=1)
upperframe.rowconfigure(0, weight=1)
top_bottom_pane.add(upperframe)

bottomframe = ttk.Frame(top_bottom_pane, relief='groove', borderwidth=2)
bottomframe.grid(column=1, row=1, sticky=(N, W, E, S))
bottomframe.columnconfigure(1, weight=1)
bottomframe.rowconfigure(1, weight=1)
top_bottom_pane.add(bottomframe)

entry = ttk.Entry(leftframe)
entry.grid(column=0, row=0, sticky=(W,S,E,N))

top = Label(upperframe, text="top pane")
top.grid(column=1, row=0, sticky=(W,S,E,N))

bottom = Label(bottomframe, text="bottom pane")
bottom.grid(column=1, row=1, sticky=(W,S,E,N))

mainloop()
Run Code Online (Sandbox Code Playgroud)

由于我开始尝试所有类型的解决方案,代码有点失控,基本上我将每个元素都粘贴到每个方向并且增加了每个行和列的权重,但它仍然拒绝工作.似乎tkinter将我的panedwindows视为单个单元格,所以当我扩展它们时,只有1个元素在它们内部扩展,我希望所有元素都能同等扩展.

Bry*_*ley 6

您的问题有两个部分,如何替换packgrid,以及如何让 a 的窗格Panedwindow均匀地增长和缩小。我将分别解决您问题的这两部分。

用网格替换包

从您的原始代码开始,将其替换为:

m1.pack(fill=BOTH, expand=1)
Run Code Online (Sandbox Code Playgroud)

有了这个:

root = Tk()

m1.grid(row=0, column=0, sticky ="nsew")
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
Run Code Online (Sandbox Code Playgroud)

让窗格同等地增长/缩小

要让所有窗格均等增长,这与您使用 grid 还是 pack 完全无关。增长和收缩由窗格窗口控制,而不是由几何管理器控制。实际上,panedwindow是另一个几何管理器。

如果您希望所有窗格均等地增长/缩小,请stretch="always"在添加每个子项时添加该选项,例如:

m1.add(left, stretch="always")
m1.add(m2, stretch="always")
m2.add(top, stretch="always")
m2.add(bottom, stretch="always")
Run Code Online (Sandbox Code Playgroud)

注:其他选项stretch"first""last""middle""never"。最终文档位于 tcl/tk 手册页中,只需稍作转换即可使用 tkinter。见http://tcl.tk/man/tcl8.5/TkCmd/panedwindow.htm#M32