每到年初,很多做人事、行政、排班或项目管理的朋友都会需要一份当年的节假日清单——哪些天是法定假日?哪些周末因为调休需要上班?手动查日历再一个个标记,不仅繁琐还容易出错。
今天我们就用 Python + PyQt5 + chinese-calendar 库,打造一个带图形界面的「节假日标记工具」,选好年份点一下就能生成全年数据,还能一键导出 CSV 文件。

欢迎大家关注此公众号,后台留言"python书籍"可免费获取【Python办公自动化高清PDF】电子书一本
此外小庄推荐一本适合于新手\小白入手一本 Python基础书籍,欢迎大家订阅
工具启动后的界面包含:
点击「生成节假日数据」后,全年 365 天的数据秒级呈现,不同类型用不同颜色标记:
chinese-calendar 是一个专门处理中国法定节假日的 Python 库,核心 API:
from chinese_calendar import is_workday, is_holiday, get_holiday_detail
# 判断某天是否为工作日(考虑调休)
is_workday(date(2026, 1, 1)) # False(元旦假期)
# 获取节假日详情,返回 (是否节假日, 节日名称)
get_holiday_detail(date(2026, 1, 1)) # (True, Holiday.new_years_day)它已经内置了历年的调休安排,所以我们不需要手动维护数据。
对于全年的每一天,我们按以下优先级判断类型:
不是工作日?
├─ 有节日名称 → 法定节假日
├─ 周六/周日 → 周末休息
└─ 其他 → 节假日
是工作日?
├─ 周六/周日 → 调休上班 ⚠️
└─ 周一~周五 → 正常工作日关键点在于「调休上班」的判断:如果某天是周六或周日,但 is_workday() 返回 True,说明这天是因为法定节假日而需要补班的调休日。
节假日标记.py # 全部代码在一个文件中,方便分发依赖只有两个:
pip install PyQt5 chinese-calendar我们使用 Qt 样式表(QSS)来美化界面,类似 CSS 的写法:
STYLE_SHEET = """
QPushButton {
background-color: #1890ff;
color: white;
border: none;
border-radius: 6px;
padding: 8px 20px;
font-weight: bold;
}
QPushButton:hover {
background-color: #40a9ff;
}
QGroupBox {
border: 1px solid #d9d9d9;
border-radius: 8px;
background-color: #ffffff;
}
/* ... 更多样式 */
"""通过 app.setStyleSheet(STYLE_SHEET) 全局应用,让整个界面呈现 Ant Design 风格的蓝色主题。
遍历 365 天并调用 chinese_calendar API 虽然很快,但为了良好的用户体验(界面不卡顿 + 进度条反馈),我们用 QThread 放到后台执行:
classHolidayWorker(QThread):
progress = pyqtSignal(int) # 进度信号
log = pyqtSignal(str) # 日志信号
finished_data = pyqtSignal(list) # 完成信号,传回数据
def__init__(self, year: int):
super().__init__()
self.year = year
defrun(self):
results = []
start = date(self.year, 1, 1)
end = date(self.year, 12, 31)
total_days = (end - start).days + 1
for i inrange(total_days):
d = start + timedelta(days=i)
# ... 判断日期类型,收集到 results 中
# 每 30 天更新一次进度
if (i + 1) % 30 == 0:
self.progress.emit(int((i + 1) / total_days * 100))
self.finished_data.emit(results)主线程只需要连接信号即可:
self.worker = HolidayWorker(year)
self.worker.progress.connect(self.progress.setValue)
self.worker.log.connect(self._log)
self.worker.finished_data.connect(self._on_data_ready)
self.worker.start()数据生成后,通过 QTableWidget 展示,并对不同类型的行设置不同的背景色和文字色:
color_map = {
"法定节假日": QColor("#fff1f0"), # 浅红
"周末休息": QColor("#f6ffed"), # 浅绿
"调休上班": QColor("#fffbe6"), # 浅黄
"正常工作日": QColor("#ffffff"), # 白色
}
for row, item inenumerate(data):
bg = color_map.get(item["类型"])
for col, key inenumerate(["日期", "星期", "类型", "备注"]):
cell = QTableWidgetItem(item[key])
cell.setBackground(bg)
self.table.setItem(row, col, cell)导出使用 csv.DictWriter,编码选 utf-8-sig 以确保 Excel 打开时中文不乱码:
withopen(path, "w", newline="", encoding="utf-8-sig") as f:
writer = csv.DictWriter(f, fieldnames=["日期", "星期", "类型", "备注"])
writer.writeheader()
writer.writerows(self.data)# 1. 安装依赖
pip install PyQt5 chinese-calendar
# 2. 运行程序
python 节假日标记.py这个工具还可以继续扩展:
openpyxl 直接输出带颜色的 .xlsx 文件本文通过一个实用的节假日标记工具,展示了以下技术要点:
| PyQt5 | |
| QSS 样式表 | |
| QThread + 信号槽 | |
| QTableWidget | |
| chinese-calendar | |
| csv 模块 |
整个程序只有一个文件、两个依赖,非常适合作为日常办公小工具使用。如果你的工作中需要频繁查询节假日信息,不妨试试这个工具!