【问题标题】:Sorting items in treeview after adding tkinter添加 tkinter 后在树视图中对项目进行排序
【发布时间】:2020-10-20 18:47:57
【问题描述】:

我有一个关于在将行插入树后按字母顺序排序的问题。我尝试通过添加或排序(数据)来添加方法 data.sort() 但它没有用。或者有什么方法可以一键按字母排序项目?

from tkinter import *
from tkinter import ttk

root = Tk()
root.title("Medicine database")

def add():
    data = tree.insert("",END,values=("",e1.get()))
    data.sort()
    or sorted(data)
Or:
def sort():
    for i in tree.getchildren():
        tree.item(sorted(item))['values']

e1=Entry(root,width=15)
e1.grid(row=0,column=1,padx=10,pady=10,sticky=E,rowspan=1)

btn1 = Button(root,text="add",width=10,command=add)
btn1.grid(row =1,column=0,padx=10,pady=10,rowspan=2)


#treeview
tree = ttk.Treeview(root,height=25)
tree["columns"]=("one","two","three","four")
tree.column("one",width=120)
tree.column("two",width=160)
tree.column("three",width=130)
tree.column("four",width=160)
tree.heading("one", text="Numer seryjny leku")
tree.heading("two", text="Nazwa Leku")
tree.heading("three", text="Ampułki/Tabletki")
tree.heading("four",text="Data ważności")
tree["show"]="headings"
tree.grid(row=0,column=2,rowspan=6,pady=20)

root.geometry("840x580")
root.mainloop()

【问题讨论】:

标签: python tkinter


【解决方案1】:

通过以下方式对树视图进行排序:

  1. 收集列表中所有行的数据。
  2. 对列表进行排序。
  3. 将树视图中的项目移动到与列表中相同的顺序。

根据python ttk treeview sort numbers 的答案改编代码,得到:

def sort():
    rows = [(tree.item(item, 'values'), item) for item in tree.get_children('')]
    # if you want to sort according to a single column:
    # rows = [(tree.set(item, column), item) for item in tree.get_children('')]
    rows.sort()

    # rearrange items in sorted positions
    for index, (values, item) in enumerate(rows):
        tree.move(item, '', index)

只需将sort() 函数用作按钮的命令即可对树视图进行排序。

编辑:根据“二”列中的值按字母顺序对行进行排序,而不考虑大小写:

def sort():
    rows = [(tree.set(item, 'two').lower(), item) for item in tree.get_children('')]
    rows.sort()

    for index, (values, item) in enumerate(rows):
        tree.move(item, '', index)

【讨论】:

  • 我很好,但它不会根据药物名称按字母顺序对树进行排序。当我添加新行时,它每次都会更改订单项
  • 如果你想按列排序,你需要注释掉rows = ...这一行并取消注释进行单列排序的那一行,这是写在代码的cmets中的。我猜不出你想按字母顺序对哪一列进行排序,所以我对所有值都做了。如果药物名称在“二”列中,则将 column 替换为 'two'
  • 它引发错误“ res = tk.call(*(args + options)) _tkinter.TclError: unknown option "-two" "
  • 但如果我有大写字母或小写字母的元素。我知道大写字母的单词有优先权,而字母较低的单词在列表的底部,如果与单词的书写方式无关怎么办?
  • 您可以在每个名称上使用.lower() 以确保在排序前全部小写,请参阅我的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 2021-03-29
  • 2020-04-11
  • 2017-03-06
  • 1970-01-01
  • 2014-02-07
相关资源
最近更新 更多