matplotlib 在Python中创建一个包含事件的日历[已关闭]

7d7tgy0s  于 2023-10-24  发布在  Python
关注(0)|答案(1)|浏览(160)

**已关闭。**此问题正在寻求书籍,工具,软件库等的建议。它不符合Stack Overflow guidelines。目前不接受答案。

我们不允许您提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便您可以通过事实和引用来回答问题。
上个月关门了。
Improve this question
我想创建一个一个月的日历,我可以打印出来,并交给正常的人,有事件已经在它。
我想做一些类似于WinCalendar的东西。我会使用那个程序,但是评论提到粗略的DLL,注册表项和启动默认值。难道不应该有一个python库来做这个吗?
下面是项目和文件的github链接。
我可以用matplotlib创建我想要的东西,如下所示。

import calendar
import matplotlib.pyplot as plt

calendar.setfirstweekday(6) # Sunday is 1st day in US
w_days = 'Sun Mon Tue Wed Thu Fri Sat'.split()
m_names = '''
January February March April
May June July August
September October November December'''.split()

class MplCalendar(object):
    def __init__(self, year, month):
        self.year = year
        self.month = month
        self.cal = calendar.monthcalendar(year, month)
        # monthcalendar creates a list of lists for each week
        # Save the events data in the same format
        self.events = [[[] for day in week] for week in self.cal]
        
    def _monthday_to_index(self, day):
        'The index of the day in the list of lists'
        for week_n, week in enumerate(self.cal):
            try:
                i = week.index(day)
                return week_n, i
            except ValueError:
                pass
         # couldn't find the day
        raise ValueError("There aren't {} days in the month".format(day))

    def add_event(self, day, event_str):
        'insert a string into the events list for the specified day'
        week, w_day = self._monthday_to_index(day)
        self.events[week][w_day].append(event_str)

    def show(self):
        'create the calendar'
        f, axs = plt.subplots(len(self.cal), 7, sharex=True, sharey=True)
        for week, ax_row in enumerate(axs):
            for week_day, ax in enumerate(ax_row):
                ax.set_xticks([])
                ax.set_yticks([])
                if self.cal[week][week_day] != 0:
                    ax.text(.02, .98,
                            str(self.cal[week][week_day]),
                            verticalalignment='top',
                            horizontalalignment='left')
                contents = "\n".join(self.events[week][week_day])
                ax.text(.03, .85, contents,
                        verticalalignment='top',
                        horizontalalignment='left',
                        fontsize=9)

        # use the titles of the first row as the weekdays
        for n, day in enumerate(w_days):
            axs[0][n].set_title(day)

        # Place subplots in a close grid
        f.subplots_adjust(hspace=0)
        f.subplots_adjust(wspace=0)
        f.suptitle(m_names[self.month] + ' ' + str(self.year),
                   fontsize=20, fontweight='bold')
        plt.show()

然后我可以创建一个MplCalendar对象,添加事件并显示它,如下所示。

from matplotlib_calendar import MplCalendar
import matplotlib_calendar

feb = MplCalendar(2017, 2) #2017, February
feb.add_event(1, '1st day of February')
feb.add_event(5, '         1         2         3         4         5         6')
feb.add_event(5, '123456789012345678901234567890123456789012345678901234567890')
feb.add_event(18, 'OSLL Field Maintenance Day')
feb.add_event(18, 'OSLL Umpire Mechanics Clinic')
feb.add_event(20, 'Presidents day')
feb.add_event(25, 'OSLL Opening Day')
feb.add_event(28, 'T-Ball Angels vs Dirtbags at OSLL')
feb.show()

这会产生一个类似这样的日历。

我是不是在这里重新发明了一个轮子?我已经尝试了一堆相关的谷歌搜索,我找不到任何东西。

voj3qocg

voj3qocg1#

既然没有人回答这个问题,而且它有将近5000的浏览量,我想应该有一个6岁的问题。
我是不是在重新发明一个轮子?
虽然这个问题可以非法固执己见的答案一般,这个问题真的只在生产情况下是重要的。在OP的情况下,该项目是个人的,并提供给那些感兴趣的公众。即使,6年前,有其他事件日历在python,重新创建他们的解决方案可以让您学习或练习构建解决方案所涉及的思维过程。虽然代码本身可能不会教您任何东西,虽然这门语言是新的,但它仍然是一项值得做的脑力练习。
简而言之,6年前,不,你可能没有重新发明,即使你正在解决一个问题,有一个解决方案,你想使用不同的路线到达那里。
总的来说,我并不喜欢“重新发明轮子”这个词,因为轮子本身一直在被重新发明,如果不是这样,我们就不会跑得太快。总有一些东西需要学习,如果不是关于代码或语言,那么就是关于问题如何分解,解决和语法选择的思维过程(为什么没有使用继承,为什么1个算法被选中而不是另一个...等等)。

相关问题