Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.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 Tkinter根据内容调整文本大小_Python_Tkinter - Fatal编程技术网

Python Tkinter根据内容调整文本大小

Python Tkinter根据内容调整文本大小,python,tkinter,Python,Tkinter,是否可以让Tkinter文本小部件调整大小以适应其内容 ie:如果我放1行文字,它会缩小,但如果我放5行文字,它会增大。我能想到的实现这一点的唯一方法是,每次用户将文字输入文本小部件时,计算宽度和高度,然后将小部件的大小设置为该值。但这里的限制是,只有单间距字体才能正常工作,但无论如何,这里是: import Tkinter class TkExample(Tkinter.Frame): def __init__(self, parent): Tkinter.Frame.__

是否可以让Tkinter文本小部件调整大小以适应其内容


ie:如果我放1行文字,它会缩小,但如果我放5行文字,它会增大。我能想到的实现这一点的唯一方法是,每次用户将文字输入文本小部件时,计算宽度和高度,然后将小部件的大小设置为该值。但这里的限制是,只有单间距字体才能正常工作,但无论如何,这里是:

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()

编辑:简短方法:

text.pack(side="top", fill="both", expand=True, padx=0, pady=0)

通过重新使用sc0tt的答案和Bryan Oakley在这里的答案,我们可以得到这个随时可用的代码(发布在这里供将来参考),它也适用于比例字体

import Tkinter as Tk
import tkFont

class Texte(Tk.Text):
    def __init__(self, event=None, x=None, y=None, size=None, txt=None, *args, **kwargs):
        Tk.Text.__init__(self, master=root, *args, **kwargs)
        self.font = tkFont.Font(family="Helvetica Neue LT Com 55 Roman",size=35)
        self.place(x=10,y=10)
        self.insert(Tk.INSERT,' blah ')
        self.config(font=self.font)
        self.update_size(event=None)
        bindtags = list(self.bindtags())
        bindtags.insert(2, "custom")
        self.bindtags(tuple(bindtags))
        self.bind_class("custom", "<Key>", self.update_size)

    def update_size(self, event):
        width=0
        lines=0
        for line in self.get("1.0", "end-1c").split("\n"):
            width=max(width,self.font.measure(line))
            lines += 1
        self.config(height=lines)
        self.place(width=width+10)

root = Tk.Tk()
root.geometry("500x500")
Texte()
root.mainloop()
将Tkinter作为Tk导入
导入tkFont
类文本(Tk.Text):
定义初始化(self,event=None,x=None,y=None,size=None,txt=None,*args,**kwargs):
Tk.Text.\uuuu init\uuuuu(self,master=root,*args,**kwargs)
self.font=tkFont.font(family=“Helvetica Neue LT Com 55 Roman”,size=35)
自身位置(x=10,y=10)
self.insert(Tk.insert,'blah')
self.config(font=self.font)
自我更新大小(事件=无)
bindtags=list(self.bindtags())
bindtags.插入(2,“自定义”)
self.bindtags(元组(bindtags))
self.bind_类(“自定义”、“自我更新”大小)
def更新_大小(自身、事件):
宽度=0
直线=0
对于self.get(“1.0”,“end-1c”).split(“\n”)中的行:
宽度=最大值(宽度,self.font.measure(线))
行数+=1
self.config(高度=行)
自放置(宽度=宽度+10)
root=Tk.Tk()
根几何(“500x500”)
Texte()
root.mainloop()

在谷歌搜索的顶部找到了这条线索,因此,可能需要它的人会找到它。即使搜索了几个小时也找不到答案。这就是我想出的方法

我想要一个弹出窗口,使表单能够正确地围绕文本小部件中的任何未知但预先确定的文本,而不是用户输入。此外,文本小部件需要围绕其文本内容进行正确的形式匹配

tkinter.Label
非常有效,但它没有
tkinter.Text.tag\u configure
,也没有
tkinter.Text.tag\u bind
,我需要用tkinter的富文本标记替换一些HTML标记
tkinter.Text
有富文本标记,但不能很好地展开,而
tkinter.Label
可以很好地展开,但没有富文本标记。此外,我讨厌滚动条和文字包装,除非它们真的需要。这正是我想要的。虽然,这只是这个论坛的一个非常简单的工作摘要。适用于任何字体。仅在Ubuntu 13.10(Linux)中使用Python 3.3进行测试

#/usr/bin/env蟒蛇3
将tkinter作为tk导入
类MyFrame(tk.Frame):
定义初始化(自):
tk.Frame.\uuuu init\uuuuu(自)
root=self.master
root.title(“我的窗口标题”)
#将框架打包到根窗口中,并使其在“x”和“y”方向展开
self.pack(side=“top”,fill=“both”,expand=True,padx=10,pady=10)
#单元格(0,0)的统计权重为1=100%以扩展100%
self.grid\u column配置(0,权重=1)
self.grid_rowconfigure(0,权重=1)
#字符串文本
text=“”Lorem ipsum dolor sit amet,Concertetuer Adipsicing Elite,sed
直径为0.5毫米,直径为0.5毫米
这是一个很好的例子
不可撤销的经营权
从一个普通消费者身上购买的保险
多洛在亨德雷特在瓦卢普塔特的维利特·埃塞·莫莱斯蒂·康塞卡特,
在vero eros等地,欧盟封建无设施区
要有尊严,就要有温和的饮食习惯
zzril delenit augue duis dolore te FEUGATE nulla facilisi.Nam
临时自由和解决方案,无需选择
这是一个很好的例子。
通常情况下,这是一种法律行为
调查示范机构
我的名字叫legere me lius quod ii legunt saepius.我的名字叫Claritas est etiam
动态过程
莱克托勒姆。米勒姆是一个不属于戈提卡岛的地方,一个不属于努克岛的地方
前滨岸形式的丘脑(putamus parum claram)
每四分之一和五分之一海水的人道主义。Eodem
莫多·泰皮,我的名字叫诺比斯·维登图尔·克拉里,未婚妻索勒姆斯
在未来。”
#向框架(self)及其配置添加一个tk.Text小部件
textwidget=tk.Text(self,wrap=“none”,font=(“Comic Sans MS”,12),
padx=10,pady=10)
textwidget.grid(行=0,列=0,sticky=“nesw”)
#将文本添加到textwidget并禁用编辑
textwidget.insert(tk.END,text)
textwidget.config(state=tk.DISABLED)
#这就是黑客攻击的开始
def正在滚动(wh、下部、上部):
非局部尺寸
大小[wh][0]=上限<'1.0'或下限>'0.0'
大小[wh][1]+=20*大小[wh][0]#+=1表示精度,但速度较慢
#当textwidget滚动时,调用is_scroll函数
textwidget.config(xscrollcommand=lambda*args:is_scroll('w',*args),
yscrollcommand=l
#!/usr/bin/env python3

import tkinter as tk

class MyFrame(tk.Frame):
    def __init__(self):
        tk.Frame.__init__(self)

        root = self.master
        root.title("My Window Title")

        # Pack Frame into root window and make it expand in "both" x and y
        self.pack(side="top", fill="both", expand=True, padx=10, pady=10)
        # Statistical weight of 1 = 100% for cell (0, 0) to expand 100%
        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(0, weight=1)

        # The string text
        text = """Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed
diam nonummy nibh euismod tincidunt ut laoreet dolore magna
aliquam erat volutpat. Ut wisi enim ad minim veniam, quis
nostrud exerci tation ullamcorper suscipit lobortis nisl ut
aliquip ex ea commodo consequat. Duis autem vel eum iriure
dolor in hendrerit in vulputate velit esse molestie consequat,
vel illum dolore eu feugiat nulla facilisis at vero eros et
accumsan et iusto odio dignissim qui blandit praesent luptatum
zzril delenit augue duis dolore te feugait nulla facilisi. Nam
liber tempor cum soluta nobis eleifend option congue nihil
imperdiet doming id quod mazim placerat facer possim assum.
Typi non habent claritatem insitam; est usus legentis in iis qui
facit eorum claritatem. Investigationes demonstraverunt lectores
legere me lius quod ii legunt saepius. Claritas est etiam
processus dynamicus, qui sequitur mutationem consuetudium
lectorum. Mirum est notare quam littera gothica, quam nunc
putamus parum claram, anteposuerit litterarum formas
humanitatis per seacula quarta decima et quinta decima. Eodem
modo typi, qui nunc nobis videntur parum clari, fiant sollemnes
in futurum."""

        # Add a tk.Text widget to Frame (self) and its configuration
        textwidget = tk.Text(self, wrap="none", font=("Comic Sans MS", 12),
                             padx=10, pady=10)
        textwidget.grid(row=0, column=0, sticky="nesw")
        # Add the text to textwidget and disable editing
        textwidget.insert(tk.END, text)
        textwidget.config(state=tk.DISABLED)

        # Here is where the HACK begins
        def is_scroll(wh, lower, upper):
            nonlocal size
            size[wh][0] = upper < '1.0' or lower > '0.0'
            size[wh][1] += 20 * size[wh][0] # += 1 for accuracy but slower
        # Call the is_scroll function when textwidget scrolls
        textwidget.config(xscrollcommand=lambda *args: is_scroll('w', *args),
                          yscrollcommand=lambda *args: is_scroll('h', *args))

        # Add a tk.Button to the Frame (self) and its configuration
        tk.Button(self, text="OK", command=self.quit).grid(row=1, column=0,
                                                           sticky="we")

        # For reasons of magic, hide root window NOW before updating
        root.withdraw()

        # Initially, make root window a minimum of 50 x 50 just for kicks
        root.geometry('50x50')
        size = {'w': [False, 50], 'h': [False, 50]}
        # Update to trigger the is_scroll function
        root.update()
        while size['w'][0] or size['h'][0]:
            # If here, we need to update the size of the root window
            root.geometry('{}x{}'.format(size['w'][1], size['h'][1]))
            root.update()

        # Center root window on mouse pointer
        x, y = root.winfo_pointerxy()
        root.geometry('+{}+{}'.format(x-size['w'][1]//2, y-size['h'][1]//2))

        # Now reveal the root window in all its glory
        root.deiconify()

        # Print textwidget dimensions to the console
        print(textwidget.winfo_width(), textwidget.winfo_height())

def main():
    """Show main window."""
    MyFrame().mainloop()

if __name__ == '__main__':
    main()
def update_height(event):
    text_height = (str(event.widget.index('1.end')) )
    text_int = int(re.search(".(\d+)", text_height).group(1))
    widget_height = int(int(text_int)/160) + 1
    event.widget.config(height=widget_height)