使用Flask制作美观的网页日历

从零打造DIY智能显示屏:树莓派+网页技术构建个性化信息中枢 智能显示屏作为信息可视化与交互的重要载体,其核心原理是通过软硬件结合,将分散的数据源聚合并直观呈现。从技术实现角度看,它通常由主控板(如树莓派、ESP32)驱动屏幕,并依赖稳定的软件架构来确保长期运行。这种方案的技术价值在于其高度的定制性与可控性,能够突破商用产品在功能与成本上的限制。在应用场景上,它非常适合作为桌面信息看板、家庭控制中心或环境状态显示器,满足用户对实时数据(如系统状态、日程天气)的集中监控需求。本文以树莓派和网页技术栈为例,详细阐述了如何通过硬件选型、软件架构设计(特别是利用Flask后端 阅读详情
Python Calender模块

python的日历模块Calender提供了多种日历展示模式:

参数说明示例
setfirstweekday(firstweekday)0是星期一,…,6为星期日calendar.setfirstweekday(firstweekday=6)
monthcalendar(year, month)返回一个月中天数列表(不是当前月份的天数为0)calendar.monthcalendar(2019, 6)
prmonth(theyear, themonth, w=0, l=0)w每个单元格宽度,l每列换l行calendar.prmonth(2019, 6)
calendar.month_abbr[month]打印月份对应的英文简写calendar.month_abbr[6]
.........

基本的就是上面这些了....

Bootstrap 表格

Flask使用Bootstrap模板,这个前几期已经说了,还不清楚的朋友,可以看看往期内容。
今天主要说下Bootstrap的table

类说明
.table少量的内补(padding)和水平方向的分隔线
.table-striped给 <tbody> 之内的每一行增加斑马条纹样式
.table-bordered为表格和其中的每个单元格增加边框
.table-hover可以让 <tbody> 中的每一行对鼠标悬停状态作出响应
.table-condensed可以让表格更加紧凑,单元格中的内补(padding)均会减半
.active鼠标悬停在行或单元格上时所设置的颜色
.success标识成功或积极的动作
.info标识普通的提示信息或动作
.warning标识警告或需要用户注意
.danger标识危险或潜在的带来负面影响的动作
Flask日历

今天通过Flask,制作一个网页版日历,系统启动后,计算当天日期,并生成日历,高亮表示本月和今日。
首先,需要考虑日历的响应式布局,每行放四个月的数据,所以需要使用Bootstrap的栅格化<div class="col-lg-3">,保证在没有足够宽的情况下,自动转为单月的数据展示,避免重叠
其次,针对数据的排列,日历模块中calendar.monthcalendar(year, month)会返回一个原组,但如同下面的情况:

>>> import calendar
>>> calendar.setfirstweekday(firstweekday=6)
>>> calendar.monthcalendar(2019,5)
>>> [[0, 0, 0, 1, 2, 3, 4], [5, 6, 7, 8, 9, 10, 11],
     [12, 13, 14, 15, 16, 17, 18], [19, 20, 21, 22, 23, 24, 25],
     [26, 27, 28, 29, 30, 31, 0]]
>>> calendar.monthcalendar(2019,6)
>>> [[0, 0, 0, 0, 0, 0, 1], [2, 3, 4, 5, 6, 7, 8], 
     [9, 10, 11, 12, 13, 14, 15], [16, 17, 18, 19, 20, 21, 22],
     [23, 24, 25, 26, 27, 28, 29], [30, 0, 0, 0, 0, 0, 0]]
>>> len(calendar.monthcalendar(2019,5))
>>> 5
>>> len(calendar.monthcalendar(2019,6))
>>> 6

有的月份刚好卡在1号周六,所以列表长为6....这样会导致绘图的时候日历表格高度差异,所以如果不满6个的月份,我们手动给他创建创建一个数据全为0的空列表:

def calc_calender(date):
    year = date.year
    yearInfo = dict()
    for month in range(1, 13):
        days = calendar.monthcalendar(year, month)
        if len(days) != 6:
            days.append([0 for _ in range(7)])
        month_addr = calendar.month_abbr[month]
        yearInfo[month_addr] = days
    return yearInfo

针对返回的数据,使用Jinjia2模板进行循环获取,要注意一点是,如果是日期是0的,代表站位符,需要进行替换。
但如果整行都是零,会导致Bootstrap的表单样式变更,故使用&nbsp进行占位操作。
最终HTML代码如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Flask Calendar</title>
    <link rel="icon" href="{{ url_for('static',filename='favicon.ico') }}">
    <link href="{{ url_for('static',filename='bootstrap.min.css') }}" rel="stylesheet">
</head>

<body>
<div class="container">
    <h3 class="text-center">Welcome to Flask Calendar {{date.year}} <small><a href="https://www.jianshu.com/u/d23fd5012bed"> 清风Python</a></small></h3>

    {% set week_addr = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'] %}
    {% for month_addr,monthInfo in content.items()%}

    <div class="col-lg-3">
        <h4 class="text-center">{{month_addr}}</h4>
        {% with _month=false %}
        {% if month_addr == this_month %}
            <table style='background-color:#a6e1ec' class="table table-bordered">
            {% set _month = true %}
        {% else %}
            <table class="table table-bordered">
        {% endif %}
                <tr>
                    {% for addr in week_addr %}
                        <th>{{addr}}</th>
                    {% endfor %}
                </tr>
                {% for weeks in monthInfo %}
                <tr>
                    {% for day in weeks %}
                    {% if day == 0 %}
                    <td>&nbsp</td>
                    {% elif _month== true and day == date.day %}
                    <td style="background-color:hotpink;">{{ day }}</td>
                    {% else %}
                    <td>{{ day }}</td>
                    {% endif %}
                    {% endfor %}
                </tr>
                {% endfor %}
                {% endwith %}
            </table>
    </div>
    {% endfor %}

</div>

</body>
<footer class="text-center "><strong><a href="https://www.jianshu.com/u/d23fd5012bed">Flask Calendar By:清风Python</a></strong></footer>
</html>

JInjia2模板中,通过对with 和set的局部变量定义,判断月份与日期,最终达到高亮当月和当天的效果:


5847426-cebabe889ddddc2b.png
当天高亮效果.png

完整代码:

# -*- coding: utf-8 -*-
# @Author   : 王翔
# @JianShu  : 清风Python
# @Date     : 2019/6/4 06:01
# @Software : PyCharm
# @version  :Python 3.6.8
# @File     : index.py

from flask import Flask, render_template, request, session, redirect, url_for
import calendar
from datetime import datetime

calendar.setfirstweekday(firstweekday=6)
app = Flask(__name__)

week = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']


def calc_calender(date):
    year = date.year
    yearInfo = dict()
    for month in range(1, 13):
        days = calendar.monthcalendar(year, month)
        if len(days) != 6:
            days.append([0 for _ in range(7)])
        month_addr = calendar.month_abbr[month]
        yearInfo[month_addr] = days
    return yearInfo


@app.route('/', methods=["GET", "POST"])
def index():
    if request.method == "GET":
        date = datetime.today()
        this_month = calendar.month_abbr[date.month]
        return render_template('index.html', this_month=this_month, date=date, content=calc_calender(date))


if __name__ == '__main__':
    app.run(debug=True)

最终完成模板渲染后,显示年度日历:


5847426-96f2421b492050a7.gif
Flask Calendar.gif

完整代码上传在GitHub:https://github.com/KingUranus/FlaskTests

好了,今天的内容就到这里,如果觉得有帮助,记得点赞支持。欢迎大家关注我的公众号,获取更多Python相关的知识,并有整理好的各类福利数据供大家下载:


5847426-dbd743c1d0dd69d5.jpg
清风Python.jpg

©本文由作者:清风Python 原创 如需转载请注明

基于树莓派与Chromium Kiosk模式打造DIY智能信息显示屏 智能信息终端是物联网和智能家居领域的关键组件,它通过整合硬件与软件,将动态数据可视化呈现。其核心原理在于利用低成本单板计算机(如树莓派)作为计算核心,驱动显示屏,并通过软件架构实现信息的聚合与展示。在技术实现上,采用Chromium浏览器的Kiosk(信息亭)模式作为显示框架,结合轻量级后端服务(如Python Flask),能够高效、灵活地构建定制化信息面板。这种方案的价值在于打破了商业产品的生态捆绑,赋予了开发者对数据源、界面样式和交互逻辑的完全控制权。它非常适用于家庭自动化、个人仪表盘、数字标牌等场景 阅读详情

相关推荐

树莓派智能相框DIY:低成本打造个性化数字记忆墙

嵌入式开发与物联网技术为硬件赋予了智能化的灵魂,其核心原理在于通过微控制器或单板计算机连接传感器与执行器,实现数据采集、处理与交互。这一技术价值在于能够将闲置或低成本硬件转化为功能强大的定制化设备,极大地降低了智能硬件的入门门槛。在智能家居、环境监测等应用场景中,嵌入式系统因其低功耗、高可靠性和可深度定制的特点而备受青睐。本文聚焦于利用树莓派这一经典开源硬件平台,结合Python编程与PyGame图形库,从零开始构建一个具备自动轮播、网络同步与信息叠加功能的智能电子相框。项目实践涵盖了从硬件选型、系统精简配

weixin_33694620的博客 450

Flask框架(一)--搭建,请求,静态文件,模板(日历制作)

Flask 轻量级框架:flask,web.py,tornado,开发灵活,开发效率低,可以真正体现程序员的水平。 重量级框架:django,方便程序员开发,提供大量的功能组件(站点管理,csrf_token,富文本,表单类,缓存,日志,ORM) flask提供了什么? 只能够完成最简单的请求响应 jinja2:模板系统 werkzeug:工具箱(wsgi) 插件 一、开始Flask f...

一个非常正经的人的博客 537

基于树莓派的智能镜子:物联网环境监测系统全栈开发实践

物联网(IoT)技术通过传感器、微控制器和网络连接,将物理世界与数字世界融合,实现环境数据的实时采集与智能控制。其核心原理在于利用嵌入式系统采集传感器数据,通过网络协议传输至服务器或本地处理单元,最终通过软件界面进行可视化呈现与交互。这项技术的价值在于为智能家居、工业监控、环境感知等场景提供了低成本、可定制的解决方案。在智能家居领域,环境监测是基础应用之一,通过温湿度、人体感应等传感器,可以构建能感知环境的智能设备。本文以树莓派(Raspberry Pi)为核心,结合DS18S20、DHT11等传感器,详细

weixin_33728708的博客 543

面试官问我Python日历模块,我直接用Flask开发Web版日历应用给他

嚣张的面试开场 面试官:小伙子,python与时间有关的基础模块有哪些? 我: time datetime calendar 面试官:简单介绍下calendar日历模块 我: 我拒绝! 面试官:小子你很拽啊,那你想如何? 我:我想给大佬你做一个美观的网页版日历啊。 面试官:走两步,我瞧瞧... 我:好嘞! Python Calender模块 python的日历模块...

清风Python 1031

python使用Flask框架创建一个简单的动态日历

使用Flask框架创建一个简单的动态日历,运行代码,然后在浏览器中访问,将看到一个动态日历,能够通过点击按钮切换月份。

KEEP CODING 1278

flask-calendar:Python和Flask简单的Web日历

烧瓶日历 介绍 2017年12月,我决定我想尽可能退出Google服务。 日历是与我联系最紧密的服务之一。 没有太多选择,甚至更少的基于Web的。 我决定尝试使用带有到期日期和一些标签的Trello板一段时间,但事实证明维护起来比较困难。 加上缺少一个月的日历视图,并且不支持重复性/重复性任务,我决定充分利用假期来花费一些时间并构建一个简单的GCalendar克隆。 细节 主日历视图: 创建新的任务视图: 支持在一天中的桌面(如Google日历)上进行基本的拖放操作,现有任务的版本,创建重复性任务(每天,每月,按工作日,按月或特定日期编号),自定义颜色以及一些选项例如隐藏过去的任务或能够手

flair_使用Event Flair装饰您的Google日历

flairIf you’re a user Google Calendar you might want some options for customizing it. If you’re tired of the default interface, today we look at Event Flairs from Google Labs that allows you to custom...

culingluan4376的博客 269

flask-holcalendar:一个使用Flask编写的简单的Holiday Calendar Web应用程序

烧瓶-日历 使用编写的一个简单的Holiday Calendar Web应用程序。 该应用程序使用作为后端来获取有关办公室假期日历的信息。 用作构建应用程序的Web框架。 , 和用于前端开发。 演示版 建于 入门 这些说明将为您提供在本地计算机上运行并运行的项目的副本,以进行开发和测试。 先决条件 从创建Google Sheets API密钥。 下载notes.json文件并将其放在一边。 安装 克隆仓库: git clone https://github.com/rat9615/flask-holcalendar.git 更改目录: cd flask-holcalendar 。 在

爬虫新宠requests_html 带你甄别2019虚假大学

知识有价 公众号从5月31号开始第一次发文,到现在快一个月了。27天的时间里,更新了26篇文章。因为感觉每天更新身体有些扛不住,所以从上周开始,每周五给自己放个假,找朋友撸撸串,和同学怀念下10年前的dota1。 今天很开心,公司内部博客网站中,一个项目举办了相关的活动,具体活动的细节我也是今天才知道。大概评奖规则以作者文章获取赞赏或者推荐次数进行排名。之前写的flask制作美观的...

清风Python 417

stm32f103c8t6的中文字库

stm32的成熟中文字库,上手即用,操作简单

nbbskk的博客 3653

告别示教器!用C#和ABB PC SDK 6.08打造你的第一个Windows机器人控制台(附完整连接代码)

本文详细介绍了如何使用C#和ABB PC SDK 6.08开发Windows机器人控制台应用,实现无示教器的机器人控制。从环境配置、SDK引用到机器人发现、连接及状态监控,提供了完整的代码示例和架构设计建议,帮助开发者快速掌握上位机控制技术。

weixin_29758911的博客 323

python桌面应用html_是否将Python后端与HTML / CSS / JS用户界面集成到桌面应用程序? - javascript...

在创建桌面应用程序时,如何或将Python代码与HTML / CSS / JS集成为用户界面,该如何做?一个简单的例子;如果我想用Python创建一个打印“ Hello World!”的函数并使用HTML / CSS / JS创建用户界面(使其精美,也许添加一些图像),因此我可以将其用作桌面应用程序。我将如何处理?我知道我可以使用Tkinter之类的库,但是它不允许自定义用户界面的灵活性。我已经读...

weixin_39793420的博客 245

保姆级教程:用GlobleLand30数据+GTB3.3软件,一步步搞定MSPA景观格局分析

本文提供GlobleLand30数据结合GTB3.3软件进行MSPA景观格局分析的保姆级教程,涵盖数据预处理、软件操作、结果解读全流程,特别针对零基础用户常见问题提供解决方案,助力研究者高效完成景观生态学分析。

weixin_26757925的博客 450

程序猿老爸带娃编程的小小课堂——九九乘法表的编程实现

《程序猿老爸带娃学编程:用嵌套循环实现九九乘法表》是一篇趣味编程教学案例。文章通过类比做菜的步骤,生动讲解了如何用Python嵌套循环生成九九乘法表:外层循环控制行数,内层循环控制每行公式数。重点解析了循环结构、变量使用和格式化输出等核心概念,并特别提醒注意循环边界和代码缩进。最后以温馨寄语鼓励孩子保持学习热情,将编程比作骑自行车,强调坚持练习的重要性。全文用生活化比喻降低理解难度,适合亲子编程启蒙教学。

20多年IT老兵|制造业数据架构与AI落地|全流程亲手实践|源码同步开源 553

内存优化--LOGBACK导致内存告警

一.故事背景 由于开辟新市场需要,开发了新的项部署在海外平台,其中最消耗内存的功能是消费kafka消息(最开始预计一天有1千万的量),部署完之后运行一段时间发现出现内存告警问题。 二.分析问题 出现内存告警,(新项目是低配置机器 2C4G * 2台)第一个念头是去查看堆空间设置的情况,看到jvm启动命令中堆空间都是直接指定大小,说明问题不是出在堆空间 -Xmx3g -Xms3g 先不管这些,去查看总的内存使用情况,发现总的内存空间使用将近有92% = 3.68G,那么这多出来使用的0.6

qq_33199919的博客 6052

第一弹:llama.cpp编译

1.编译llama.cpp命令行(电脑版本);2.交叉编译安卓命令行版本。

joedan0104的专栏 1万+

python《计算机基础》flask课程网站建设系统django

前端功能的一部分,包括管理添加、编辑和删除等操作,是后台功能的主要组成部分。课程介绍、教学视频、教程、软件下载、介绍和公告以及成员资格管理,这些元素共同构成了上下文的基础。老师可以通过论坛的形式发布问题与学生进行学习的交流,学生也可以提出学习的困惑和对教学方法等的建议。管理员可以通过后台对课程介绍中的内容进行添加,修改,删除等。首页有一个导航栏,通过点击不同的功能图标转到相应功能的界面进行操作。这部分主要是方便学生通过教学日历更加了解教学的进度,学生可以自行下载一些实验相关资源,从而规划自己的学习进度。

鹏飞的博客 330

LFM调制信号分类与检测识别

支持识别LFM信号、间歇采样干扰(ISRJ)、灵巧噪声干扰(SNJ)、扫频干扰(SJ)、瞄准干扰(AJ)、阻塞干扰(BJ)、密集假目标干扰(DFJ)、密集假目标加灵巧噪声干扰(DFWSNJ)、距离欺骗干扰(DDJ)、距离欺骗加灵巧噪声干扰(DDWSNJ)。Faster-RCNN支持检测识别LFM信号、间歇采样干扰(ISRJ)、灵巧噪声干扰(SNJ)、扫频干扰(SJ)、瞄准干扰(AJ)、密集假目标干扰(DFJ)、密集假目标加灵巧噪声干扰(DFWSNJ)、距离欺骗加灵巧噪声干扰(DDWSNJ)等8种信号。

菜yuan~的博客 1029

一站式宠物店服务系统 宠物商城系统小程序的设计与实现

前端采用微信小程序原生开发或跨平台框架(如Taro、Uni-app),后端选择Node.js+Express或Java Spring Boot,数据库使用MySQL或MongoDB。明确系统核心功能模块:宠物商品商城(食品、用品、药品)、宠物服务预约(美容、医疗、寄养)、会员管理、订单管理、在线咨询、社区互动等。进行功能测试(单元测试、接口测试)、性能测试(负载测试)及安全测试(数据加密、防SQL注入)。构建会员体系(积分、等级)、订单跟踪(物流API集成)、消息推送(模板消息)。

专注分享bishe530的博客 573

Vue3 - Element Plus 组件库 Tabs 标签页右侧区域插入按钮,<el-tabs> / <el-tab-pane> 选项卡组件右侧自定义插槽内容教程(右边区域添加自定义按钮功能区)

vue3,elementplus,tabs选项卡如何在插槽按钮,tabs标签页组件怎么自定义右侧内容,vue3elementplustabs组件右侧插槽按钮,element-plus在el-tabs组件的最右侧添加按钮,如何在选项卡右边加入按钮搜索框等内容,哪个属性能在tab选项卡右侧插入自定义按钮,在el-tabs组件最右侧添加按钮,vue3el-tabs组件怎么自定义右侧插槽内容,Tabs标签页右侧自定义插槽,ElementPlusTab右边加按钮,el-tabs组件自定义右侧按钮,在E

🏆 前端领域优质创作者 7016

MATLAB 开发项目实例 1000 例专栏之第37例:基于Simulink的无人机飞行控制系统设计

通过上述项目实例,我们成功地使用Simulink设计和仿真了一个无人机的飞行控制系统。这个项目展示了从无人机建模、路径规划、控制器设计到仿真验证的完整流程。Simulink的可视化和模块化特性使得系统的建模和仿真更加直观和高效。

xiaoheshang_123的博客 163

AIGC(生成式AI)试用 44 -- 个人知识库

AIGC(生成式AI)试用 43 -- 个人知识库

Rolei的博客 1355

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Python办公自动化实战:基于Excel与Word的周报一键生成系统

办公自动化是提升工作效率、减少重复性劳动的关键技术领域。其核心原理是通过脚本或程序,将手动、繁琐的操作流程转化为自动执行的指令序列,从而实现任务的批量、精准和无人值守处理。在技术价值上,自动化不仅能显著节省时间、降低人为错误率,更能将人力资源从机械劳动中解放出来,聚焦于更具创造性和战略性的工作。典型的应用场景包括数据处理、报告生成、文件格式转换和邮件通知等。本文聚焦于一个具体的工程实践案例——周报自动生成系统,它巧妙地运用了Python生态中的pandas库进行高效的数据处理与分析,特别是针对“excel多

weixin_34367257的博客 419

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: Flask使用Bootstrap模板并引入Ajax后台完成数据刷新
下一篇: Bootstrap学习笔记4--按钮控件与css骚操作
清风Python
博客等级 码龄7年 406粉丝 267原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值