本文共 12609 字,大约阅读时间需要 42 分钟。
~
昨天整了一天Tkinter的treeview,发现中文的教程乃至提问都很少,其中两个问题的解决都是靠steakoverflow上找到的……
在这里放出来我遇到并解决的问题,大家以后可能遇到的话就能省点事了~
插入方法:
import tkinter from tkinter import ttk # 导入内部包 li = [ '王记', '12', '男'] root = tkinter.Tk() root.title( '测试') tree = ttk.Treeview(root,columns=[ '1', '2', '3'],show= 'headings') tree.column( '1',width= 100,anchor= 'center') tree.column( '2',width= 100,anchor= 'center') tree.column( '3',width= 100,anchor= 'center') tree.heading( '1',text= '姓名') tree.heading( '2',text= '学号') tree.heading( '3',text= '性别') tree.insert( '', 'end',values=li) tree.grid() root.mainloop()
(为了省点事就不自己敲了)代码来自博客园提问:https://q.cnblogs.com/q/105829/#a_226277
tree.insert('','end',values=li)
关于“首列很宽”的问题:https://segmentfault.com/q/1010000004206667?sort=created
设置show属性为 headings 即可隐藏首列。
ttk.Treeview(frame,height=18, show="headings", columns=('a','b','c','d','e','f'))
配上一个还可以的综合一点的例子https://www.cnblogs.com/Tommy-Yu/p/4156014.html
清空方法:
参考stackoverflow的提问https://stackoverflow.com/questions/32511843/delete-and-edit-items-in-treeview-tkinter
代码是对上面的代码添加的
import tkinter from tkinter import ttk # 导入内部包 li = ['王记','12','男'] root = tkinter.Tk() root.title('测试') tree = ttk.Treeview(root,columns=['1','2','3'],show='headings') tree.column('1',width=100,anchor='center') tree.column('2',width=100,anchor='center') tree.column('3',width=100,anchor='center') tree.heading('1',text='姓名') tree.heading('2',text='学号') tree.heading('3',text='性别') tree.insert('','end',values=li) tree.grid() def delButton(tree): x=tree.get_children() for item in x: tree.delete(item) delButton(tree) root.mainloop()
(同样是为了省事……这个就是我在博客园的那个提问的回答)
另一种方法:来自很有用但是杂的链接:https://www.cnblogs.com/wumac/p/5816764.html
items = your_treeview.get_children() [your_treeview.delete(item) for item in items]
获取条目值
同样没见到有人问,stackoverflow上才找到的方法
https://stackoverflow.com/questions/34849035/how-to-get-the-value-of-a-selected-treeview-item
import tkinter from tkinter import ttk # 导入内部包 li = [ '王记', '12', '男'] root = tkinter.Tk() root.title( '测试') tree = ttk.Treeview(root,columns=[ '1', '2', '3'],show= 'headings') tree.column( '1',width= 100,anchor= 'center') tree.column( '2',width= 100,anchor= 'center') tree.column( '3',width= 100,anchor= 'center') tree.heading( '1',text= '姓名') tree.heading( '2',text= '学号') tree.heading( '3',text= '性别') tree.insert( '', 'end',values=li) tree.grid() def treeviewClick(event): #单击 print ( '单击') for item in tree.selection(): item_text = tree.item(item, "values") print(item_text[ 0]) #输出所选行的第一列的值 tree.bind( '', treeviewClick) #绑定单击离开事件=========== root.mainloop()
见函数treeview里的内容
有用的链接:https://www.cnblogs.com/Tommy-Yu/p/4156014.html
各种点击事件
事件 | 代码 | 备注 |
鼠标左键单击按下 | 1/Button-1/ButtonPress-1 | |
鼠标左键单击松开 | ButtonRelease-1 | |
鼠标右键单击 | 3 | |
鼠标左键双击 | Double-1/Double-Button-1 | |
鼠标右键双击 | Double-3 | |
鼠标滚轮单击 | 2 | |
鼠标滚轮双击 | Double-2 | |
鼠标移动 | B1-Motion | |
鼠标移动到区域 | Enter | |
鼠标离开区域 | Leave | |
获得键盘焦点 | FocusIn | |
失去键盘焦点 | FocusOut | |
键盘事件 | Key | |
回车键 | Return | |
控件尺寸变 | Configure |
来自:https://www.cnblogs.com/wumac/p/5842393.html
用法:
tree.bind('', treeviewClick)#绑定单击离开事件===========
在bind方法里的'<>'添上相应的事件代码就好了,后面的treeview就是我定义的函数
标题点击排序
https://blog.csdn.net/mikewolfli/article/details/51393933(强烈怀疑此链接是没注明来源,来自下面的链接的代码)
https://stackoverflow.com/questions/22032152/python-ttk-treeview-sort-numbers(不按默认桶排序的方法)
https://stackoverflow.com/questions/1966929/tk-treeview-column-sort(python3可用的见此链接最下面)
试验可运行代码
import random from tkinter import ttk from tkinter import * root = Tk() # 初始旷的声明 columns=( "a", "b", "c") treeview=ttk.Treeview(root,height= 18,show= "headings",columns=columns ) #表格 treeview.column( 'a', width= 50, anchor= 'center') treeview.column( 'b', width= 100, anchor= 'center') treeview.column( 'c', width= 80, anchor= 'center') treeview.heading( 'a', text= '列1') treeview.heading( 'b', text= '列2') treeview.heading( 'c', text= '列3') treeview.pack(side=LEFT,fill=BOTH) for i in range( 10): treeview.insert( '',i,values=(str(random.randint( 0, 9)),str(random.randint( 0, 9)),str(random.randint( 0, 9)))) def treeview_sort_column(tv, col, reverse): #Treeview、列名、排列方式 l = [(tv.set(k, col), k) for k in tv.get_children( '')] print(tv.get_children( '')) l.sort(reverse=reverse) #排序方式 # rearrange items in sorted positions for index, (val, k) in enumerate(l): #根据排序后索引移动 tv.move(k, '', index) print(k) tv.heading(col, command= lambda: treeview_sort_column(tv, col, not reverse)) #重写标题,使之成为再点倒序的标题 ''' #莫名其妙????写循环的话只有最后一列管用,看论坛说的好像是python2.7管用 for col in columns: treeview.heading(col, text=col, command=lambda: treeview_sort_column(treeview, col, False)) ''' ''' #基本用法(上边注释的只有最后一列管用、索性手工试验一下可用性,证实可行) treeview.heading('a', text='123', command=lambda: treeview_sort_column(tree, 'a', False))#重建标题,添加控件排序方法 treeview.heading('b', text='111', command=lambda: treeview_sort_column(tree, 'b', False))#重建标题,添加控件排序方法 treeview.heading('c', text='223', command=lambda: treeview_sort_column(tree, 'c', False))#重建标题,添加控件排序方法 ''' #这个代码对于python3就管用了 for col in columns: #给所有标题加(循环上边的“手工”) treeview.heading(col, text=col, command= lambda _col=col: treeview_sort_column(treeview, _col, False)) root.mainloop() #进入消息循环
转载地址:https://jiaming.blog.csdn.net/article/details/103700110 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!