自动调整文本小部件的高度以适应所有文本
Automatically resize text widget's height to fit all text
如何自动调整文本小部件的大小以适应文本小部件的高度
- 不会有任何
\n
om 文本小部件,而是文本将环绕(整个单词)并继续向下。 wrap=WORD
这是怎么做到的?
我处理问题陈述的想法: 我想知道是否有可能在每次文本在文本小部件中环绕时进行计数,并以某种方式计算给定的值计算文本小部件的高度? - 只是一个想法..我不知道这是否可能。
**为什么这不是重复的**
这不是重复问题,link 如果您认为它是重复问题,那么您声称它是重复问题。他们都实施了一个解决方案,在该解决方案中,它会在文本小部件的每个击键中检查“\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()
编辑示例
这就是我不使用消息小部件的原因,它们不会重新排列文本来填充文本小部件。
tkinter 文本小部件并非设计为像标签小部件那样放大或缩小以适应其内容。如果您只需要显示纯文本而不需要交互式编辑更多文本,那么 Label
可能比 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()
当你 运行 代码时,你应该看到 window 看起来像这样:
如果您不手动调整 window 的大小并等待 5 秒,window 将增长以显示添加的文本:
不幸的是,您必须在插入之前调用 update_idletasks
,以便 tkinter 知道 window 实际有多宽。这可能会产生视觉上的副作用,具体取决于其余代码的工作方式(阅读:UI 首次启动时您可能会看到闪光灯)。
如何自动调整文本小部件的大小以适应文本小部件的高度
- 不会有任何
\n
om 文本小部件,而是文本将环绕(整个单词)并继续向下。wrap=WORD
这是怎么做到的?
我处理问题陈述的想法: 我想知道是否有可能在每次文本在文本小部件中环绕时进行计数,并以某种方式计算给定的值计算文本小部件的高度? - 只是一个想法..我不知道这是否可能。
**为什么这不是重复的**
这不是重复问题,link 如果您认为它是重复问题,那么您声称它是重复问题。他们都实施了一个解决方案,在该解决方案中,它会在文本小部件的每个击键中检查“\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()
编辑示例
这就是我不使用消息小部件的原因,它们不会重新排列文本来填充文本小部件。
tkinter 文本小部件并非设计为像标签小部件那样放大或缩小以适应其内容。如果您只需要显示纯文本而不需要交互式编辑更多文本,那么 Label
可能比 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()
当你 运行 代码时,你应该看到 window 看起来像这样:
如果您不手动调整 window 的大小并等待 5 秒,window 将增长以显示添加的文本:
不幸的是,您必须在插入之前调用 update_idletasks
,以便 tkinter 知道 window 实际有多宽。这可能会产生视觉上的副作用,具体取决于其余代码的工作方式(阅读:UI 首次启动时您可能会看到闪光灯)。