【问题标题】:How to make multiple text widgets expand to fill frame in Tkinter如何使多个文本小部件扩展以填充 Tkinter 中的框架
【发布时间】:2020-08-06 17:18:33
【问题描述】:

我的代码看起来像这样

    frame = tk.Frame(self.root.canvas)
    frame.place(x = coords.x, y = coords.y, width = frameWidth*3, height = frameHeight)
    tk.Text(frame).pack(side=tk.LEFT)
    tk.Text(frame).pack(side=tk.LEFT)
    tk.Text(frame).pack(side=tk.LEFT)

我希望每个文本框都有宽度 frameWidth,但由于某种原因,它们正在扩展以填充整个框架。有没有人知道为什么会这样?

【问题讨论】:

  • 不建议在Canvas 内的小部件上使用pack()/grid()/place()。请改用Canvas.create_window()。还可以尝试在Text 小部件上使用place() 而不是pack()

标签: python tkinter


【解决方案1】:

您可以尝试对文本小部件使​​用以下属性,

width - 以字符(不是像素!)为单位的小部件宽度,测量值 根据当前字体大小。

如果您使用此方法,则必须进行一些硬编码才能获得正确的宽度。您可以像这样创建 Text 小部件。

    tk.Text(frame,width=100).pack(side=tk.LEFT)

【讨论】:

  • 您不必猜测硬编码的宽度,还有其他解决方案。正如所写,这个答案具有误导性,因为它给人的印象是这是唯一的解决方案。
  • @Bryan Oakley 如果我的回答看起来误导了它的编写方式,我很抱歉。我更改了措辞以尽可能清楚地说明,并且我已经给出了我能想到的最佳方法关于 OP 的详细信息。如果您能添加一个更好的答案,我们将不胜感激,因为它可以帮助我和 OP 学习新的东西。
【解决方案2】:

我已经在 tkinter 中找到了动态文本框大小的解决方案。你需要做的是用框架包裹每个文本小部件,并将框架的pack_propagate(或grid_propagate)设置为0;然后,文本框将展开填充框架,并具有与框架相同的动态大小。

例子:

frame = tk.Frame(root)
for textBox in boxes:
        textWrap = tk.Frame(frame)
        textWrap.pack_propagate(0)
        textWrap.pack(expand = True, fill = tk.BOTH)
        textBox = tk.Text(textWrap)

frame.place(x = coords.x, y = coords.y, width = width, height = height) 

因为默认的包装面是顶部,这将创建三个垂直堆叠的文本框,宽度为 frame.width 和高度为 frame.height/3。这很方便,因为它允许您以像素而不是文本单位来处理文本框大小,并且如果调整边框大小,文本框也会自动调整大小。

【讨论】:

    猜你喜欢
    • 2015-04-09
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多