热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[PyQt5]实现GitHub的CommitCalendar(贡献瓦片图)

Github的commitcalendar记录了每天的贡献量。这次就实现一个这种样式的图表吧!使用PyQt5。第一部分:importdatetime

Github的commit calendar记录了每天的贡献量。
commit
这次就实现一个这种样式的图表吧!使用PyQt5。


第一部分:

import datetimefrom PyQt5.QtWidgets import QWidget
from PyQt5.QtGui import QPainter, QColorfrom CommitCalendar.pyqt5._color import ColorSchemeclass QCommitCalendar(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:# 计算可以画出多少列return int(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 is not None: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])def paintEvent(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 == 0 else range(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()

第二部分

这里配置颜色表,从左到右依次由浅入深。

class ColorScheme:# hex color from less to more (0 ~ 4)Naive = ('#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127') # GitHub原配色Velvet= ('#ebedf0', '#e1eec3', '#e6bea1', '#ea8e7f', '#f05053') # 桃阳红配色

测试

这里使用json数据来代表每日的commit数:

{"2019-07-28": "2","2019-07-29": "5","2019-07-30": "8","2019-07-31": "2","2019-08-01": "1","2019-08-08": "2","2019-08-20": "12","2019-08-25": "5","2019-08-28": "2","2019-08-31": "7","2019-09-01": "2","2019-09-18": "2","2019-09-28": "5","2019-09-30": "2","2019-10-28": "1","2019-11-28": "2","2019-12-21": "12","2019-12-28": "2","2020-02-14": "4","2020-02-26": "15"
}

测试脚本:

import sys
import cgitb
import jsonfrom PyQt5.QtWidgets import QApplication
from CommitCalendar.pyqt5 import QCommitCalendar, ColorSchemecgitb.enable(format("text"))if __name__ == '__main__':app = QApplication(sys.argv)f = open('test.json', 'r')cc = QCommitCalendar(json.load(f))f.close()cc.setWindowTitle('PyQt5 Demo')cc.show()sys.exit(app.exec_())

运行效果如下:
demo
还可以更改配色:
cc = QCommitCalendar(json.load(f), color_scheme=ColorScheme.VelvetSun)
other


总结

大体效果是实现了,但是还差周围的一些标签,这些也好说,此处就不进行展示了。唯一的缺陷时,这些方块不可交互,不能用鼠标点击获取详细信息。如果要这样做的话,可以使用QQGraphicsRectItem实现。新的一年,看看今年会有多少贡献吧!


推荐阅读
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • 学习笔记17:Opencv处理调整图片亮度和对比度
    一、理论基础在数学中我们学过线性理论,在图像亮度和对比度调节中同样适用,看下面这个公式:在图像像素中其中:参数f(x)表示源图像像素。参数g(x)表示输出图像像素。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • 解决github访问慢的问题的方法集锦
    本文总结了国内用户在访问github网站时可能遇到的加载慢的问题,并提供了解决方法,其中包括修改hosts文件来加速访问。 ... [详细]
  • Thisworkcameoutofthediscussioninhttps://github.com/typesafehub/config/issues/272 ... [详细]
author-avatar
阳光下微醺的我
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有