在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小部件不会展开。使用网格时是否可以设置框架以进行扩展?
答案 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)
有了这个,你现在有三个相对独立的领域。您可以单独在每个框架中使用pack
或grid
,从而更容易跟踪行和列。
答案 1 :(得分:1)
一种方法是将网格设置为两倍大,将要扩展的内容设置为跨越两列/行。
即。你只使用奇数行/列来grid
事物([1,1] [1,3],[3,1] [3,3] ...)并设置偶数行/列有重量。您想要在一个或两个方向上展开的任何内容都会获得columnspan
或rowspan
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()
感谢您的帮助。