【问题标题】:How to create expanding PanedWindow with gridlayout in tkinter?如何在 tkinter 中使用 gridlayout 创建扩展的 PanedWindow?
【发布时间】:2014-12-24 12:22:10
【问题描述】:

基本上我想用 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 个元素在其中展开,我希望所有元素都被同样展开。

【问题讨论】:

    标签: python-3.x tkinter


    【解决方案1】:

    您的问题有两个部分,如何将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

    【讨论】:

    • 就像我说的,我希望元素能够均匀扩展,或者能够选择扩展哪个元素。
    • @DisturbedTK:我很抱歉。我回答了关于网格与包的问题。我没有看到您对调整窗格大小有第二个问题。我已经更新了我的答案。
    • 谢谢,这正是我想要的,祝你圣诞快乐!
    猜你喜欢
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 2018-12-30
    相关资源
    最近更新 更多