我是一个在 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.sort
method 和 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] 删除。
我来说两句