Python,Tkinter:使用tkcalendar计算剩余天数

2024-09-28 05:21:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个问题

One:

我不知道如何计算用户在日历界面中输入的特定日期之前的剩余天数

其次:

我想使用用户在界面中输入的数字来进行一些计算,并观察正在发生的事情,我将一些输入打印到终端-但是,.value属性返回“0”,我不明白为什么

在代码中的#PROXIMITY注释下面,您将找到日历/日期。我只想从用户在日历界面中指定的日期中减去今天的日期,并输出剩余的天数

#VALUE下面是当我打印.value属性时打印“0”的计算

完整代码:

from tkcalendar import * # Calendar module
import tkinter.messagebox # Import the messagebox module
import datetime
import pickle


task_list = []
task_types = ['Sparetime', 'School', 'Work']

class Task:
    def __init__(self, n, type_, i, m, p, h, v): #(w=8, p, u, n, v):
        self.name = n
        self.type = type_
        self.impact = i
        self.manageability = m
        self.proximity = p
        self.hours = h
        self.value = v
        #self.connectivity = c
        ##self.work = w ##hours of work per day
        ##self.urgency = u
        ##self.note = n
        ##self.value = v



def show_tasks():
    # DELETED: for task in task_list:
    # REPLACED WITH: task = task_list[-1]
    task = task_list[-1]
    #print(
        #'Task:'+task.name + '\n' +
        #'Impact:' + task.impact + '\n' +
        #'Manageability:' + task.manageability + '\n' +
        #'Hours:' + task.hours + '\n'
        #'Value:' + task.value +'\n'
        #)
    print('Task:')
    print(task.name)
    print('\n')
    print('Impact:')
    print(task.impact)
    print('\n')
    print('manageability:')
    print(task.manageability)
    print('\n')
    print('Hours')
    print(task.hours)
    print('\n')
    print('Value:')
    print(task.value)

def open_add_task():
    taskwin = Toplevel(root)
    taskwin.focus_force()
    
    #TITLE
    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)

    #TYPE
    typelabel = Label(taskwin, text='Type', font=('Roboto',10)).grid(column=0, row=2)
    type_var = StringVar(value=task_types[0])
    OptionMenu(taskwin, type_var, *task_types).grid(column=0, row=3, sticky='nsew')

    #IMPACT
    impactlabel = Label(taskwin, text='Impact', font=('Roboto',10)).grid(column=1, row=2)
    imp_var = StringVar(value=0)
    OptionMenu(taskwin, imp_var, *range(0, 10+1)).grid(column=1, row=3, sticky='ns')

    #MANAGEABILITY
    manlabel = Label(taskwin, text='Manageability', font=('Roboto',10)).grid(column=2, row=2)
    man_var = StringVar(value=0)
    OptionMenu(taskwin, man_var, *range(0, 10+1)).grid(column=2, row=3, sticky='nsew')



    #PROXIMITY
    proximity_label = Label(taskwin, text = 'Choose a deadline', font=('Roboto',10), justify='center')
    proximity_label.grid(column=1, row=4)
    cal = Calendar(taskwin, selectmode='day', year=2021, month=4, day=27)
    cal.grid(column=1, row=5)
    def get_date():
        proximity_output_date.config(text=cal.get_date()) ##the .config didn't work until i did .grid(column=, row=) on seperate lines

    
        



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

    #CONNECTIVITY
    #for index, task in enumerate(task_list):
    #Checkbutton(taskwin, **options).grid(column=0, row=index)
    C_lab = Label(taskwin,text="Check tasks this task is related to").grid(column=1, row=18)
    placement=19
    for task in task_list:
        Checkbutton(taskwin, text=(task.name)).grid(column=1, row=placement, sticky="w")
        placement+=1

    

    #VALUE
    val_var = (int(imp_var.get()))+ (int(man_var.get()))
        
    def add_task():
        if name_entry.get() != '': # If textbox inputfield is NOT empty do this:
            task_list.append(Task(name_entry.get(), type_var.get(), imp_var.get(), man_var.get(), cal.get_date(), hour_entry.get(), val_var))
            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')

        
    next_button = Button(taskwin, text='Next', font=('Roboto',10), command=add_task).grid(column=2, row=placement, sticky="e")
    placement+=1
    
def sort_tasks():
    pass
def delete_task():
    try:
        task_index = listbox_tasks.curselection()[0]
        listbox_tasks.delete(task_index)
    except:
        tkinter.messagebox.showwarning(title='Error', message='You must select a task to delete')

def save_tasks():
    pass
    #tasks = listbox_tasks.get(0, listbox_tasks.size())
    #pickle.dump(tasks, open('tasks.dat', 'wb'))
    


    
    
    
    

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()


scrollbar_tasks = tkinter.Scrollbar(root)
scrollbar_tasks.pack(side=tkinter.RIGHT, fill=tkinter.Y)

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()

listbox_tasks.config(yscrollcommand=scrollbar_tasks.set)
scrollbar_tasks.config(command=listbox_tasks.yview)

try:
    #tasks = pickle.load(open('tasks.dat', 'rb'))
    listbox_tasks.delete(0, tkinter.END)
    for task in task_list:
        listbox_tasks.insert(tkinter.END, task)
except:
    tkinter.messagebox.showwarning(title='Phew', message='You have no tasks')

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

button_delete_task = Button(root, text='Delete task', width=42, command=delete_task)
button_delete_task.pack()


button_save_tasks = Button(root, text='Save tasks', width=42, command=save_tasks)
button_save_tasks.pack()

#sort_type = StringVar(value='All')
#OptionMenu(btn_frame, sort_type, 'All', *task_types).grid(column=0, row=0, sticky='nsew')

#sort_imp = StringVar(value='Any')
#OptionMenu(btn_frame, sort_imp,'Any', *range(0, 10+1)).grid(column=1, row=0, sticky='nsew')

#Button(btn_frame, text='Sort', command=sort_tasks).grid(column=1, row=1, sticky='nsew')
root.mainloop()

Tags: textnameselftaskgetvaluetkintervar
2条回答

如何计算到特定日期的剩余天数

您可以从^ {< CD1>}中减去^ {CD1>}以获得^ {< CD3>}对象保持数天,考虑以下示例

import datetime
d1 = datetime.date(2021, 1, 1)  # year, month, day
d2 = datetime.date(2021, 1, 10)
diff21 = (d2-d1).days
diff12 = (d1-d2).days
print(diff21)
print(diff12)

输出

9
-9

要获取当前日期,可以使用datetime.date.today()

对于第一期,可以使用cal.selection_get()datetime.date类型返回所选日期。然后,您可以轻松计算剩余天数:

selected = cal.selection_get()
delta = (selected - datetime.date.today()).days
status = "overdue" if delta <= 0 else f"{delta} days left"
print(f"{selected} ({status})")

对于第二个问题,您需要将val_var = (int(imp_var.get()))+ (int(man_var.get()))行移动到add_task()函数中:

def add_task():
    if name_entry.get() != '':
        val_var = int(imp_var.get()) + int(man_var.get())
        ...
    else:
        ...

注意,您需要对imp_var.get()man_var.get()返回的值进行一些验证,以避免由于无效值而导致异常

相关问题 更多 >

    热门问题