Bja*_*ngo 1 python text tkinter text-widget
如何自动调整文本小部件的大小以适应文本小部件的高度
\n文本小部件不会有任何om,而是文本将环绕(整个单词)并继续向下。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()
Run Code Online (Sandbox Code Playgroud)
编辑示例
这就是我不使用消息小部件的原因,它们不会重新排列文本以填写文本小部件。
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)
Run Code Online (Sandbox Code Playgroud)
以下是如何使用它的示例:
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()
Run Code Online (Sandbox Code Playgroud)
运行代码时,您应该会看到一个如下所示的窗口:
如果您不手动调整窗口大小,并等待 5 秒钟,窗口将增长以显示添加的文本:
不幸的是,您必须update_idletasks在插入之前调用,以便 tkinter 知道窗口的实际宽度。这可能会产生视觉副作用,具体取决于其余代码的工作方式(阅读:当 UI 首次启动时,您可能会看到闪烁)。