当前位置:   article > 正文

Python tkinter Treeview创建GUI表格(可编辑、新建单元格)_tkinter 使用treeview如何是单元格变为button

tkinter 使用treeview如何是单元格变为button

版本:Python3.7

1.使用Treeview创建表格界面

  1. from tkinter import ttk
  2. from tkinter import *
  3. root = Tk() # 初始框的声明
  4. columns = ("姓名", "IP地址")
  5. treeview = ttk.Treeview(root, height=18, show="headings", columns=columns) # 表格
  6. treeview.column("姓名", width=100, anchor='center') # 表示列,不显示
  7. treeview.column("IP地址", width=300, anchor='center')
  8. treeview.heading("姓名", text="姓名") # 显示表头
  9. treeview.heading("IP地址", text="IP地址")
  10. treeview.pack(side=LEFT, fill=BOTH)
  11. name = ['电脑1','服务器','笔记本']
  12. ipcode = ['10.13.71.223','10.25.61.186','10.25.11.163']
  13. for i in range(min(len(name),len(ipcode))): # 写入数据
  14. treeview.insert('', i, values=(name[i], ipcode[i]))
  15. root.mainloop() # 进入消息循环

2.编写功能函数,并与鼠标事件绑定

       通过功能函数,实现按表头排序、编辑单元格、新建单元格。

       1.编辑单元格函数set_cell_value原理:

       在原单元格上方新建一个文本框Text和按钮Button,用来编辑内容,按下按钮将单元格内容存入单元格,并销毁文本框Text和按钮Button。

       2.新建单元格函数newrow原理:

       调用Treeview.insert方法,并在表格下方设置‘新建’按钮Button,用来关联函数,按钮位置随表格行数实时更新。

  1. def treeview_sort_column(tv, col, reverse): # Treeview、列名、排列方式
  2. l = [(tv.set(k, col), k) for k in tv.get_children('')]
  3. l.sort(reverse=reverse) # 排序方式
  4. # rearrange items in sorted positions
  5. for index, (val, k) in enumerate(l): # 根据排序后索引移动
  6. tv.move(k, '', index)
  7. tv.heading(col, command=lambda: treeview_sort_column(tv, col, not reverse)) # 重写标题,使之成为再点倒序的标题
  8. def set_cell_value(event): # 双击进入编辑状态
  9. for item in treeview.selection():
  10. #item = I001
  11. item_text = treeview.item(item, "values")
  12. #print(item_text[0:2]) # 输出所选行的值
  13. column= treeview.identify_column(event.x)# 列
  14. row = treeview.identify_row(event.y) # 行
  15. cn = int(str(column).replace('#',''))
  16. rn = int(str(row).replace('I',''))
  17. entryedit = Text(root,width=10+(cn-1)*16,height = 1)
  18. entryedit.place(x=16+(cn-1)*130, y=6+rn*20)
  19. def saveedit():
  20. treeview.set(item, column=column, value=entryedit.get(0.0, "end"))
  21. entryedit.destroy()
  22. okb.destroy()
  23. okb = ttk.Button(root, text='OK', width=4, command=saveedit)
  24. okb.place(x=90+(cn-1)*242,y=2+rn*20)
  25. def newrow():
  26. name.append('待命名')
  27. ipcode.append('IP')
  28. treeview.insert('', len(name)-1, values=(name[len(name)-1], ipcode[len(name)-1]))
  29. treeview.update()
  30. newb.place(x=120, y=(len(name)-1)*20+45)
  31. newb.update()
  32. treeview.bind('<Double-1>', set_cell_value) # 双击左键进入编辑
  33. newb = ttk.Button(root, text='新建联系人', width=20, command=newrow)
  34. newb.place(x=120,y=(len(name)-1)*20+45)

3.完整代码

  1. from tkinter import ttk
  2. from tkinter import *
  3. root = Tk() # 初始框的声明
  4. columns = ("姓名", "IP地址")
  5. treeview = ttk.Treeview(root, height=18, show="headings", columns=columns) # 表格
  6. treeview.column("姓名", width=100, anchor='center') # 表示列,不显示
  7. treeview.column("IP地址", width=300, anchor='center')
  8. treeview.heading("姓名", text="姓名") # 显示表头
  9. treeview.heading("IP地址", text="IP地址")
  10. treeview.pack(side=LEFT, fill=BOTH)
  11. name = ['电脑1','服务器','笔记本']
  12. ipcode = ['10.13.71.223','10.25.61.186','10.25.11.163']
  13. for i in range(min(len(name),len(ipcode))): # 写入数据
  14. treeview.insert('', i, values=(name[i], ipcode[i]))
  15. def treeview_sort_column(tv, col, reverse): # Treeview、列名、排列方式
  16. l = [(tv.set(k, col), k) for k in tv.get_children('')]
  17. l.sort(reverse=reverse) # 排序方式
  18. # rearrange items in sorted positions
  19. for index, (val, k) in enumerate(l): # 根据排序后索引移动
  20. tv.move(k, '', index)
  21. tv.heading(col, command=lambda: treeview_sort_column(tv, col, not reverse)) # 重写标题,使之成为再点倒序的标题
  22. def set_cell_value(event): # 双击进入编辑状态
  23. for item in treeview.selection():
  24. #item = I001
  25. item_text = treeview.item(item, "values")
  26. #print(item_text[0:2]) # 输出所选行的值
  27. column= treeview.identify_column(event.x)# 列
  28. row = treeview.identify_row(event.y) # 行
  29. cn = int(str(column).replace('#',''))
  30. rn = int(str(row).replace('I',''))
  31. entryedit = Text(root,width=10+(cn-1)*16,height = 1)
  32. entryedit.place(x=16+(cn-1)*130, y=6+rn*20)
  33. def saveedit():
  34. treeview.set(item, column=column, value=entryedit.get(0.0, "end"))
  35. entryedit.destroy()
  36. okb.destroy()
  37. okb = ttk.Button(root, text='OK', width=4, command=saveedit)
  38. okb.place(x=90+(cn-1)*242,y=2+rn*20)
  39. def newrow():
  40. name.append('待命名')
  41. ipcode.append('IP')
  42. treeview.insert('', len(name)-1, values=(name[len(name)-1], ipcode[len(name)-1]))
  43. treeview.update()
  44. newb.place(x=120, y=(len(name)-1)*20+45)
  45. newb.update()
  46. treeview.bind('<Double-1>', set_cell_value) # 双击左键进入编辑
  47. newb = ttk.Button(root, text='新建联系人', width=20, command=newrow)
  48. newb.place(x=120,y=(len(name)-1)*20+45)
  49. for col in columns: # 绑定函数,使表头可排序
  50. treeview.heading(col, text=col, command=lambda _col=col: treeview_sort_column(treeview, _col, False))
  51. '''
  52. 1.遍历表格
  53. t = treeview.get_children()
  54. for i in t:
  55. print(treeview.item(i,'values'))
  56. 2.绑定单击离开事件
  57. def treeviewClick(event): # 单击
  58. for item in tree.selection():
  59. item_text = tree.item(item, "values")
  60. print(item_text[0:2]) # 输出所选行的第一列的值
  61. tree.bind('<ButtonRelease-1>', treeviewClick)
  62. ------------------------------
  63. 鼠标左键单击按下1/Button-1/ButtonPress-1 
  64. 鼠标左键单击松开ButtonRelease-1 
  65. 鼠标右键单击3 
  66. 鼠标左键双击Double-1/Double-Button-1 
  67. 鼠标右键双击Double-3 
  68. 鼠标滚轮单击2 
  69. 鼠标滚轮双击Double-2 
  70. 鼠标移动B1-Motion 
  71. 鼠标移动到区域Enter 
  72. 鼠标离开区域Leave 
  73. 获得键盘焦点FocusIn 
  74. 失去键盘焦点FocusOut 
  75. 键盘事件Key 
  76. 回车键Return 
  77. 控件尺寸变Configure
  78. ------------------------------
  79. '''
  80. root.mainloop() # 进入消息循环

4.GUI实现效果

        

                                       图1  最初界面                                                                         图2  按姓名排序

         

                                       图3  按IP地址排序                                                                  图4  新建联系人

        

                                                                                     图5  编辑单元格

附录:

参考链接python ttk Treeview的插入、清空、各种点击事件、获取条目值、标题单击排序

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/975517
推荐阅读
相关标签
  

闽ICP备14008679号