Python 在tkinter树视图中将文本换行
是否可以使用tkinter treeview将文本换行? 我试图更改行高,但文本无法换行。基本上,我想有多行文字的行 代码如下: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
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()