学生习惯计时器(第一次发布)

从前参加过比赛的作品,和大家分享

使用说明:

  1. 显示运行窗口(图1)

 

  1. 当前时间为北京时间。
  2. 倒计时功能:
  1. 首先按下“设置”键,出现设置界面(图2),进行倒计时设置。可单独设置分钟数、秒数。点击确定倒计时时间显示在界面上(图3)。

       

 

  1. 时间设置完成后点击“开始”运行软件。
  2. 点击“暂停”按钮倒计时暂停,暂停按键变换为“继续”按钮,当按下“继续”按钮倒计时继续。

 

 

  1. 点击“结束”按钮,倒计时结束。
  2. 倒计时时间归零则会发出声音进行提示。
  1. 喝水和久坐提醒。

点击“ON”,会开始按照提前设置好的时间进行计时提醒,会出现温馨提示标签。点击“OFF”会关闭。

 

程序介绍:

1.使用python的time模块、winsound模块、tkinter模块。

2.窗口显示。使用tkinter模块,对窗口的大小、显示颜色、透明度等进行设置。

3.读取系统时间

 

4.可设置倒计时,久坐提醒、喝水提醒。

有开始、暂停、继续、结束、设置按键

 

6.声音提示

代码

# -------------------------------------------------
# 项目名称:学生作息计时器      作者 wangqiuding(qiu等xiao)
#  ------------------------------------------------
import time
import tkinter as tk
from tkinter import messagebox
import winsound
# 系统时间显示
class TimeSys:
    def __init__(self):
        self.root = tk.Tk()
        # 获取屏幕分辨率
        self.screenWidth = self.root.winfo_screenwidth()
        self.screenHeight = self.root.winfo_screenheight()
        ''' 计算显示坐标'''
        self.x = int((self.screenWidth - 300) / 2)
        self.y = int((self.screenHeight - 150) / 2)
        '''#系统时间变量'''
        self.systimecound = tk.StringVar()
        '''# 倒计时时间变量'''
        self.downtimecound = tk.StringVar()
        '''#按键标志变量初始'''
        '''#开始/暂停按键编制'''
        self.pause = False

        self.set_time_end_sign = False
        self.set_time_start_sign = False
        '''#暂停的时间'''
        self.long = 0
        self.hold = True
        self.delta = 0
        self.zanTing = 0
        self.jiXu = 0
        self.timeSitOld = 0
        self.select_SIT_sign = True
        self.select_WATER_sign = True

    ''' 系统时间窗口设置'''

    def sys_time_display(self):
        # 设置窗口title
        self.root.title('学生习惯计时器')
        # 设置窗口大小:宽x高,注,此处不能为 "*",必须使用 "x"
        self.root.geometry("%sx%s+%s+%s" % (300, 150, self.x, self.y))
        # 改变背景颜色
        self.root.config(background="#f0ffff")
        # 设置窗口处于顶层
        self.root.attributes('-topmost', True)
        # 设置窗口的透明度
        self.root.attributes('-alpha', 0.85)
        # 设置窗口被允许最大调整的范围,与resizble()冲突
        self.root.maxsize(600, 600)
        # 设置窗口被允许最小调整的范围,与resizble()冲突
        self.root.minsize(50, 50)
        # 设置窗口为:不可以随意更改大小
        # self.root.resizable(0, 0)
        # 显示的标签
        self.show()
        # 进入主循环,显示主窗口
        self.root.mainloop()

    '''#界面显示内容'''

    def show(self):
        # 显示的标签
        self.Display_lable()
        # 按键设置
        self.anjian()
        # 获取系统显示时间
        self.getTime()  # 获取系统时间

    '''#显示的标签'''

    def Display_lable(self):
        # 设置显示时间的属性
        self.label_time = tk.Label(self.root, textvariable=self.systimecound, font=('kaiti', 40), fg='#000000', padx=5,
                                   pady=5,
                                   relief="sunken")
        self.label_time.place(x=5, y=5, width=230, height=60)

        # 设置倒计时标签
        self.label_daojishi = tk.Label(self.root, text='倒 \n计:\n时 ', font=('kaiti', 15), bg='#f0ffff')
        self.label_daojishi.place(x=7, y=70, width=25, height=65)
        # 设置倒计时单位标签
        #self.label_fen = tk.Label(self.root, text='分\n钟', font=('kaiti', 15), bg='#f0ffff')
        #self.label_fen.place(x=210, y=65, width=20, height=65)
        # 设置倒计时初始值标签
        self.label_countDown = tk.Label(self.root, text='00分00秒', font=('kaiti', 30), fg='red', bg='#f0ffff')
        self.label_countDown.place(x=30, y=70, width=200, height=50)

        # 久坐提醒
        self.label_longSit = tk.Label(self.root, text='久坐\n提醒', font=('kaiti', 10), fg='black', bg='#f0ffff')
        self.label_longSit.place(x=235, y=10, width=65, height=30)
        # 喝水提醒
        self.label_water = tk.Label(self.root, text='喝水\n提醒', font=('kaiti', 10), fg='black', bg='#f0ffff')
        self.label_water.place(x=235, y=80, width=65, height=30)
        # 计划安排

    # 按键设置
    def anjian(self):
        # 开始键
        self.button_start = tk.Button(self.root, text='开始', command=self.start_time)
        self.button_start.place(x=45, y=125, width=35, height=25)
        # 暂停/继续键
        self.button_pause = tk.Button(self.root, text='暂停', command=self.pause_time)
        self.button_pause.place(x=90, y=125, width=35, height=25)
        # 结束键
        self.button_end = tk.Button(self.root, text='结束', command=self.end_time)
        self.button_end.place(x=135, y=125, width=35, height=25)
        # 设置键
        self.button_set = tk.Button(self.root, text='设置', command=self.set_time)
        self.button_set.place(x=180, y=125, width=35, height=25)
        # 单选按钮
        self.select_SIT()
        self.select_Water()

    '''#单选框'''

    def select_SIT(self):
        # IntVar() 用于处理整数类型的变量
        self.selectROOT = tk.IntVar()
        # 根据单选按钮的 value 值来选择相应的选项
        self.selectROOT.set(0)
        # 使用 variable 参数来关联 IntVar() 的变量 v
        tk.Radiobutton(self.root, text="OFF", fg='black', font=('微软雅黑', '7', 'bold'),
                       variable=self.selectROOT, value=0, command=self.select_SIT_False, indicatoron=False).place(x=250,
                                                                                                                  y=45,
                                                                                                                  width=40,
                                                                                                                  height=15)

        tk.Radiobutton(self.root, text="ON", fg='black', font=('微软雅黑', '7', 'bold'),
                       variable=self.selectROOT, value=1, command=self.select_SIT_True, indicatoron=False).place(x=250,
                                                                                                                 y=60,
                                                                                                                 width=40,
                                                                                                                 height=15)

    def select_Water(self):
        # IntVar() 用于处理整数类型的变量
        self.selectWaterROOT = tk.IntVar()
        # 根据单选按钮的 value 值来选择相应的选项
        self.selectWaterROOT.set(0)
        # 使用 variable 参数来关联 IntVar() 的变量 v
        tk.Radiobutton(self.root, text="OFF", fg='black', font=('微软雅黑', '7', 'bold'),
                       variable=self.selectWaterROOT, value=0, command=self.select_Water_False,
                       indicatoron=False).place(x=250, y=115, width=40, height=15)
        tk.Radiobutton(self.root, text="ON", fg='black', font=('微软雅黑', '7', 'bold'),
                       variable=self.selectWaterROOT, value=1, command=self.select_Water_True, indicatoron=False).place(
            x=250, y=130, width=40, height=15)

    def select_SIT_True(self):
        self.timeSitOld = 0
        self.select_SIT_sign = True
        self.run_sit()

    def select_SIT_False(self):
        self.timeSitOld = 0
        self.select_SIT_sign = False

    def run_sit(self):
        if self.select_SIT_sign:

            self.timeSitOld += 1
            print(self.timeSitOld)
            if self.timeSitOld == 5:
                self.Top_Show_sit()
                self.timeSitOld = 0

            self.label_countDown.after(1000, self.run_sit)

    def Top_Show_sit(self):
        self.top_sit = tk.Toplevel()
        self.top_sit.title("温馨提示")
        ''' 设置窗口大小:宽x高,注,此处不能为 *,必须使用 x '''
        self.top_sit.geometry("%sx%s+%s+%s" % (200, 130, self.x, self.y))
        ''' # 设置窗口处于顶层'''
        self.top_sit.attributes('-topmost', True)
        '''# 插入分钟数'''
        tk.Label(self.top_sit, text='适当的运动可以提高学习效率!!!').place(x=10, y=10)
        tishshong().piayshong()
    def select_Water_True(self):
        self.timeWaterOld = 0
        self.select_Water_sign = True
        self.run_Water()

    def select_Water_False(self):
        self.timeWaterOld = 0
        self.select_Water_sign = False

    def run_Water(self):
        if self.select_Water_sign:

            self.timeWaterOld += 1
            print(self.timeWaterOld)
            if self.timeWaterOld == 5:
                self.Top_Show_Water()
                self.timeWaterOld = 0
        self.label_countDown.after(1000, self.run_Water)

    def Top_Show_Water(self):
        self.top_Water = tk.Toplevel()
        self.top_Water.title("温馨提示")
        ''' 设置窗口大小:宽x高,注,此处不能为 *,必须使用 x '''
        self.top_Water.geometry("%sx%s+%s+%s" % (200, 130, self.x, self.y))
        ''' # 设置窗口处于顶层'''
        self.top_Water.attributes('-topmost', True)
        '''# 插入分钟数'''
        tk.Label(self.top_Water, text='多喝水有,利于健康').place(x=10, y=10)
        tishshong().piayshong()
    '''#获取时间'''

    def getTime(self):
        # 获取当前时间
        self.systimecound.set(time.strftime("%H:%M:%S"))
        # 每隔 1s 调用一次 gettime()函数来获取时间
        self.root.after(1000, self.getTime)

    '''#开始按键功能'''

    def start_time(self):
        if self.pause:
            self.pause = False
            self.set_time_start_sign = True
            # 读取开始的时间
            self.oldtime = time.time()
            # 倒计时开始
            self.run_time()

    def gettime(self):
        # 换算成秒数
        try:
            min = self.set_min.get()
            min = int(min)
        except:
            min = 0
        try:
            sec = self.set_mes.get()
            sec = int(sec)
        except:
            sec = 0

        self.tmCountShow = 60 * min + sec

        return self.tmCountShow

    def run_time(self):
        if self.set_time_start_sign:
            self.tmCountShow = self.gettime()
            if self.zanTing and self.jiXu:
                self.long = self.jiXu - self.zanTing + self.long
                self.zanTing = self.jiXu = 0
            elif self.zanTing and not self.jiXu:
                self.delta = self.zanTing - self.oldtime - self.long
            else:
                self.delta = time.time() - self.oldtime - self.long
            self.delta1 = int(self.tmCountShow) - int(self.delta)
            if self.delta1 > 0:
                deltaster = '{:.0f}分{:.0f}'.format(*divmod(self.delta1, 60))+'秒'
            else:
                deltaster = '00分00秒'
                tishshong().piayshong()
                tk.messagebox.showinfo('提示!', '时间到')
                self.end_time()
            self.downtimecound.set(deltaster)
            self.label_countDown.config(textvariable=self.downtimecound)
            self.label_countDown.after(1, self.run_time)

    '''#暂停/继续按键功能'''

    def pause_time(self):
        if not self.pause and self.set_time_end_sign:
            if self.hold:
                self.hold = False
                self.button_pause.config(text='继续')
                self.zanTing = time.time()
            else:
                self.jiXu = time.time()
                self.hold = True
                self.button_pause.config(text='暂停')

    '''#结束键按键功能'''

    def end_time(self):
        self.pause = False
        self.set_time_end_sign = False
        self.set_time_start_sign = False
        # 暂停的时间
        self.long = 0
        self.hold = True
        self.delta = 0
        self.zanTing = 0
        self.jiXu = 0
        self.set_min = ''
        self.set_mes = ''
        self.downtimecound.set('00分00秒')
        # 倒计时显示样式
        self.label_countDown.config(textvariable=self.downtimecound)

    '''#设置键按键功能'''

    def set_time(self):
        self.Top_Show()

    def Top_Show(self):
        self.top_level = tk.Toplevel()
        self.top_level.title("设置")
        # 设置窗口大小:宽x高,注,此处不能为 "*",必须使用 "x"
        self.top_level.geometry("%sx%s+%s+%s" % (200, 130, self.x, self.y))
        # 设置窗口处于顶层
        self.top_level.attributes('-topmost', True)
        # 插入分钟数
        tk.Label(self.top_level, text='分钟:').place(x=10, y=10)
        self.set_min = tk.StringVar()
        '''# 填写时间'''
        self.set_min_time = tk.Entry(self.top_level, textvariable=self.set_min)
        self.set_min_time.place(x=50, y=10)
        # 插入默认文本
        self.set_min_time.insert(0, 0)
        # 插入秒数
        tk.Label(self.top_level, text='秒数:').place(x=10, y=50)
        self.set_mes = tk.StringVar()
        # 填写时间
        self.set_mes_time = tk.Entry(self.top_level, textvariable=self.set_mes)
        self.set_mes_time.place(x=50, y=50)
        # 插入默认文本
        self.set_mes_time.insert(0, 0)
        # 确定键
        tk.Button(self.top_level, text="确定", command=self.set_time_end).place(x=70, y=90)

    '''#倒计时设置程序'''

    def set_time_end(self):
        '''# 读取倒计时数值'''
        self.downtimecound.set(self.set_min.get() + '分' + self.set_mes_time.get()+'秒')
        '''# 倒计时显示样式'''
        self.label_countDown.config(textvariable=self.downtimecound)
        self.pause = True
        '''# 设置结束的标志'''
        self.set_time_end_sign = True
        '''#关闭弹窗'''
        self.top_level.destroy()
class tishshong:
    def piayshong(self):
        duration = 1000
        freq = 440
        winsound.Beep(freq, duration)


'''#运行'''
if __name__ == '__main__':
    TimeSys().sys_time_display()

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值