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

时间:2014-12-24 12:22:11

标签: python-3.x tkinter

基本上我想用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()

我的代码如下所示:

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

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

1 个答案:

答案 0 :(得分:4)

您的问题分为两部分,如何将pack替换为grid,以及如何让Panedwindow的窗格平等增长和缩小。我将分别解决你问题的这两部分。

用网格替换包

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

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

用这个:

root = Tk()

m1.grid(row=0, column=0, sticky ="nsew")
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)

让窗格平等增长/缩小

要使所有窗格平等增长,这完全取决于您使用网格还是打包。增长和缩小由窗格窗口控制,而不是由几何管理器控制。实际上,panedwindow是另一个几何管理器。

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

m1.add(left, stretch="always")
m1.add(m2, stretch="always")
m2.add(top, stretch="always")
m2.add(bottom, stretch="always")

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