1

如何自动调整文本小部件的大小以适应文本小部件的高度

  • 不会有任何\n文本小部件,而是文本将环绕(整个单词)并继续向下。wrap=WORD

这怎么能做到?

我接近问题陈述的想法:我想知道是否可以每次在文本小部件中环绕文本时进行计数,并通过该给定值以某种方式计算文本小部件的高度?- 只是一个想法..我不知道这是否可能。

**为什么这不是重复的**

这不是重复的,链接到您声称它是重复的问题,如果您这么认为的话。他们都实施了一个解决方案,在该解决方案中,它会在文本小部件的每个击键中检查一个 '\n'。我的文本小部件根本没有任何 '\n'。而是将单词环绕!

这不是我正在寻找的解决方案,因为它正在寻找 '\n' 并根据找到的数量相应地更改高度。由于我不会使用任何 '\n' 而是将单词包裹在 ( Text(frame, wrap=WORDS)) 周围,因此不会出现 '\n' 使该解决方案无用!”

这就是为什么这段代码,从人们声称这是重复的问题中,不会解决这个问题,这不是重复的。

不会解决我的问题,因为它会查找“\n”:

    import Tkinter

class TkExample(Tkinter.Frame):
   def __init__(self, parent):
      Tkinter.Frame.__init__(self, parent)
      self.init_ui()

   def init_ui(self):
      self.pack()
      text_box = Tkinter.Text(self)
      text_box.pack()
      text_box.bind("<Key>", self.update_size)

   def update_size(self, event):
      widget_width = 0
      widget_height = float(event.widget.index(Tkinter.END))
      for line in event.widget.get("1.0", Tkinter.END).split("\n"):
         if len(line) > widget_width:
            widget_width = len(line)+1
      event.widget.config(width=widget_width, height=widget_height)

if __name__ == '__main__':
    root = Tkinter.Tk()
    TkExample(root)
    root.mainloop()

编辑示例

这就是我不使用消息小部件的原因,它们不会重新排列文本以填充文本小部件。

在此处输入图像描述

4

1 回答 1

5

tkinter 文本小部件并非旨在像标签小部件那样增长或缩小以适应其内容。如果您只需要显示纯文本而不需要交互式编辑更多文本,那么 aLabel可能是比Text.

话虽如此,可以获取文本小部件中显示的行数,并使用该信息调整小部件的大小。

这是一个示例,展示了如何在以编程方式插入文本时使其调整大小。它不会在您键入时处理调整大小,尽管可以这样做。

诀窍是要知道文本小部件内部有一个count方法,您可以调用该方法来获取显示的行数。不幸的是,这种方法没有暴露在 tkinter 层,因此需要一些关于 tkinter 如何在内部工作的知识。

class ExpandoText(tk.Text):
    def insert(self, *args, **kwargs):
        result = tk.Text.insert(self, *args, **kwargs)
        self.reset_height()
        return result

    def reset_height(self):
        height = self.tk.call((self._w, "count", "-update", "-displaylines", "1.0", "end"))
        self.configure(height=height)

以下是如何使用它的示例:

root = tk.Tk()
text = ExpandoText(root, width=20, wrap="word")
text.pack(fill="both", expand=True)

root.update_idletasks()
text.insert("1.0", "This is a line of text that will initially be wrapped.")

root.after(5000, text.insert, "end", "This is more text")

root.mainloop()

运行代码时,您应该会看到如下所示的窗口:

原始截图

如果您不手动调整窗口大小,然后等待 5 秒钟,窗口将变大以显示添加的文本:

带有更多文字的屏幕截图

不幸的是,您必须update_idletasks在插入之前调用,以便 tkinter 知道窗口的实际宽度。这可能会产生视觉副作用,具体取决于其余代码的工作方式(阅读:当 UI 首次启动时,您可能会看到闪烁)。

于 2017-09-07T15:35:26.410 回答