自己编写的PPT悬浮倒计时小工具,python带你玩嗨起来

boyanx8个月前技术教程21

演讲、比赛,限时五分钟,一到时间,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.最终效果


标签: 倒计时代码

相关文章

Python进阶-Day 10 :时间与日期处理

一、学习目标掌握 Python 中 datetime 和 time 模块的基本用法。理解时间戳、日期格式化和时间计算的相关概念。能够编写一个简单的倒计时程序,应用所学知识。二、学习内容与时间安排上午(...

《逆风奔北》黎明代码

探视室的铁门在身后重重闭合,林向宇的指尖还残留着沉香木的余温。三个月来他用食堂铝勺雕刻的十二颗木珠,此刻正在囚服口袋里相互碰撞,发出细碎的声响。走廊顶灯每隔五米就有一盏接触不良,明暗交替的光影中,他看...

公司电脑自动群发裸聊:代码溯源到已故程序员38

公司电脑群发裸聊视频那事是我捅出来的。早上九点刚摸进技术部办公室,键盘声噼里啪啦响得跟放鞭炮似的。王胖子突然嗷一嗓子,说全集团电脑都在自动往外发黄色视频。我冲过去扒拉他电脑,后台代码里明晃晃挂着...

【京张追光者:程序员爸爸的400公里温情代码】

凌晨6:00,张家口某小区车库亮起一道蓝光,93年程序员李航的智能手表自动开启「生存模式」——这是他在京张通勤路上迭代的第7版自研算法,正根据实时降雪预报、儿子足球赛倒计时、妻子体检报告三项数据,调整...

周五牛马の极限倒计时 | 用魔法把24小时揉成1分钟!

早晨9:05 の 咖啡因蹦迪 冰美式混跳跳糖 → 舌尖蹦迪唤醒灵魂(咖啡渍占卜:若出现「笑脸」= 今日摸鱼成功率99%)逃亡神器: 「防老板雷达表」 → 表盘变红=领导逼近,秒切严肃脸 「带薪拉屎计...

神秘代码

第五章 递归裂痕陈默的指尖触碰到缓冲凝胶时,水晶球体突然迸发出伽马射线暴。他翻滚着躲进操作台后方,看见自己刚才所在的位置被烧熔出冒着泡的岩浆坑。防护服在辐射中碳化剥落,怀表却在高温中显露出隐藏的晶格结...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。