Sep 28, 2011

Calendar Maker Script (for Python) Pythonでカレンダーを作る

My wife pushed me to create a calendar of her design, but I couldn't find a good image, so I decided to make one as a programmer! Here is the image.
And this is a code.

#Attention!
Holidays are Japanese ones. To know which day is holiday, I got "jholiday.py" from here.
Thank you "AddingBox"!!
Also you need to install PIL(Python Image Library).

""" CREATE LARGE CALENDER IMAGE
This code is created by tiid (http://makerwannabe.blogspot.com/)
This work is licensed under the Creative Commons Attribution 3.0 Unported License. To view a copy of this license, visit http://creativecommons.org/licenses/by/3.0/ or send a letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
"""
 
import Image
from PIL import ImageFont, ImageDraw
from jholiday import holiday_name
from datetime import timedelta
import datetime

class CalenderImage() :
    def __init__(self, width, height):
        self.image = Image.new("RGB", (width,height), (255,255,255))
        self.draw = ImageDraw.Draw(self.image)
        self.font = ImageFont.truetype("/Library/Fonts/OsakaMono.ttf", 30)
        self.monthFont = ImageFont.truetype("/Library/Fonts/OsakaMono.ttf", 40)

    def setMergin(self, leftright, topbottom, month_height):
        self.currenttop = topbottom + month_height
        self.topbottom = topbottom
        self.monthHeight = month_height
        w,h = self.image.size
        self.delta_h = (h - 2*topbottom - self.monthHeight)/31
        self.delta_w = (w - 2*leftright) / 12
        self.currentleft = leftright - self.delta_w
        
    def drawDate(self, date, color):
        self.draw.text((self.currentleft, self.currenttop), str(date),
            fill=[(155,155,155), (155,155,255), (255,155,155)][color],
            font = self.font)

        font_w,font_h = self.font.getsize(str(date))
        self.draw.line([(self.currentleft, self.currenttop+font_h),
            (self.currentleft + self.delta_w*0.8 , self.currenttop+font_h)], fill=(155,155,155))

        self.currenttop += self.delta_h

    def changeMonth(self, date):
        self.currentleft += self.delta_w
        monthstr =  [None,"Jan","Feb","Mar","Apr","May","Jun","Jly","Aug","Sep","Oct","Nov","Dec"][date.month]
        font_w,font_h = self.monthFont.getsize(str(date.year))
        if(date.month==1 or date.month==9):
            self.draw.text((self.currentleft, self.topbottom),
                str(date.year), fill=(155,155,155), font = self.monthFont)
        self.draw.text((self.currentleft, self.topbottom+font_h),
            monthstr, fill=(155,155,155), font = self.monthFont)
            
        self.currenttop = self.topbottom + self.monthHeight
        
start_date = datetime.date(2011, 9, 1)
end_date = datetime.date(2012, 8, 31)
current_date = start_date
oneday = timedelta(1)

ci = CalenderImage(2481, 1755)
ci.setMergin(200, 100, 100)

while(current_date <= end_date):
    if(current_date.day==1): ci.changeMonth(current_date) 
    holiday = holiday_name(date = current_date)
    if(holiday != None):    ## red color
        ci.drawDate(current_date.day, 2)
    elif(current_date.weekday()==5): ## saturday
        ci.drawDate(current_date.day, 1)
    elif(current_date.weekday()==6): ## sunday
        ci.drawDate(current_date.day, 2)
    else:
        ci.drawDate(current_date.day, 0)
    
    current_date += oneday

ci.image.show()
ci.image.save("calendar.bmp", "BMP")


No comments: