【项目分享】使用python的ttkbootstrap模块构建一个炫酷的计时器

目录

前言

项目背景

项目展示(图片)

项目实现

1. 安装与设置

2. 创建主窗口

3. 初始化计时器功能

4. 实现计时功能

5. 实现隐藏边框与置顶功能

6. 运行应用

完整代码

结论


🌟 嗨,我是命运之光!

🌍 2024,每日百字,记录时光,感谢有你一路同行。

🚀 携手启航,探索未知,激发潜能,每一步都意义非凡。


前言

在这篇博客笔记中,我将分享如何使用 Python 的 ttkbootstrap 库创建一个外观现代、炫酷的计时器应用程序。这个计时器能够精确到秒,并且具备隐藏窗口边框、置顶窗口的功能。

项目背景

我希望通过这个项目来探索 ttkbootstrap 库,该库提供了一种更现代和更具美感的方式来构建基于 Tkinter 的 GUI 应用程序。目标是创建一个简单、功能齐全的计时器,并为按钮添加一些交互效果,使界面更具吸引力。

项目展示(图片)

可以记录时间,精确到秒 

可以隐藏边框(点击后隐藏边框加窗口置顶

项目实现

1. 安装与设置

首先,确保你已经安装了 ttkbootstrap。如果还没有,可以使用以下命令进行安装:

pip install ttkbootstrap

2. 创建主窗口

我们使用 tkinter 创建主窗口,并通过 ttkbootstrapStyle 对象来设置应用的主题。在本例中,我们选择了一个现代的 vapor 主题。

import tkinter as tk
from ttkbootstrap import Style
from ttkbootstrap import ttk
import timeclass TimerApp(tk.Tk):def __init__(self):super().__init__()self.title("计时器")self.geometry("220x100")# 设置样式style = Style(theme='vapor')  # 使用现代的 'vapor' 主题

3. 初始化计时器功能

我们需要一个标签来显示时间,并且提供“开始/停止”、“重置”以及“隐藏边框”三个按钮。每个按钮都使用不同的 ttkbootstrap 样式,使其看起来更有设计感。

        # 初始化计时器变量self.start_time = Noneself.running = Falseself.decorated = True  # 初始状态为显示边框# 标签显示时间self.time_label = ttk.Label(self, text="00:00:00", font=("Helvetica", 24))self.time_label.pack(pady=10)# 开始/停止按钮self.start_button = ttk.Button(self, text="开始", command=self.start_stop, style='info.TButton')self.start_button.pack(side=tk.LEFT, padx=5)# 重置按钮self.reset_button = ttk.Button(self, text="重置", command=self.reset, style='warning.TButton')self.reset_button.pack(side=tk.LEFT, padx=5)# 切换边框按钮self.toggle_button = ttk.Button(self, text="隐藏边框", command=self.toggle_border, style='success.TButton')self.toggle_button.pack(side=tk.LEFT, padx=5)

4. 实现计时功能

接下来,我们定义了 update_timestart_stopreset 方法来控制计时器的逻辑。

    def update_time(self):if self.running:elapsed_time = int(time.time() - self.start_time)hours, remainder = divmod(elapsed_time, 3600)minutes, seconds = divmod(remainder, 60)self.time_label.config(text=f"{hours:02}:{minutes:02}:{seconds:02}")self.after(1000, self.update_time)def start_stop(self):if not self.running:self.start_time = time.time() - (int(self.time_label.cget("text").split(":")[0]) * 3600 + int(self.time_label.cget("text").split(":")[1]) * 60 +int(self.time_label.cget("text").split(":")[2]))self.running = Trueself.start_button.config(text="停止", style='danger.TButton')self.update_time()else:self.running = Falseself.start_button.config(text="开始", style='info.TButton')def reset(self):self.running = Falseself.start_button.config(text="开始", style='info.TButton')self.time_label.config(text="00:00:00")

5. 实现隐藏边框与置顶功能

我们通过 toggle_border 方法来实现隐藏窗口边框和置顶窗口的功能。当用户点击按钮时,窗口会切换边框的显示状态,并且保持在所有窗口的最前端。

    def toggle_border(self):if self.decorated:self.overrideredirect(True)  # 隐藏边框self.wm_attributes("-topmost", True)  # 将窗口置顶self.toggle_button.config(text="显示边框", style='primary.TButton')else:self.overrideredirect(False)  # 显示边框self.wm_attributes("-topmost", False)  # 取消置顶self.toggle_button.config(text="隐藏边框", style='success.TButton')self.decorated = not self.decorated  # 切换状态

6. 运行应用

最后,我们使用 if __name__ == "__main__": 块来启动应用程序。

if __name__ == "__main__":app = TimerApp()app.mainloop()

完整代码

import tkinter as tk
from ttkbootstrap import Style
from ttkbootstrap import ttk
import timeclass TimerApp(tk.Tk):def __init__(self):super().__init__()self.title("计时器")self.geometry("220x100")# 设置样式style = Style(theme='vapor')  # 尝试使用一个更现代的主题# 初始化计时器变量self.start_time = Noneself.running = Falseself.decorated = True  # 初始状态为显示边框# 标签显示时间self.time_label = ttk.Label(self, text="00:00:00", font=("Helvetica", 24))self.time_label.pack(pady=10)# 开始/停止按钮self.start_button = ttk.Button(self, text="开始", command=self.start_stop, style='info.TButton')self.start_button.pack(side=tk.LEFT, padx=5)# 重置按钮self.reset_button = ttk.Button(self, text="重置", command=self.reset, style='warning.TButton')self.reset_button.pack(side=tk.LEFT, padx=5)# 切换边框按钮self.toggle_button = ttk.Button(self, text="隐藏边框", command=self.toggle_border, style='success.TButton')self.toggle_button.pack(side=tk.LEFT, padx=5)def update_time(self):if self.running:elapsed_time = int(time.time() - self.start_time)hours, remainder = divmod(elapsed_time, 3600)minutes, seconds = divmod(remainder, 60)self.time_label.config(text=f"{hours:02}:{minutes:02}:{seconds:02}")self.after(1000, self.update_time)def start_stop(self):if not self.running:self.start_time = time.time() - (int(self.time_label.cget("text").split(":")[0]) * 3600 + int(self.time_label.cget("text").split(":")[1]) * 60 +int(self.time_label.cget("text").split(":")[2]))self.running = Trueself.start_button.config(text="停止", style='danger.TButton')self.update_time()else:self.running = Falseself.start_button.config(text="开始", style='info.TButton')def reset(self):self.running = Falseself.start_button.config(text="开始", style='info.TButton')self.time_label.config(text="00:00:00")def toggle_border(self):if self.decorated:self.overrideredirect(True)  # 隐藏边框self.wm_attributes("-topmost", True)  # 将窗口置顶self.toggle_button.config(text="显示边框", style='primary.TButton')else:self.overrideredirect(False)  # 显示边框self.wm_attributes("-topmost", False)  # 取消置顶self.toggle_button.config(text="隐藏边框", style='success.TButton')self.decorated = not self.decorated  # 切换状态if __name__ == "__main__":app = TimerApp()app.mainloop()

结论

通过使用 ttkbootstrap,我们成功地创建了一个外观现代且功能完善的计时器应用程序。这个项目展示了如何通过调整按钮样式和添加动画效果来提升用户体验。ttkbootstrap 提供了非常方便的接口来设计美观的 GUI,希望这篇笔记能为你提供一些启发,帮助你在自己的项目中实现更加高级的 UI 效果。


嗨,我是命运之光。如果你觉得我的分享有价值,不妨通过以下方式表达你的支持:👍 点赞来表达你的喜爱,📁 关注以获取我的最新消息,💬 评论与我交流你的见解。我会继续努力,为你带来更多精彩和实用的内容。

点击这里👉 ,获取最新动态,⚡️ 让信息传递更加迅速。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/399654.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始实现循环神经网络

本节我们通过使用MXnet,来从零开始的实现一个含有隐藏状态的循环神经网络。 前序工作 数据集预处理进行采样 实现循环神经网络 完成前序工作后,即可开始实现循环神经网络。本文首先构建一个具有隐状态的循环神经网络。其结构如图所示: 接…

Linux的常用操作-02

一:Linux的系统目录结构 /bin bin是ary的缩写,这个目录存放着最经常用的命令 /boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。 /dev:dev是Device(设备)的缩写,该目录下存放的是Lin…

Servlet——个人笔记

Servlet——个人笔记 文章目录 [toc]Servlet简介Servlet命名Servlet由来实现过程 Servlet 相对 CGI 的优势简要说说什么是CGI Servlet 在IDEA中开发流程Servlet注解方式配置WebServlet注解源码WebServlet注解使用 Servlet常见容器Servlet 生命周期简介测试 Servlet 方法init()…

MySQL(一)——初识数据库(概念、数据类型、基本表库操作)

文章目录 初识数据库数据库相关基本概念数据库的分类 MySQL数据库数据模型基本操作库操作查看数据库创建数据库删除数据库选中数据库 数据类型数值类型字符串类型日期类型 表操作查看所有表查看表结构创建表删除表 其他操作查看警告信息查看编码集 这是我们 MySQL 学习的第一程…

数据结构+图的基本应用

一、问题描述 求有向图的简单路径 编写一个程序,设计相关算法完成以下功能。 (1)输出如图所示的有向图 G 从顶点 5 到顶点 2 的所有简单路径。 (2)输出如图所示的有向图 G 从顶点 5 到顶点 2 的所有长度为 3 的简单路径。 (3)输出如图所示的有向图 G 从顶点 5 到顶点…

【nvidia-smi】Failed to initialize NVML: Driver/library version mismatch

服务器更新后,输入nvidia-smi出现如下报错: 解决方法参考: 已解决【nvidia-smi】Failed to initialize NVML: Driver/library version mismatch解决方法-腾讯云开发者社区-腾讯云 (tencent.com) 输入命令查看nvidia驱动的版本号&#xff1a…

python从入门到精通:判断语句

目录 前言 1、布尔类型和比较运算符 2、if语句的基本格式 3、if else语句 4、if elif else语句 5、判断语句的嵌套 6、实战演练 前言 逻辑判断是生活中常见的行为。同样,在程序中,进行逻辑判断也是最为基础的功能。 判断是程序最基础最核心的逻辑…

Hive3:识别内部表、外部表及相互转换

一、识别方法 查看内部表信息 desc formatted stu;查看外部表信息 desc formatted test_ext1;通过Table Type对应的值,我们可以区分外部表和内部表。 二、相互转换 内部表转外部表 alter table stu set tblproperties(EXTERNALTRUE);外部表转内部表 alter ta…

应急响应-主机安全之系统及进程排查相关命令(Linux操作系统-初级篇)

目录 概述lscpu-显示有关CPU架构的信息uname-查看系统信息lsmod-输出加载的所有模块lastb-输出最后登录失败的用户last-展示用户最近登录信息lastlog-展示所有用户最后的登录时间systemctl-系统服务,开机自启排查crontab-计划任务选项 history-查看历史命令选项常用…

正向代理 vs 反向代理:有什么区别?

在本文中,我们将讨论: 什么是常规代理(正向代理)?什么是反向代理?我应该为我的业务选择哪种代理?使用正向和反向代理的案例完成任务的代理替代方案 什么是常规代理(正向代理&#…

【Electron】npm安装Electron项目失败报错问题和解决办法

前言 闲来无事,便想着研究一下Electron,没想到安装直接就卡住了 问题 npm ERR! RequestError: Hostname/IP does not match certificates altnames: Host: npm.taobao.org. is not in the certs altnames: DNS:*.tbcdn.cn, DNS:*.taobao.com, DNS:*.al…

haproxy是什么?以及haproxy基础实验

目录 一、什么是负载均衡? 二、为什么要用haproxy? 三、haproxy的基本部署实验: 3.1 基本配置实验 环境准备: 详细步骤: 3.2 haproxy-多进程与多线程实验: 多进程: 多线程:…

【开源 Mac 工具推荐之 4】Awesome-macOS:全能的宝藏工具库

简介 Awesome-macOS 是一个开源项目,属于 GitHub 的热门项目“Awesome”的体系,旨在为 macOS 用户提供一个集合了各种优秀的 macOS 应用程序、插件、脚本和工具的精选列表。该项目由开源社区共同维护,通过不断收集和整理优秀的macOS资源&…

LeetCode - 209 - 长度最小的子数组

力扣209题 题目描述:长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度**。**如果不存在符合条件的子数组&…

IO网络编程

思维导图 作业一&#xff1a;使用wasd控制机械臂 #include<myhead.h> #include <termios.h> #define SER_PORT 8888 //与服务器保持一致 #define SER_IP "192.168.0.103" //服务器ip地址 #define CLI_PORT 6666 //客户端…

【C++ 项目】负载均衡在线 OJ

文章目录 &#x1f308; 一、项目介绍&#x1f308; 二、项目源码&#x1f308; 三、项目演示⭐ 1. 前端界面展示⭐ 2. 后端界面展示 &#x1f308; 四、项目准备⭐ 1. 项目所用技术⭐ 2. 项目开发环境⭐ 3. 项目宏观结构 &#x1f308; 五、comm 公共模块⭐ 1. util.hpp 工具⭐…

【Android】安卓四大组件之Service用法

文章目录 使用Handler更新UIService基本特点启动方式非绑定式服务使用步骤 绑定式服务步骤 生命周期非绑定式启动阶段结束阶段 绑定式启动阶段结束阶段 前台Service使用步骤结束结束Service本身降级为普通Service降级为普通Service 使用Handler更新UI 主线程创建Handler对象&a…

房产中介小程序

本文来自&#xff1a;ThinkPHPFastAdmin房产中介小程序 - 源码1688 应用介绍 产中介小程序是一款基于ThinkPHPFastAdmin开发的原生微信小程序&#xff0c;为房地产中介提供房源管理、发布、报备客户、跟踪客户以及营销推广获客等服务的系统。 前端演示&#xff1a; 后台演示&am…

冷数据归档(历史库),成本与性能如何兼得?| OceanBase应用实践

随着数据量的迅猛增长&#xff0c;企业和组织在数据库管理方面遭遇的挑战愈发凸显。数据库性能逐渐下滑、存储成本节节攀升&#xff0c;以及数据运维复杂性的增加&#xff0c;这些挑战使得DBA和开发者在数据管理上面临更大的压力。 为了应对这些挑战&#xff0c;对数据生命周期…

奇异值分解(SVD)

1 奇异值分解(SVD)简介 Beltrami 和 Jordan 被认为是奇异值分解&#xff08;Singular Value Decomposition&#xff0c;SVD&#xff09;的共同开创者&#xff0c;二人于19世纪70年代相继提出了相关理论。奇异值分解主要解决的问题是数据降维。在高维度的数据中&#xff0c;数据…