【问题标题】:Python3.5 -configure a single cell to expand instead of the entire row or columnPython3.5 - 配置单个单元格展开而不是整行或整列
【发布时间】:2016-11-03 02:26:45
【问题描述】:

在 tkinter 窗口中绘制一个 4x4 网格。我想扩展第 2 行第 2 列的单元格,但不是第 2 行或第 2 列的所有其他内容。我在第 1-15 行的左侧设计一个带有可选选项的文本窗口。使第 2 行的权重为 1 和第 2 列的权重为 1 允许我的 Text 小部件扩展,但第 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 小部件没有展开。使用网格时是否可以设置扩展框架?

【问题讨论】:

  • 我认为如果没有具体的例子,这将很难回答。有个答案,但正确的答案取决于很多变量。例如,假设你希望它向右展开,你期望在同一行的右边的小部件会发生什么?他们会转移吗?被覆盖?垂直扩展也是一样——下面行中的项目会发生什么?能扩大多少?第 2 行第 2 列中的项目可以加倍吗?三倍?它可以填满整个屏幕吗?它可以完全消失吗?你有能力改变用户界面吗?
  • 上面添加的示例。当窗口最大化或用户拖动窗口的角时,我只希望文本小部件展开。我希望标签 2-4 在左上角彼此相邻并且不分开。我希望这会有所帮助。

标签: python python-3.x tkinter grid


【解决方案1】:

您的问题涉及 4x4 网格,但您的示例仅显示两列。这让人很难理解你想要什么。在 cmets 中,您说您只是希望示例的文本区域扩大和缩小,并将所有标签放在一起,这就是我要解决的问题。

最简单的解决方案是在文本区域的右侧和下方添加一个额外的行和列。让文本小部件跨越这些区域,并将这些区域的权重设为 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,从而更容易跟踪行和列。

【讨论】:

  • 我没有意识到我可以像这样混合包和网格。我试试看。
  • 此外,将所有内容的网格配置放在一个部分中确实更易于管理。谢谢你。
  • @sidnical:您可以在应用程序中混合使用网格和打包,但不能将两者用于具有相同父级的小部件。
【解决方案2】:

解决此问题的一种方法是将您的网格设置为两倍大,将您希望可扩展的内容设置为跨两列/两行。

即您对griding 事物([1,1][1,3],[3,1][3,3]...)仅使用奇数行/列,并将偶数行/列设置为有重量。任何你想在一个或两个方向上展开的东西都会得到一个columnspanrowspan 2,将它推到一个可以根据需要展开的行/列中。

【讨论】:

  • 我试试看。
  • 这不起作用。如果我将工具放在 0、2、3、4 等处,并将第 1 行留空,除了第 1 行的 Text 小部件。然后对我的列执行相同操作,并且在第 1 列只有我的 Text 小部件。当我改变tkinter 窗口第 1 列和第 1 行的大小被扩展,这允许 Text 小部件扩展,但也将第 2 行以上的其他工具向下推,第 1 行成为这个巨大的差距。如果我可以调整框架而不是仅调整窗口,我会这样做,但它似乎不起作用。还有其他想法吗?
  • 您是否确实为您的Text 上的grid 指定了rowspancolumnspan 参数?
  • 在上面添加示例代码。这显示了它如何将其余标签扔到 Text 小部件下方,并在小部件展开时将它们向下拖动。我希望标签 3 和 4 与标签 2 保持一致而不移动。将小部件放在标签下方的一行上会在小部件上方留出很大的空隙,我认为我们没有办法向后跨行。 Delioth,如果我没有按照你的建议进行格式化,请告诉我。
【解决方案3】:

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

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

感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 2015-07-08
    • 2015-02-04
    • 2010-09-22
    • 1970-01-01
    • 2017-07-25
    相关资源
    最近更新 更多