初学python,前一阵子用到倒数计时器,感觉没有分段提示功能,就想自己练练手,网上找了倒数计时器的例程,改了改,做成可以双段计时(一般招聘时,控制总时长,以及个人陈述时长),单段计时。
# coding:utf-8#
from tkinter import *
import turtle, time
import winsound
import math
import tkinter.font as tkFont
global sec_min,minites,entry1, entry2,entry3, entry4, entry5,entry6, alm_1,alm_2
def drawGap(): # 笔画之间间隔
turtle.penup()
turtle.fd(tw_gap)
def drawLine(draw):
drawGap()
turtle.pendown() if draw else turtle.penup()
turtle.fd(line_long) #笔画长度
drawGap()
turtle.right(90)
def drawPoint():
turtle.left(90) # 向上移动100,落笔然后向下长度40
turtle.penup()
turtle.fd(point_move)
turtle.pendown()
turtle.right(180)
turtle.fd(point_long)
turtle.penup()
turtle.fd(point_move) # 抬笔向下移动100,落笔然后向下长度40
turtle.pendown()
turtle.fd(point_long)
turtle.left(90)
drawGap()
def drawDigit(d):
drawLine(True) if d in [2, 3, 4, 5, 6, 8, 9] else drawLine(False) # g
drawLine(True) if d in [0, 1, 3, 4, 5, 6, 7, 8, 9] else drawLine(False) # c
drawLine(True) if d in [0, 2, 3, 5, 6, 8, 9] else drawLine(False) # d
drawLine(True) if d in [0, 2, 6, 8] else drawLine(False) # e
turtle.left(90) # 经历一次右转后,调整左转,方向竖直向上
drawLine(True) if d in [0, 4, 5, 6, 8, 9] else drawLine(False)
drawLine(True) if d in [0, 2, 3, 5, 6, 7, 8, 9] else drawLine(False)
drawLine(True) if d in [0, 1, 2, 3, 4, 7, 8, 9] else drawLine(False)
turtle.left(180)
turtle.penup()
turtle.fd(other_long) # 数字之间距离
def drawDate(date):
#turtle.pencolor('blue')
if '+' in date:
for i in date:
if i == '-':
#turtle.fd(80)
drawPoint()
#turtle.pencolor('green')
turtle.fd(point_long)
turtle.penup()
turtle.left(90)
turtle.fd(other_long)
turtle.right(90)
elif i == '=':
#turtle.fd(80)
drawPoint()
#turtle.pencolor('blue')
turtle.fd(point_long)
turtle.penup()
turtle.left(90)
turtle.fd(other_long)
turtle.right(90)
elif i == '+':
turtle.write('', font=('Arial', 18, 'normal'))
#turtle.pencolor('yellow')
turtle.fd(other_long)
else:
drawDigit(eval(i))
else:
turtle.goto(tw_left,-50)
turtle.write(date, font=('Arial', 240, 'normal')) # 打印超时文字
def init():
turtle.setup(tw_width-8, tw_high,0,0) # 设置画布大小 200 200 为屏幕位置
turtle.bgcolor("black")
turtle.speed(10)
turtle.penup()
turtle.goto(0, 0)
turtle.fd(tw_left) # 画笔起始位置
turtle.pensize(tw_pensize) # 笔画线宽
def main(book_time):
global sec_min, minites, entry1, entry2
#time.sleep(10)
over_flag = False
beep_flag = True
# count = book_time - time.time() + 0 # 画面延时n秒自动关闭
try:
while True:
over_time = book_time - time.time()
# count -= 1
if over_time > 0:
time_string = time.strftime("%M=%S+", time.localtime(over_time))
else:
time_string = 'Time out !!!'
over_flag = True
turtle.clear()
init()
turtle.getscreen().tracer(30, 0)
if over_time>sec_min+alm_1: # 第一段时间,绿色显示
turtle.pencolor('green')
drawDate(time_string) # 格式化时间 2017-05=02+ 控制输入年日月
elif sec_min < over_time < sec_min+alm_1:
turtle.pencolor('red') # 第二段时间,蓝色显示
drawDate(time_string) # 格式化时间 2017-05=02+ 控制输入年日月
elif alm_2 < over_time < sec_min:
turtle.pencolor('blue') # 第二段时间,蓝色显示
drawDate(time_string) # 格式化时间 2017-05=02+ 控制输入年日月
else:
turtle.pencolor('red') # 倒计时一分钟,红色显示
drawDate(time_string) # 格式化时间 2017-05=02+ 控制输入年日月
time.sleep(1)
turtle.hideturtle()
if over_flag and beep_flag:
for i in range(1): # i 控制提示音播放的长短
winsound.Beep(int(1000 * math.sin(i / 6.28) + 700), 100)
beep_flag = False
except:
pass
def main1(book_time):
global minites, entry1, entry2
#time.sleep(10)
over_flag = False
beep_flag = True
# count = book_time - time.time() + 0 # 画面延时n秒自动关闭
try:
while True:
over_time = book_time - time.time()
# count -= 1
if over_time > 0:
time_string = time.strftime("%M=%S+", time.localtime(over_time))
else:
time_string = 'Time out !!'
over_flag = True
turtle.clear()
init()
turtle.getscreen().tracer(30, 0)
if over_time>alm_1: # 第一段时间,绿色显示
turtle.pencolor('green')
drawDate(time_string) # 格式化时间 2017-05=02+ 控制输入年日月
else:
turtle.pencolor('red') # 倒计时一分钟,红色显示
drawDate(time_string) # 格式化时间 2017-05=02+ 控制输入年日月
time.sleep(1)
turtle.hideturtle()
if over_flag and beep_flag:
for i in range(1): # i 控制提示音播放的长短
winsound.Beep(int(1000 * math.sin(i / 6.28) + 700), 100)
beep_flag = False
except:
pass
def aaaaaa():
global sec_min,minites,entry1, entry2,entry3, entry4, entry5,entry6, alm_1,alm_2
minites = int(entry1.get())*60
sec_min =minites - int(entry2.get())*60
if sec_min <0:
alm_box=Tk()
alm_box.title("警告")
alignstr = '%dx%d+%d+%d' % (200, 150, width/2-100, high/2-75)
alm_box.geometry(alignstr)
Label(alm_box, text="双段总时长应\n大于第一段时长",font=('微软雅黑', 20, 'bold'),fg='red').grid(row=0, column = 0)
Label(alm_box, text="!!!!!!", font=('微软雅黑', 20, 'bold'), fg='red').grid(row=1, column=0)
alm_box.mainloop()
alm_2 = int(entry4.get())
alm_1 = int(entry5.get())
book_time = time.time() + minites
main(book_time)
def aaaa():
global sec_min,minites,entry1, entry2, entry3, entry4, entry5,entry6,alm_1,alm_2
minites = int(entry3.get())*60
alm_1 = int(entry6.get())
book_time = time.time() + minites
main1(book_time)
#=============================================================================================================
root = Tk()
root.title("倒计时器")
minites = 3600 * 0.1
width = int(root.winfo_screenwidth())
high = int(root.winfo_screenheight())
tw_width=int(width)
tw_high=int(high*0.9)
tw_x=int(width*0.05)
tw_y=int(high*0.1)
tw_gap=int(width/100*1.5)
tw_pensize=int(width/100*3)
tw_left=int(-width*0.48)
line_long=int(tw_width*0.17)
point_long=int(width*0.02)
point_move=int(width*0.06)
other_long=int(width*0.04)
book_time = time.time() + minites
if width <1000 :
fontsize = 10
tkw_high = 70
else:
fontsize = 13
tkw_high = 100
alignstr = '%dx%d+%d+%d' % (800, 600, 0,0)
root.geometry(alignstr)
ft2 = tkFont.Font(family="微软雅黑",size=fontsize, weight=tkFont.BOLD)
Label(root,text = " ", width=1, font=ft2).grid(row = 0, column = 0)
Label(root,text = "双段总时长(分)", width=12, font=ft2,relief='raised').grid(row = 0, column = 1)
entry1=Entry(root, width=3, font=ft2)
entry1.grid(row = 0, column = 2)
Label(root,text = "提前(秒)提醒", width=10, font=ft2,bg='yellow',relief='raised').grid(row = 0, column =3)
entry4=Entry(root, width=3, font=ft2)
entry4.grid(row = 0, column = 4)
Label(root,text = "第一段时长(分)", width=12, font=ft2,relief='raised').grid(row = 0, column = 5)
entry2=Entry(root, width=3, font=ft2)
entry2 .grid(row = 0, column = 6)
Label(root,text = "提前(秒)提醒", width=10, font=ft2,bg='yellow',relief='raised').grid(row = 0, column = 7)
entry5=Entry(root, width=3, font=ft2)
entry5 .grid(row = 0, column = 8)
Button(root, text="开始计时",width=10, font=ft2,bg='blue',fg='white',relief='raised', command=aaaaaa).grid(row = 0, column =9)
entry1.insert(0, 10)
entry2.insert(0, 3)
entry4.insert(0, 60)
entry5.insert(0, 30)
Label(root,text = "单段总时长(分)", width=12, font=ft2,relief='raised').grid(row = 1, column = 5)
entry3=Entry(root, width=3, font=ft2)
entry3.grid(row = 1, column = 6)
Label(root,text = "提前(秒)提醒", width=10, font=ft2,bg='yellow',relief='raised').grid(row = 1, column = 7)
entry6=Entry(root, width=3, font=ft2)
entry6.grid(row = 1, column = 8)
Button(root, text="开始计时", font=ft2,width=10,bg='darkblue',relief='raised',fg='white', command=aaaa).grid(row = 1, column =9)
entry3.insert(0, 3)
entry6.insert(0, 30)
Label(root,text = "说明:\n"
"一、本倒计时器有两种模式,双段模式、单段模式,可分别设置参数,单独启动;\n"
"二、双段模式:\n"
" 可设置总时长(分钟)最长60分钟,第一段时长(分钟),总时长必须大于第一段时长;\n"
" 第一段结束前(秒)提醒,总时长结束前(秒)进行提醒;\n"
" 启动后时间为绿色,第一段结束前提醒时变为红色,\n"
" 第一段结束后,颜色变为蓝色,总时间结束前提醒,颜色又变为红色;\n"
"三、单段模式:\n"
" 可设置总时长(分钟)最长60分钟,结束前(秒)进行提醒;\n"
" 启动后时间为绿色,结束前提醒,颜色变为红色。"
, width=70,height=10, font=ft2,bg='lightyellow',anchor='nw',justify='left',relief='raised').grid(row = 2, column = 1,columnspan=9)
root.mainloop()