Python 在tkinter树视图中将文本换行

Python 在tkinter树视图中将文本换行,python,tkinter,treeview,Python,Tkinter,Treeview,是否可以使用tkinter treeview将文本换行? 我试图更改行高,但文本无法换行。基本上,我想有多行文字的行 代码如下: from tkinter import* from tkinter import ttk myApp = Tk() NewTree= ttk.Treeview(myApp, height=5) NewTree['show'] = 'headings' s = ttk.Style() s.configure('Treeview', rowheight=40) N

是否可以使用tkinter treeview将文本换行? 我试图更改行高,但文本无法换行。基本上,我想有多行文字的行

代码如下:

from tkinter import*
from tkinter import ttk

myApp = Tk()


NewTree= ttk.Treeview(myApp, height=5)
NewTree['show'] = 'headings'
s = ttk.Style()
s.configure('Treeview', rowheight=40)

NewTree["columns"]=("1","2")

NewTree.column("1", width=60)
NewTree.column("2", width=60)

NewTree.heading("1", text="col a")
NewTree.heading("2", text="col b")

item = NewTree.insert("", "end", values=("i want to wrap this text","and this text"))

NewTree.grid(row=0,column=0)

myApp.mainloop()
这是代码的第二个版本(当您可以在treeview中手动添加项时),它在我上面发布的代码之前只有一个大功能。我尝试在
lengh
上输入不同的值,但结果是相同的(它不会换行):

从tkinter导入*
从tkinter导入ttk
从tkinter导入消息框
导入文本包装
def包裹(字符串,长度=15):
返回'\n'.join(textwrap.wrap(字符串,长度))
myApp=Tk()
def editact(事件):
def双人(活动):#本次活动的主要目的是
尝试:
如果NewTree.identified_区域(event.x,event.y)=‘cell’:
#用户单击了一个单元格
def ok(事件):
“”“更改项目值。”“”
NewTree.set(item、column、entry.get())
entry.destroy()
column=NewTree.identify_column(event.x)#identify column
item=NewTree.identification_行(event.y)#identification item
x、 y,宽度,高度=NewTree.bbox(项目,列)
value=NewTree.set(项,列)
elif NewTree.identification_region(event.x,event.y)=‘heading’:
#用户单击了一个标题
def ok(事件):
“”“更改标题文本。”“”
NewTree.heading(列,text=entry.get())
entry.destroy()
column=NewTree.identify_column(event.x)#identify column
#tree.bbox只处理项目,因此我们必须以不同的方式获取标题的bbox
x、 y,width,=NewTree.bbox(NewTree.get_children(“”)[0],列)#get x和width(与列中任何单元格的值相同)
#获取垂直坐标(y1,y2)
y2=y
#获取底部坐标
而NewTree.identification_region(event.x,y2)!='标题':
y2-=1
#获取最高坐标
y1=y2
而NewTree.identify_区域(event.x,y1)=‘heading’:
y1-=1
高度=y2-y1
y=y1
value=NewTree.heading(列“text”)
elif NewTree.identification_region(event.x,event.y)=‘nothing’:
column=NewTree.identify_column(event.x)#identify column
#检查我们是否低于最后一行:
x、 y,宽度,高度=NewTree.bbox(NewTree.get_children(“”)[-1],列)
如果event.y>y:
def ok(事件):
“”“更改项目值。”“”
#创建项目
item=NewTree.insert(“,“end”,value=(“”,“”)
NewTree.set(item、column、entry.get())
entry.destroy()
y+=高度
value=“”
其他:
回来
其他:
回来
#显示条目
entry=ttk.entry(NewTree)#创建版本条目
entry.place(x=x,y=y,width=width,height=height,anchor='nw')#在单元格顶部显示条目
条目。插入(0,值)#将前一个值放入条目
entry.bind(“”,ok)#单击其他单元格时进行验证
entry.focus_set()
除索引器外:
Error=messagebox.showinfo(“错误!”,“您有0行。请添加新行。”)
sys.exit()#za resavalje greske`
通过
NewTree.bind(“”,double)#双击创建新单元格
NewTree=ttk.Treeview(myApp,高度=5)
NewTree['show']='headers'
s=ttk.Style()
s、 配置('Treeview',行高=60)
NewTree[“columns”]=(“1”、“2”)
新树形柱(“1”,宽度=100,锚定=“中心”)
新树柱(“2”,宽度=100,锚定=“w”)
新树标题(“1”,text=“Col A”)
新树标题(“2”,text=“Col B”)
item=NewTree.insert(“,”end“,value=(换行(“”),换行(“”))
NewTree.item(item,tags=item)
NewTree.bind(“”,editact)
NewTree.grid(行=0,列=0,列span=5,padx=5)
myApp.mainloop()

您可以使用
textwrap
模块定义此
wrap
功能:

def wrap(string, lenght=8):
    return '\n'.join(textwrap.wrap(string, lenght))
现在,您可以将
替换为:

item = NewTree.insert("", "end", values=(wrap("i want to wrap this text"),
                                         wrap("and this text")))
完整代码 输出

以下代码使用
事件动态包装文本(因此支持调整列的大小,文本将相应地“包装”)

从tkinter导入Tk,ttk
从tkinter.font导入字体
从functools导入部分
myApp=Tk()
NewTree=ttk.Treeview(myApp,高度=5)
NewTree['show']='headers'
s=ttk.Style()
s、 配置('Treeview',行高=50)
NewTree[“columns”]=(“1”、“2”)
新树柱(“1”,宽度=80,锚定=“nw”)
新树柱(“2”,宽度=80,锚定=“nw”)
新树标题(“1”,text=“col a”)
新树标题(“2”,text=“col b”)
item=NewTree.insert(“,“end”,value=(“我想包装此文本”,“和此文本”))
打印(项目)
NewTree.grid(行=0,列=0)
def运动处理程序(树、事件):
f=Font(Font='TkDefaultFont')
#基于列宽包装给定值的辅助函数
def adjust_换行符(值、宽度、焊盘=10):
如果不存在(val、str):
返回值
其他:
words=val.split()
行=[[],]
用文字表示:
行=行[-1]+[字,]
如果f.测量(“”.连接(线))<(宽度-焊盘):
行[-1]。追加(word)
其他:
行[-1]=''。连接(行[-1])
行。追加([word,])
如果存在(第[-1]行),请列出:
行[-1]=''。连接(行[-1])
返回“\n”。加入(行)
如果(事件)
item = NewTree.insert("", "end", values=(wrap("i want to wrap this text"),
                                         wrap("and this text")))
from tkinter import *
from tkinter import ttk

import textwrap


def wrap(string, lenght=8):
    return '\n'.join(textwrap.wrap(string, lenght))


myApp = Tk()

NewTree = ttk.Treeview(myApp, height=5)
NewTree['show'] = 'headings'
s = ttk.Style()
s.configure('Treeview', rowheight=40)

NewTree["columns"] = ("1", "2")

NewTree.column("1", width=60)
NewTree.column("2", width=60)

NewTree.heading("1", text="col a")
NewTree.heading("2", text="col b")

item = NewTree.insert("", "end", values=(wrap("i want to wrap this text"),
                                         wrap("and this text")))

NewTree.grid(row=0, column=0)

myApp.mainloop()
from tkinter import Tk, ttk
from tkinter.font import Font
from functools import partial

myApp = Tk()

NewTree= ttk.Treeview(myApp, height=5)
NewTree['show'] = 'headings'
s = ttk.Style()
s.configure('Treeview', rowheight=50)

NewTree["columns"]=("1","2")

NewTree.column("1", width=80, anchor="nw")
NewTree.column("2", width=80, anchor="nw")

NewTree.heading("1", text="col a")
NewTree.heading("2", text="col b")

item = NewTree.insert("", "end", values=("i want to wrap this text","and this text"))
print(item)

NewTree.grid(row=0,column=0)

def motion_handler(tree, event):
    f = Font(font='TkDefaultFont')
    # A helper function that will wrap a given value based on column width
    def adjust_newlines(val, width, pad=10):
        if not isinstance(val, str):
            return val
        else:
            words = val.split()
            lines = [[],]
            for word in words:
                line = lines[-1] + [word,]
                if f.measure(' '.join(line)) < (width - pad):
                    lines[-1].append(word)
                else:
                    lines[-1] = ' '.join(lines[-1])
                    lines.append([word,])

            if isinstance(lines[-1], list):
                lines[-1] = ' '.join(lines[-1])

            return '\n'.join(lines)

    if (event is None) or (tree.identify_region(event.x, event.y) == "separator"):
        # You may be able to use this to only adjust the two columns that you care about
        # print(tree.identify_column(event.x))

        col_widths = [tree.column(cid)['width'] for cid in tree['columns']]

        for iid in tree.get_children():
            new_vals = []
            for (v,w) in zip(tree.item(iid)['values'], col_widths):
                new_vals.append(adjust_newlines(v, w))
            tree.item(iid, values=new_vals)


NewTree.bind('<B1-Motion>', partial(motion_handler, NewTree))
motion_handler(NewTree, None)   # Perform initial wrapping

myApp.mainloop()