Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 自动调整文本小部件的大小';s的高度适合所有文本_Python_Text_Tkinter_Text Widget - Fatal编程技术网

Python 自动调整文本小部件的大小';s的高度适合所有文本

Python 自动调整文本小部件的大小';s的高度适合所有文本,python,text,tkinter,text-widget,Python,Text,Tkinter,Text Widget,如何自动调整文本小部件的大小以适应文本小部件的高度 文本小部件上不会有任何\n,相反,文本将环绕(整个单词)并继续向下换行=单词 如何做到这一点? 我处理问题陈述的想法是:我想知道是否有可能在文本小部件中每次包装文本时进行计数,并根据给定的值以某种方式计算文本小部件的高度只是一个想法。。我不知道这是否可能 **为什么这不是重复的** 这不是一个重复的问题,如果你这么认为,请链接到你声称是重复的问题。它们都实现了一个解决方案,在该解决方案中,它会在文本小部件中的每次击键中检查一个“\n”。我的

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

  • 文本小部件上不会有任何
    \n
    ,相反,文本将环绕(整个单词)并继续向下<代码>换行=单词
如何做到这一点?

我处理问题陈述的想法是:我想知道是否有可能在文本小部件中每次包装文本时进行计数,并根据给定的值以某种方式计算文本小部件的高度只是一个想法。。我不知道这是否可能

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


这不是一个重复的问题,如果你这么认为,请链接到你声称是重复的问题。它们都实现了一个解决方案,在该解决方案中,它会在文本小部件中的每次击键中检查一个“\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
类TkExample(Tkinter.Frame):
定义初始化(自身,父级):
Tkinter.Frame.\uuuuu init\uuuuuuu(自,父)
self.init_ui()
def初始用户界面(自身):
self.pack()
text\u box=Tkinter.text(self)
text_box.pack()
text\u box.bind(“,self.update\u size)
def更新_大小(自身、事件):
widget_width=0
widget_height=float(event.widget.index(Tkinter.END))
对于event.widget.get(“1.0”,Tkinter.END).split(“\n”)中的行:
如果len(line)>widget_宽度:
小部件宽度=长度(线)+1
event.widget.config(width=widget\u width,height=widget\u height)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
root=Tkinter.Tk()
TkExample(根)
root.mainloop()
编辑示例

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


tkinter文本小部件的设计不像标签小部件那样可以根据内容进行缩放。如果您只需要显示纯文本,而不需要交互编辑更多文本,那么标签可能比
文本
更好

也就是说,可以获取文本小部件中显示的行数,并利用这些信息调整小部件的大小

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

诀窍是要知道文本小部件内部有一个
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\u idletasks
,以便tkinter知道窗口的实际宽度。这可能会产生视觉副作用,具体取决于其他代码的工作方式(请阅读:当UI首次启动时,您可能会看到一个闪光灯).

tkinter文本小部件的设计不像标签小部件那样可以根据其内容进行放大或缩小。如果您只需要显示纯文本,而无需交互编辑更多文本,则标签可能是比
文本
更好的选择

也就是说,可以获取文本小部件中显示的行数,并利用这些信息调整小部件的大小

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

诀窍是要知道文本小部件内部有一个
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\u idletasks
,以便tkinter知道窗口的实际宽度。这可能会产生视觉副作用,具体取决于其他代码的工作方式(请阅读:当UI首次启动时,您可能会看到一个闪光灯).

这不是重复的,如果您认为是重复的,请链接到您声称是重复的问题。他们都实现了一个解决方案,在文本小部件中的每个击键中检查一个“\n”。我的文本小部件中根本没有任何“\n”。但是,请将这些词包装起来!您不使用标签或消息小部件有什么原因吗?您知道吗你需要用户编辑文本的能力吗?我没有使用消息小部件,因为它们不会像你在“编辑示例”中看到的那样重新排列文本以填充小部件的水平视图“我刚刚更新了我的问题。我不使用标签的原因你应该很清楚。对不起,不使用标签的原因肯定不清楚。如果您不需要用户能够编辑内容,那么标签可能是正确的选择。请试着重写你的简历