Python小工具之倒計時GUI提醒

Python小工具之倒計時GUI提醒

你是不是經常擼碼擼到腰痠背痛?頭暈腦脹?忘記時間?
這個時候你就非常需要一個貼心的倒計時小工具來按時提醒你休息了🙂
直接用Python腳本編寫一個GUI進行倒計時提醒,小巧簡單,還比腦白金管用,哈哈~😄

代碼如下:

import time
import datetime
import threading
import tkinter as tk

from tkinter import messagebox

__author__ = 'Evan'


class CountdownTool(object):

    def __init__(self):
        self.root = tk.Tk()
        self.root.title('倒計時小工具')
        self.root.wm_attributes("-topmost", True)  # GUI置頂,置頂後可手動最小化
        self.build_select_button_frame()
        self.build_display_times()
        self.set_window_center(window=self.root, width=347, height=135)
        self.stop_flag = False

    def build_display_times(self):
        frame = tk.Frame(relief='ridge', borderwidth=0)

        self.display_label = tk.Label(frame, text='待運行')
        self.display_label.grid(row=0, column=0, sticky=tk.W, padx=5)

        self.label = tk.Label(frame, text='00:00:00', font=('times', 40, 'bold'), fg='#FF4500')
        self.label.grid(row=0, column=0, sticky=tk.W, padx=70)
        frame.grid(row=1, column=0, sticky=tk.NSEW)

    def build_select_button_frame(self):
        frames = tk.Frame(relief='ridge', borderwidth=5)
        tk.Label(frames, text='請選擇倒計時間: ').grid(row=0, column=0, sticky=tk.W)

        self.var = tk.IntVar()
        tk.Scale(frames, label='Minutes', from_=1, to=90, resolution=1,
                 orient=tk.HORIZONTAL, variable=self.var, showvalue=1).\
            grid(row=0, column=1, sticky=tk.W)
        self.var.set(30)

        self.start_button = tk.Button(frames, text='開始', command=self.progress, bg='LightSkyBlue')
        self.start_button.grid(row=0, column=2, sticky=tk.W, padx=10)
        tk.Button(frames, text='停止', command=self.stop, bg='tomato').grid(row=0, column=3, sticky=tk.W, padx=10)
        frames.grid(row=0, column=0, sticky=tk.NSEW)

    def quit(self):
        self.root.destroy()
        self.root.quit()

    @staticmethod
    def set_window_center(window, width=300, height=300):
        ws = window.winfo_screenwidth()
        hs = window.winfo_screenheight()
        x = (ws / 2) - (width / 2)
        y = (hs / 2) - (height / 2)
        window.geometry('%dx%d+%d+%d' % (width, height, x, y))

    def stop(self):
        self.stop_flag = True

    def progress(self):
        threading.Thread(target=self._progress, args=()).start()

    def _progress(self):
        self.stop_flag = False
        self.start_button.config(text='運行中', state='disable')
        try:
            minute_input = self.var.get()
            self.display_label.config(text='共{}分鐘'.format(minute_input))
            close_time = (datetime.datetime.now() + datetime.timedelta(minutes=minute_input)).strftime('%H:%M:%S')
            close_time = datetime.datetime.strptime(close_time, '%H:%M:%S')
            while True:
                if self.stop_flag:
                    break
                time.sleep(1)
                current_time = datetime.datetime.strptime(datetime.datetime.now().strftime('%H:%M:%S'), '%H:%M:%S')
                gap_time = close_time - current_time
                hours = int(str(gap_time).split(':')[-3])
                minutes = int(str(gap_time).split(':')[-2])
                seconds = int(str(gap_time).split(':')[-1])
                if not hours and not minutes and not seconds:
                    self.label.config(text='{:02d}:{:02d}:{:02d}'.format(hours, minutes, seconds))
                    break
                self.label.config(text='{:02d}:{:02d}:{:02d}'.format(hours, minutes, seconds))
            if not self.stop_flag:
                messagebox.showinfo('Info', '倒計時間已到,請注意休息!')
        finally:
            self.stop_flag = False
            self.label.config(text='00:00:00')
            self.display_label.config(text='待運行')
            self.start_button.config(text='開始', state='active')


if __name__ == '__main__':
    countdown = CountdownTool()
    countdown.root.mainloop()

我這裏設置的時間範圍爲1~90分鐘,程序執行後默認爲30分鐘
可根據需求更改代碼,更改位置如下:
from_=1:最小1分鐘
to=90:最大90分鐘
self.var.set(30):設置默認時間爲30

self.var = tk.IntVar()
tk.Scale(frames, label='Minutes', from_=1, to=90, resolution=1,
         orient=tk.HORIZONTAL, variable=self.var, showvalue=1).\
         grid(row=0, column=1, sticky=tk.W)
self.var.set(30)

執行結果:
1
選擇時間爲60,點擊開始:(如想取消或重新選擇時間,點擊停止即可)
2
運行結束提示框:(如果GUI爲置頂,結束提示框也會置頂顯示)
3
溫馨提示:
Python腳本寫完後用pyinstaller打包成exe執行程序,使用會更香哦~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章