吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1841|回复: 60
收起左侧

[Python 原创] 最干净简洁的定时器

[复制链接]
manglang 发表于 2024-12-16 19:22
定时器就是定时器,搞那么多花活干什么。下载了好多定时器程序,总觉得不合乎自己的要求,终于忍不住开发了一个堪称最简洁最干净的定时器:
2024-12-16_191437.png

以下是代码:
[Python] 纯文本查看 复制代码
import time
import tkinter as tk
import os
import pygame
from tkinter import font
# 获取脚本所在的目录
script_dir = os.path.dirname(os.path.abspath(__file__))
# 将工作目录切换到脚本所在目录
os.chdir(script_dir)
# 初始化pygame声音模块
pygame.mixer.init()
# 定义音频文件路径
audio_file = script_dir+'\\voice0.wav'

class TimerApp:
    def __init__(self, root):
        self.root = root
        self.root.title("任老师专用定时器")
        self.root.geometry("160x500+650+200")
        self.root.resizable(False, False)
        self.root.attributes('-toolwindow', True)
        self.minutes = [1, 5, 10, 15, 20, 25, 30,45, 60]
        self.buttons = []
        
        for minute in self.minutes:
            button = tk.Button(self.root, text=f" {minute:02} 分钟 ", command=lambda m=minute: self.start_timer(m),font = font.Font(family="微软雅黑", size=18))
            button.pack()
            self.buttons.append(button)
        
    def start_timer(self, minutes):
        seconds = minutes * 60
        time.sleep(seconds)
        pygame.mixer.music.load(audio_file)
        pygame.mixer.music.play()

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

免费评分

参与人数 4吾爱币 +4 热心值 +3 收起 理由
king1F + 1 我很赞同!
jh95wxg + 2 + 1 谢谢@Thanks!
q2212282 + 1 用心讨论,共获提升!
流浪的袋子 + 1 + 1 要是有成品就更好了加分

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

1002217709 发表于 2024-12-16 21:31
用那么复杂吗,大喊一声小爱同学,XX分钟后叫我,马上就定好了……
Boldan007 发表于 2024-12-17 05:14
wolaikaoyan 发表于 2024-12-16 22:23
using System;
using System.Drawing;
using System.Threading;

[C#] 纯文本查看 复制代码
using System;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;

namespace TimerApp
{
    public class TimerApp : Form
    {
        private readonly int[] minutes = { 1, 5, 10, 15, 20, 25, 30, 45, 60,90,120 };
        private Label countdownLabel; // 用于显示剩余时间
        private Button activeButton; // 当前正在计时的按钮

        public TimerApp()
        {
            this.Text = "老师专用定时器";
            this.Size = new Size(200, 700);
            this.StartPosition = FormStartPosition.Manual;
            this.Location = new Point(650, 200);
            this.FormBorderStyle = FormBorderStyle.FixedToolWindow;

            // 创建主布局面板
            var mainPanel = new TableLayoutPanel
            {
                Dock = DockStyle.Fill,
                RowCount = 2,
                ColumnCount = 1,
            };
            mainPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, 40)); // 倒计时标签高度
            mainPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 100)); // 按钮面板占用剩余空间
            this.Controls.Add(mainPanel);

            // 创建顶部倒计时标签
            countdownLabel = new Label
            {
                Text = "倒计时:",
                Font = new Font("微软雅黑", 12),
                TextAlign = ContentAlignment.MiddleCenter,
                Dock = DockStyle.Fill
            };
            mainPanel.Controls.Add(countdownLabel, 0, 0);

            // 创建按钮面板
            FlowLayoutPanel buttonPanel = new FlowLayoutPanel
            {
                Dock = DockStyle.Fill,
                FlowDirection = FlowDirection.TopDown,
                WrapContents = false,
                AutoScroll = true
            };
            mainPanel.Controls.Add(buttonPanel, 0, 1);

            foreach (int minute in minutes)
            {
                Button button = new Button
                {
                    Text = $"{minute:00} 分钟",
                    Font = new Font("微软雅黑", 12),
                    Size = new Size(120, 50),
                    Tag = minute
                };
                button.Click += (sender, e) => StartTimer((Button)sender, minute);
                buttonPanel.Controls.Add(button);
            }
        }

        private void StartTimer(Button button, int minutes)
        {
            if (activeButton != null)
            {
                // 如果有计时器正在运行,提示用户
                MessageBox.Show("已有计时器在运行,请等待完成后再启动新的计时器。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            // 设置当前活动按钮
            activeButton = button;
            button.BackColor = Color.LightBlue;

            int totalSeconds = minutes * 60;
            new Thread(() =>
            {
                while (totalSeconds > 0)
                {
                    // 更新倒计时标签
                    this.Invoke(new Action(() =>
                    {
                        countdownLabel.Text = $"倒计时:{totalSeconds / 60:00}:{totalSeconds % 60:00}";
                    }));
                    Thread.Sleep(1000);
                    totalSeconds--;
                }

                // 计时结束
                this.Invoke(new Action(() =>
                {
                    countdownLabel.Text = "倒计时:完成!";
                    MessageBox.Show($"{minutes}分钟已到!", "计时完成", MessageBoxButtons.OK, MessageBoxIcon.Information);

                    // 恢复按钮状态
                    button.BackColor = SystemColors.Control;
                    activeButton = null;
                }));
            }).Start();
        }

        [STAThread]
        public static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new TimerApp());
        }
    }
}
沧海轻舟 发表于 2024-12-16 21:14
qi1990 发表于 2024-12-16 21:22
谢谢分享
zlqhysy 发表于 2024-12-16 21:23
缺少个自定义选项
yinshi456 发表于 2024-12-16 21:29
昨天找半天,今天刚好看到,太及时了
逐雅斋 发表于 2024-12-16 21:41
这个不错!
wolaikaoyan 发表于 2024-12-16 22:23
using System;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;

namespace TimerApp
{
    public class TimerApp : Form
    {
        private readonly int[] minutes = { 1, 5, 10, 15, 20, 25, 30, 45, 60,90,120 };
        private Label countdownLabel; // 用于显示剩余时间
        private Button activeButton; // 当前正在计时的按钮

        public TimerApp()
        {
            this.Text = "老师专用定时器";
            this.Size = new Size(200, 700);
            this.StartPosition = FormStartPosition.Manual;
            this.Location = new Point(650, 200);
            this.FormBorderStyle = FormBorderStyle.FixedToolWindow;

            // 创建主布局面板
            var mainPanel = new TableLayoutPanel
            {
                Dock = DockStyle.Fill,
                RowCount = 2,
                ColumnCount = 1,
            };
            mainPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, 40)); // 倒计时标签高度
            mainPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 100)); // 按钮面板占用剩余空间
            this.Controls.Add(mainPanel);

            // 创建顶部倒计时标签
            countdownLabel = new Label
            {
                Text = "倒计时:",
                Font = new Font("微软雅黑", 12),
                TextAlign = ContentAlignment.MiddleCenter,
                Dock = DockStyle.Fill
            };
            mainPanel.Controls.Add(countdownLabel, 0, 0);

            // 创建按钮面板
            FlowLayoutPanel buttonPanel = new FlowLayoutPanel
            {
                Dock = DockStyle.Fill,
                FlowDirection = FlowDirection.TopDown,
                WrapContents = false,
                AutoScroll = true
            };
            mainPanel.Controls.Add(buttonPanel, 0, 1);

            foreach (int minute in minutes)
            {
                Button button = new Button
                {
                    Text = $"{minute:00} 分钟",
                    Font = new Font("微软雅黑", 12),
                    Size = new Size(120, 50),
                    Tag = minute
                };
                button.Click += (sender, e) => StartTimer((Button)sender, minute);
                buttonPanel.Controls.Add(button);
            }
        }

        private void StartTimer(Button button, int minutes)
        {
            if (activeButton != null)
            {
                // 如果有计时器正在运行,提示用户
                MessageBox.Show("已有计时器在运行,请等待完成后再启动新的计时器。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            // 设置当前活动按钮
            activeButton = button;
            button.BackColor = Color.LightBlue;

            int totalSeconds = minutes * 60;
            new Thread(() =>
            {
                while (totalSeconds > 0)
                {
                    // 更新倒计时标签
                    this.Invoke(new Action(() =>
                    {
                        countdownLabel.Text = $"倒计时:{totalSeconds / 60:00}:{totalSeconds % 60:00}";
                    }));
                    Thread.Sleep(1000);
                    totalSeconds--;
                }

                // 计时结束
                this.Invoke(new Action(() =>
                {
                    countdownLabel.Text = "倒计时:完成!";
                    MessageBox.Show($"{minutes}分钟已到!", "计时完成", MessageBoxButtons.OK, MessageBoxIcon.Information);

                    // 恢复按钮状态
                    button.BackColor = SystemColors.Control;
                    activeButton = null;
                }));
            }).Start();
        }

        [STAThread]
        public static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new TimerApp());
        }
    }
}

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
love66550 + 1 + 1 拿了,试试看

查看全部评分

userxiamenger1 发表于 2024-12-16 22:56
我看图片感觉这个界面好长
头像被屏蔽
pomxion 发表于 2024-12-16 23:41
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-7 19:47

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表