1.0时钟上一个格子对应6度
2.0只需要模拟12个小时走完一圈就行了
3.0有些时钟不一样可能是一格一格走的,不过对应的角度关系不变,可是会影响到模拟的精度
4.0运算的时候要显示出运算的状态,但是要简明.
下面直接上代码
from queue import Queue
import threading
from decimal import Decimal
from decimal import getcontext
import time,os
angle_dic = Queue(1000)
calculate_ok=1
end_time = 60*60*12
lock = threading.Lock()
def get_angle_time():
global secends_point
secends_point = 0
print("运算开始:")
while True:
getcontext().prec = 6
secends_point+=Decimal(0.2)
minter_point = Decimal(secends_point)/Decimal(60)
hour_point = Decimal(minter_point)/Decimal(60)
if minter_point == end_time:
print("0k")
return
angle={
}
angle['secends']=secends_point*6
angle['minter']=Decimal(minter_point)*6
angle['hour']=Decimal(hour_point)*6
angle_dic.put(angle)
def calculate_angle():
global calculate_ok,secends_point
while True:
getcontext().prec = 6
angle_get = angle_dic.get()
secends_angle = angle_get['secends']%360
minter_angle = angle_get['minter']%360
hour_angle = angle_get['hour']%360
if secends_angle>minter_angle:
if minter_angle > hour_angle :
comper_angle_sm = Decimal(secends_angle)- Decimal(minter_angle)
comper_angle_mh = Decimal(minter_angle) - Decimal(hour_angle)
elif minter_angle < hour_angle and secends_angle>hour_angle:
comper_angle_mh = Decimal(hour_angle)-Decimal(minter_angle)
comper_angle_sm = Decimal(secends_angle) - Decimal(hour_angle)
elif minter_angle >secends_angle:
if hour_angle>secends_angle and hour_angle<minter_angle:
comper_angle_mh = Decimal(minter_angle) - Decimal(hour_angle)
comper_angle_sm = Decimal(hour_angle) - Decimal(secends_angle)
elif hour_angle<secends_angle :
comper_angle_sm = Decimal(minter_angle)- Decimal(secends_angle)
comper_angle_mh = Decimal(secends_angle) - Decimal(hour_angle)
elif hour_angle > minter_angle:
if minter_angle > secends_angle :
comper_angle_sm = Decimal(hour_angle) - Decimal(minter_angle)
comper_angle_mh = Decimal(minter_angle)- Decimal(secends_angle)
elif minter_angle < secends_angle and hour_angle > secends_angle:
comper_angle_sm = Decimal(secends_angle) - Decimal(minter_angle)
comper_angle_mh = Decimal(hour_angle) - Decimal(secends_angle)
else:
pass
if abs(comper_angle_mh-comper_angle_sm) < 0.01:
lock.acquire()
calculate_ok = 0
lock.release()
time_secends = Decimal(secends_angle)/Decimal(6)
time_minter = Decimal(minter_angle)/Decimal(6)
time_hour = Decimal(hour_angle)/Decimal(6)
print("\n在{hour}时{minter}分{secends:.2f}秒三个指针的间隔相等为:{space:.3f}°".format(hour=int(time_hour),minter=int(time_minter),secends=time_secends,space=comper_angle_sm))
if Decimal(hour_angle)/Decimal(6) >=12:
calculate_ok=2
print("\n计算完成")
os._exit(0)
def showndo():
global calculate_ok,secends_point
while True:
if calculate_ok==2:
os._exit(0)
if calculate_ok:
for i in range(30):
br = "\033[41m \033[0m"
time.sleep(0.2)
print(br, end='')
br = '\r' + br
print(br, end='')
else:
lock.acquire()
calculate_ok=1
lock.release()
t1 = threading.Thread(target=get_angle_time)
t1.start()
t2=threading.Thread(target=calculate_angle)
t2.start()
t3 = threading.Thread(target=showndo)
t3.start()
这里我要吐槽的是,由于这个print()函数的进度条问题,具体原因应该是线程和print函数的线程内部的一些问题,没有办法直接用return结束函数,这里只能使用os._exit(0)强行结束
这个其实利用了\r这个玩意,这个东东可以覆盖打印
例如:
print(“abc\rbnx”)
结果时:
bnx
所以这个就好玩了
for i in range(30):
br = "\033[41m \033[0m"
time.sleep(0.2)
print(br, end='')
br = '\r' + br
print(br, end='')
那个奇奇怪怪的\033是他的特殊的输出模式,可以输出带有颜色的字体
"\033[1;30;42m你好\033[0m"
结果就是:高亮红色背景绿色的你好
然后注意那个\033[0m其实是恢复默认的意思,如果你不加入那你后面打印的都是这种格式的内容