import datetimefrom PyQt5.QtWidgets import QWidget from PyQt5.QtGui import QPainter, QColorfrom CommitCalendar.pyqt5._color import ColorSchemeclassQCommitCalendar(QWidget):""" A Github Commit-Calendar like widget. """def__init__(self,commit_data:dict,block_size:int=10,# commit方块的大小block_spacing:int=3,# commit方块的空隙color_scheme=ColorScheme.Naive,# 见第二部分orientation:str='right',# 图表的朝向,GitHub是朝右的,这里还可以朝左# Inherit from QWidget.parent=None,*args,**kwargs):super().__init__(parent,*args,**kwargs)self.commit_dict = commit_dataself.block_size = block_sizeself.block_spacing = block_spacingself.color_scheme = color_schemeself.orientation = orientationself._today = datetime.date.today()self._weekday = datetime.datetime.now().weekday()# 星期数下标,0开始self._painter = QPainter(self)self.setMinimumSize(250,115)self.setMaximumWidth(725)self.setStyleSheet("background-color: white")def_calc_cols_nbr(self)->int:# 计算可以画出多少列returnint(self.width()/(self.block_size + self.block_spacing)-2)def_set_painter(self, color:str):# 设置画笔self._painter.setPen(QColor(color))self._painter.setBrush(QColor(color))def_commit_color_map(self, date:str):# 将不同的commit数对应不同的颜色,这里的标准自己拟定# Map commit number to color.commit = self.commit_dict.get(date)if commit isnotNone:commit =int(commit)if commit >10:self._set_painter(self.color_scheme[3])elif commit >5:self._set_painter(self.color_scheme[2])else:self._set_painter(self.color_scheme[1])else:self._set_painter(self.color_scheme[0])defpaintEvent(self, paint_event):assert self.block_size >=10assert self.block_spacing >0assert self.orientation in('right','left')# Begin painting...self._painter.begin(self)delta =0# 日期偏移cols =range(self._calc_cols_nbr())for col in cols:# Monday index is 0, and the first day of week is Sunday.# 周一的下标是0,而且一周的开始是周日# 这里绘制行时需分情况rows =range(self._weekday +2)if col ==0elserange(7)for row in rows:if self.orientation =='right':x = self.width()-(self.block_size + self.block_spacing)*(col +2)else:x =(self.block_size + self.block_spacing)*(col +1)y =(self.block_size + self.block_spacing)*(len(rows)- row)# Paint different color on.date = self._today - datetime.timedelta(days=delta)self._commit_color_map(str(date))delta +=1self._painter.drawRect(x, y, self.block_size, self.block_size)self._painter.end()
第二部分
这里配置颜色表,从左到右依次由浅入深。
classColorScheme:# hex color from less to more (0 ~ 4)Naive =('#ebedf0','#c6e48b','#7bc96f','#239a3b','#196127')# GitHub原配色Velvet=('#ebedf0','#e1eec3','#e6bea1','#ea8e7f','#f05053')# 桃阳红配色