Python:基于类属性排序

卡里姆·洛伯格

我是一个在 Tkinter 中制作待办事项列表 GUI 的菜鸟。待办事项列表中的每个任务都有一个与之关联的类属性。所以一个任务是一个对象,Task:它有一个值属性self.value我想根据属性对 GUI 中显示的所有任务进行排序self.value因此,例如,具有最高值的任务显示在列表顶部,具有最低值的任务显示在列表底部。请注意,它不是必须显示在GUI但该属性的值self.name,但它必须显示的顺序依据self.value

我只从概念上理解该做什么(我认为)。类似的东西,我需要根据 制作一个列表self.value,然后将列表中的“项目”从最高值到最低值进行排序,然后task.name根据self.value.

也许我智障?

在这里做什么是常态?

编辑

代码:

from tkinter import Tk, Frame, Button, Entry, Label, Toplevel
import tkinter.messagebox # Import the messagebox module

task_list = []
#value_list = [] 

class Task:
    def __init__(self, n, h):
        self.name = n
        self.hours = h

def show_tasks():
    task = task_list[-1]
    print('\n')
    print('_______________________')
    print('\n')
    print('Task:')
    print(task.name)
    print('\n')
    print('Hours')
    print(task.hours)

def open_add_task():
    taskwin = Toplevel(root)
    taskwin.focus_force()
    
    #NAME
    titlelabel = Label(taskwin, text='Title task concisely:', font=('Roboto',11,'bold')).grid(column=1, row=0)
    name_entry = Entry(taskwin, width=40, justify='center')
    name_entry.grid(column=1, row=1)

    #HOURS
    hourlabel = Label(taskwin, text='Whole hours \n required', font=('Roboto',10)).grid(column=1, row=2)
    hour_entry = Entry(taskwin, width=4, justify='center')
    hour_entry.grid(column=1, row=3)
    

    def add_task():
        if name_entry.get() != '':                 
            task_list.append(Task(name_entry.get(), hour_entry.get()))
            show_tasks()
            listbox_tasks.insert(tkinter.END, name_entry.get())
            name_entry.delete(0, tkinter.END)
            taskwin.destroy()
        else:
            tkinter.messagebox.showwarning(title='Whoops', message='You must enter a task')
      
    Add_button = Button(taskwin, text='Add', font=('Roboto',10), command=add_task).grid(column=1, row=4)
    
def sort_tasks():
    pass
    

root = Tk()

task_frame = Frame()
# Create UI
your_tasks_label = Label(root, text='THESE ARE YOUR TASKS:', font=('Roboto',10, 'bold'), justify='center')
your_tasks_label.pack()


listbox_tasks = tkinter.Listbox(root, height=10, width=50, font=('Roboto',10), justify='center') # tkinter.Listbox(where it should go, height=x, width=xx)
listbox_tasks.pack()


#BUTTONS
New_Task_Button = Button(root, text='New Task', width=42, command=open_add_task)
New_Task_Button.pack()


root.mainloop()
艺术

有多种方法可以完成您想要实现的目标。

最简单的方法是使用list.sortmethod 和 set reverse=True,它们将按降序排序。假设您的所有列表值都是 Task 实例,在您的情况下,您可以这样做

todo_list.sort(key=lambda a: a.value, reverse=True)

假设您的值属性是整数。我做了一个小例子。

names_values={"name1": 5, "name2": 10, "name3": 2}

todo_list = []

class Task:

    def __init__(self, name: str, value: int):
        self.name = name
        self.value = value

for key, value in names_values.items():
    task = Task(key, value)
    todo_list.append(task)

print("Before sorting: ", todo_list)
print("\nBefore sorting values: ", [(x.name, x.value) for x in todo_list])

todo_list.sort(key=lambda a: a.value, reverse=True)

print("\nAfter sorting: ", todo_list)
print("\nAfter sorting values: ", [(x.name, x.value) for x in todo_list])

现在你有一个排序的列表。您现在可以遍历列表并将object.name其插入到您的列表视图中。


自从您添加 MRE 后更新:

因为您还需要在 GUI 中显示排序列表。您需要重新加载列表视图。一种清除列表视图并再次插入的方法如下所示。

...

    def add_task():
        if name_entry.get() != '':                 
            task_list.append(Task(name_entry.get(), int(hour_entry.get())))
            show_tasks()
            reload()
            taskwin.destroy()
        else:
            tkinter.messagebox.showwarning(title='Whoops', message='You must enter a task')
      
    Add_button = Button(taskwin, text='Add', font=('Roboto',10), command=add_task).grid(column=1, row=4)

def reload():
    task_list.sort(key=lambda a: a.hours, reverse=True)
    listbox_tasks.delete(0, tkinter.END)
    
    for x in task_list:
        listbox_tasks.insert(tkinter.END, x.name)
...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章