网站首页 > 技术文章 正文
演讲、比赛,限时五分钟,一到时间,PPT 便会自动关闭。然而,在开始之前,您是否仍为四处下载 PPT 悬浮计时小工具而烦忧?抑或下载下来的不仅需要安装,还得收费?大家好,我是诸位所熟知的浪仔,一位 Python 爱好者。今日,就让我引领大家凭借 Python 开发一款属于自己的 PPT 倒计时小工具,使您切实达成随心所欲之境!
1.开发环境
- Python 3.10
- Pycharm 2024专业版
2.导入库
import tkinter as mytk
from tkinter.ttk import *
from tkinter import simpledialog
import win32com.client as win32 # pip install pywin32
import tkinter.messagebox as messagebox
设计要求
- 界面要求
- 设置透明度
- 设置窗口大小,并保证窗口大小不能更改
- 显示时间控件
- 功能要求
- 悬浮在屏幕的右上角,但是可以随意拖动,改变位置
- 单击左键,可以更改时间长度
- 双击窗口,可以退出界面
- PPT放映时,倒计时自动开始,并一直处于最前端窗口显示
4.界面设计
class Clock(mytk.Tk):
def __init__(self):
super().__init__()
self.geometry(f"280x80+{int(self.winfo_screenwidth()-280)}+10")
self.attributes("-alpha", 0.8)
self.resizable(width=False, height=False)
self.attributes("-topmost", True)
self.overrideredirect(True)
self.configure(background='red')
# self.title("演练倒计时")
self.time_text = mytk.StringVar()
self.minute = "5"
self.get_minute = '5'
self.flag = False
self.ppt =win32.gencache.EnsureDispatch('PowerPoint.Application')
self.init_widgets()
# 移动窗口
self.bind('<ButtonPress-1>', self.start_move)
self.bind('<B1-Motion>', self.on_motion)
def init_widgets(self):
self.style01 = Style()
self.style01.configure("input.TLabel", font=("微软雅黑", 16, "bold"))
self.style01.configure("TLabel", font=("微软雅黑", 16, "bold"), foreground="navy")
self.style01.configure("TButton", font=("微软雅黑", 16, "bold"), background="lightblue")
self.lbl = mytk.Label(self, textvariable=self.time_text, font=('微软雅黑', 60), fg='blue')
self.lbl.pack()
# self.lbl.bind('<Button-3>', self.set_minutes)
# 移动窗口
def start_move(self, event):
self.x = event.x
self.y = event.y
def on_motion(self, event):
self.geometry('+{0}+{1}'.format(event.x_root - self.x, event.y_root - self.y))
if __name__ == '__main__':
app = Clock()
app.mainloop()
5.检测PPT是否开始播放
def check_ppt_start(self):
if ":" in self.minute:
seconds = int(self.minute.split(":")[0].replace("-","")) * 60 + int(self.minute.split(":")[1].replace("-",""))
else:
seconds = int(self.minute.replace("-","")) * 60
if "-" in self.minute:
seconds = -seconds
else:
seconds = seconds
if seconds > 0:
if self.is_ppt_playing(self.ppt) == 1:
# 假设我们有一个时间对象,转化为秒
if ":" in self.minute:
seconds = int(self.minute.split(":")[0])*60 + int(self.minute.split(":")[1])
else:
seconds = int(self.minute)*60
# 执行-1操作
seconds -= 1
# 将秒转换为分
minute, second = divmod(seconds, 60)
# 开始倒计时
self.time_text.set('{:02d}:{:02d}'.format(minute, second))
self.minute = self.time_text.get()
elif self.is_ppt_playing(self.ppt) == 2:
self.minute = str(self.get_minute)
# 假设我们有一个时间对象,转化为秒
if ":" in self.minute:
seconds = int(self.minute.split(":")[0]) * 60 + int(self.minute.split(":")[1])
else:
seconds = int(self.minute) * 60
# 将秒转换为分
minute, second = divmod(seconds, 60)
# 开始倒计时
self.time_text.set('{:02d}:{:02d}'.format(minute, second))
self.minute = self.time_text.get()
else:
self.minute = str(self.get_minute)
minute, second = divmod(int(self.minute) * 60, 60)
self.time_text.set('{:02d}:{:02d}'.format(minute, second))
else:
if self.is_ppt_playing(self.ppt) == 1:
self.lbl.configure(foreground='red')
# 假设我们有一个时间对象,转化为秒
if ":" in self.minute:
seconds = int(self.minute.split(":")[0].replace("-", "")) * 60 + int(self.minute.split(":")[1].replace("-", ""))
else:
seconds = int(self.minute) * 60
# 执行-1操作
seconds += 1
# 将秒转换为分
minute, second = divmod(seconds, 60)
# 开始倒计时
self.time_text.set('-{:02d}:-{:01d}'.format(minute, second))
self.minute = self.time_text.get()
elif self.is_ppt_playing(self.ppt) == 2:
self.lbl.configure(foreground='blue')
self.minute = str(self.get_minute)
# 假设我们有一个时间对象,转化为秒
if ":" in self.minute:
seconds = int(self.minute.split(":")[0].replace("-", "")) * 60 + int(self.minute.split(":")[1].replace("-", ""))
else:
seconds = int(self.minute) * 60
# 将秒转换为分
minute, second = divmod(seconds, 60)
# 开始倒计时
self.time_text.set('{:02d}:{:02d}'.format(minute, second))
self.minute = self.time_text.get()
else:
self.lbl.configure(foreground='blue')
self.minute = str(self.get_minute)
minute, second = divmod(int(self.minute) * 60, 60)
self.time_text.set('{:02d}:{:02d}'.format(minute, second))
# self.stop_ppt_show()
self.goto_last_slide()
self.after(1000, self.check_ppt_start)
在此处,需每隔 1 米便对 PPT 播放状态予以检查一次,借助另外一个函数“is_ppt_playing”记录是否存在 PPT 正在播放,其能够返回 1、2、3 这三个状态。一旦侦测到时间用尽,便利用“stop_ppt_show”函数终止 PPT 放映,然而计时所采用的是超时(负数)计时方式。
# 正在放映PPT
def is_ppt_playing(self,ppt_app):
try:
# 检查是否有幻灯片放映窗口
if ppt_app.SlideShowWindows.Count > 0:
return 1
else:
return 2
except Exception as e:
print(f"发生错误: {e}")
return 3
# 停止放映PPT
def stop_ppt_show(self):
try:
if self.ppt.SlideShowWindows.Count > 0:
self.ppt.SlideShowWindows(1).View.Exit()
except Exception as e:
pass
停止 PPT 播放的方式众多,于此直接使 PPT 播放跳转至最后一页。其相关代码如下:
# 跳转到最后一页
def goto_last_slide(self):
try:
if self.ppt.SlideShowWindows.Count > 0:
slide_show_window = self.ppt.SlideShowWindows(1)
slide_show_view = slide_show_window.View
presentation = slide_show_view.Slide.Parent # 获取包含当前幻灯片的 Presentation 对象
total_slides = presentation.Slides.Count
slide_show_view.GotoSlide(total_slides)
# 接着放映下一页
slide_show_view.Next()
slide_show_view.Next()
except Exception as e:
pass
6.打包成exe文件
由 PyCharm 转至终端,通过“cd”操作抵达文件所在的目录,继而直接输入命令:
pyinstaller Yalang_PP播放倒计时.py --onefile --noconsole --icon img.ico --name "Yalang_PP播放倒计时"
7.最终效果
猜你喜欢
- 2025-05-10 用Python写了一个上课点名系统(附源码)(自制考勤系统)
- 2025-05-10 第12天 | 12天搞定Python,word和pdf
- 2025-05-10 别人都教你DeepSeek做PPT ,我来个狠的,教你用它一键生成软件!
- 2025-05-10 一周学会用python操作excel、word、pdf吗!这篇教会你!拿走不谢
- 2025-05-10 2021年最全Python资料合集(视频+课件+源码资料)
- 2025-05-10 DeepSeek教你怎么制作PPT(怎么利用deepseek制作ppt)
- 2025-05-10 DeepSeek + Kimi 一键生成 PPT(deepseek + kimi = 一键生成ppt)
- 2025-05-10 太牛了!102个Python实战项目被我扒到了!建议收藏!
- 2025-05-10 绝了!一键用AI生成高颜值动态PPT(附详细步骤+Prompt)
- 2025-05-10 PPT制作不再头疼:掌握Python,让你一劳永逸!
- 258℃Python短文,Python中的嵌套条件语句(六)
- 258℃python笔记:for循环嵌套。end=""的作用,图形打印
- 257℃PythonNet:实现Python与.Net代码相互调用!
- 252℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 252℃Python实现字符串小写转大写并写入文件
- 108℃原来2025是完美的平方年,一起探索六种平方的算吧
- 91℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 83℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)