python - Tkinter python 索引
问题描述
我正在制作一个倒计时日历,用于检查剩余天数、名称和信息,但如果超过 50 天部分不起作用,则会更改颜色。大佬能查一下吗。。它检查每个节日还剩下多少。同样如您所见,如果我将任何节日的日期更改为今天,它会显示1 Day left until
。我想解决这个问题
这是来自的文字festivals.txt
Dashain,14/10/21,This is Nepal Main Festival
Tihar,6/11/21,Festival of Lights
Christmas,25/12/21,Jingle Bells
New Year,1/01/22,The Day of the new year
from tkinter import Tk, Canvas, simpledialog, messagebox
from datetime import date, datetime
# function get_events is to get the celebration events
def get_events():
list_events = []
with open('festivals.txt') as file:
for line in file:
line1 = line.rstrip('\n')
global current_event
current_event = line1.split(',')
current_event[1] = datetime.strptime(current_event[1], '%d/%m/%y').date()
list_events.append(current_event)
return list_events
# Function to get the dates between the 2
def days_between_dates(date1, date2):
time_between = str(date1 - date2)
number_of_days = time_between.split(' ')
return number_of_days[0]
# End of Functions
# -----------------------------------------------------------------------------------------------
# Main program starts here
root = Tk()
root.title('Calendar')
# Make Canvas
c = Canvas(root, width=2000, height=800, bg='black')
c.pack()
c.create_text(100, 50, anchor='w', fill='cyan', font=' Times 40 bold italic underline',
text='My Countdown Calendar' )
# Store the functions in variables
events = get_events()
today = date.today()
# Aligning the text, sorting the list
vertical_space = 100
events.sort(key=lambda x: x[1])
horizontal_space = 100
# Main Loop
for event in events:
event_name = event[0]
days_until = days_between_dates(event[1], today)
display = 'It is %s days until %s. %s is about %s' % (days_until, event_name, event_name,event[2])
if (int(days_until) > 10):
text_col = '#c11a2b'
remin = 'Come one %s in coming' % (event_name)
c.create_text(550, 500, anchor='w', fill='purple', font='Courier 20 bold underline', text=remin)
else:
text_col = 'lime'
c.create_text(200, vertical_space, anchor='w', fill=text_col,
font='Calibri 28 bold', text=display)
vertical_space = vertical_space + 30
horizontal_space = horizontal_space + 40
解决方案
日期计算存在一些问题。
首先,您可以使用in返回days
的对象的属性获取天数。该函数可以写成:timedelta
date1 - date2
days_between_dates()
def days_between_dates(date1, date2):
return (date1 - date2).days
这更简洁,更不容易出错,现在它将返回一个在其他计算中更有用的整数。
这也修复了一个错误。当日期相同并str(date1 - date2)
返回
'0:00:00'
您的代码无法解析的日期时。
关于大于 50 的条件,您的代码中没有这样的检查。有一个> 10
,但您的测试数据并未测试该条件。您应该添加一个日期在当天的 10 天内的行。
最后,您需要在事件已经发生时处理过去的事件。目前,固定代码将在事件发生前显示负数天数。
推荐阅读
- c++ - selectedIndexes() 返回的 QModelIndexList 始终为空
- javascript - 从 LAN 中的其他设备访问我的 ReactJS 项目
- c# - c# nunit extent 报告没有截屏,传递异常
- r - 如何提取列表中所有唯一因子水平的排列
- audiokit - 如何播放一次 AKAppleSequencer 的一个部分/范围
- verilog - FIFO的verilog代码(先进先出)没有显示正确的结果?
- java - 错误:JMSCC5007:不支持使用 JMS2.0 API“createContext()”
- django - 更改语言后如何重定向到上一页?
- android - React Native Release apk 在 RazorpayCheckout.open razorpay 网关上崩溃
- c - 在源代码中配置 clang-format