Python3.5 - 配置单个单元格以扩展而不是整个行或列

时间:2016-06-30 20:15:54

标签: python python-3.x tkinter grid

在tkinter窗口中画出4x4网格。我想扩展第2行第2列的单元格,但不是第2行或第2列的所有其他内容。我在第1-15行的左侧设计了一个带有可选选项的文本窗口。使用权重1和第2列使用权重1制作第2行允许我的文本小部件展开,但第2行和第2列中的所有其他内容也是如此。

from tkinter import *

root = Tk()


lbl1 = Label(root, text="label1")
lbl1.grid(row=0, column=1)

lbl2 = Label(root, text="label2")
lbl2.grid(row=1, column=0)

lbl3 = Label(root, text="label3")
lbl3.grid(row=3, column=0)

lbl4 = Label(root, text="label4")
lbl4.grid(row=5, column=0)

txt = Text(root, state='disabled', bg='#E8E8E8')
txt.grid(row=1, column=1, padx=10, pady=10, sticky="NSEW", columnspan=2,      rowspan=2)


root.rowconfigure(2, weight=1)
root.columnconfigure(2, weight=1)

root.mainloop()

示例2:

from tkinter import *

root = Tk()
frame1 = Frame(root)
frame1.grid(row=0, column=1)
frame2 = Frame(root)
frame2.grid(row=1, column=0)
frame3 = Frame(root)
frame3.grid(row=1, column=1, rowspan=2, columnspan=2)


lbl1 = Label(frame1, text="label1")
lbl2 = Label(frame2, text="label2")
lbl3 = Label(frame2, text="label3")
lbl4 = Label(frame2, text="label4")

lbl1.grid(row=0, column=1, sticky=N)
lbl2.grid(row=3, column=0, sticky=N)
lbl3.grid(row=5, column=0, sticky=N)
lbl4.grid(row=7, column=0, sticky=N)

txt = Text(frame3, state='disabled', bg='#E8E8E8')
txt.grid(row=0, column=0, padx=10, pady=10, sticky="NSEW", columnspan=2, rowspan=2)


root.rowconfigure(2, weight=1)
root.columnconfigure(2, weight=1)
frame3.rowconfigure(0, weight=1)
frame3.columnconfigure(0, weight=1)
root.mainloop()

示例2将所有内容放在我想要的位置,但Text小部件不会展开。使用网格时是否可以设置框架以进行扩展?

3 个答案:

答案 0 :(得分:2)

您的问题询问了4x4网格,但您的示例仅显示了两列。这使得很难理解你想要的东西。在评论中,您只是希望示例的文本区域增长和缩小以及所有标签在一起,这就是我要解决的问题。

最简单的解决方案是在文本区域的右侧和下方增加一个行和列。让文本小部件跨越这些区域,并为这些区域赋予权重1.这意味着,当窗口改变大小时,任何额外的空间将分配给未被按钮占用的区域。

专业提示:当所有布局代码在一起时,我发现布局问题更容易可视化和解决。

它看起来像这样:

lbl1.grid(row=0, column=1)
lbl2.grid(row=1, column=0)
lbl3.grid(row=2, column=0)
lbl4.grid(row=3, column=0)
txt.grid(row=1, column=1, padx=10, pady=10, sticky="NSEW", columnspan=2, rowspan=4)

root.rowconfigure(4, weight=1)
root.columnconfigure(2, weight=1)

我认为,对于部分布局,使用pack代替grid可以更好地解决布局问题。例如,您可以从三个区域开始:工具栏,侧面板,然后是带有文本小部件的主区域:

toolbar = Frame(root, ...)
side = Frame(root, ...)
main = Frame(root, ...)

toolbar.pack(side="top", fill="x")
side.pack(side="left", fill="y")
main.pack(side="right", fill="both", expand=True)

有了这个,你现在有三个相对独立的领域。您可以单独在每个框架中使用packgrid,从而更容易跟踪行和列。

答案 1 :(得分:1)

一种方法是将网格设置为两倍大,将要扩展的内容设置为跨越两列/行。

即。你只使用奇数行/列来grid事物([1,1] [1,3],[3,1] [3,3] ...)并设置偶数行/列有重量。您想要在一个或两个方向上展开的任何内容都会获得columnspanrowspan 2,将其推入行/列,可根据需要进行扩展。

答案 2 :(得分:0)

根据每个人提供的信息,我能够提出解决方案。我将Text小部件留在主窗口而不是框架中,并将我的标签/工具放在框架中。基本上使用框架不会扩展以锁定标签的事实。现在,当窗口扩展时,只有窗口小部件增长。

from tkinter import *

root = Tk()
frame1 = Frame(root)
frame1.grid(row=0, column=1)
frame2 = Frame(root)
frame2.grid(row=1, column=0)


lbl1 = Label(frame1, text="label1")
lbl2 = Label(frame2, text="label2")
lbl3 = Label(frame2, text="label3")
lbl4 = Label(frame2, text="label4")

lbl1.grid(row=0, column=1, sticky=N)
lbl2.grid(row=3, column=0, sticky=N)
lbl3.grid(row=5, column=0, sticky=N)
lbl4.grid(row=7, column=0, sticky=N)

txt = Text(root, state='disabled', bg='#E8E8E8')
txt.grid(row=1, column=1, padx=10, pady=10, sticky="NSEW", columnspan=2, rowspan=2)


root.rowconfigure(2, weight=1)
root.columnconfigure(2, weight=1)
root.mainloop()

感谢您的帮助。