文較長,適合收藏,慢慢研讀分析。
===========
一、開篇說明:
1.推薦指數:★★★★★
2.衷心感謝:原作者:執(zhí)念執(zhí)戰(zhàn)(王成程)
3.代碼說明:在原作者的基礎上進行代碼的整合、刪減、增加、潤色、注釋,分享出來,僅供學習。
4.仿抖音網紅文字時鐘,目前有app可以下載,網上也有html和css的免費代碼下載,python的很少,這怎么能讓python缺席呢?
html代碼實現的,網上有免費代碼下載
==========================
二、python的pygame實現的效果圖:
1.圖:
2,非常漂亮。
★3.提前準備:★
3.1 python3以上,推薦python3.8
3.2 微軟編輯器vscode
3.3 下載自己喜歡的字體,本文中hwfs=華文仿宋
3.4 二進制文件‘HZK16’,需要自己去下載。
請大家搜索原作者的博客(執(zhí)念執(zhí)戰(zhàn)),也是對原作者的尊重,我故意留下一個小bug。
=============
三,代碼及分析:
1.第1步:
#---第1步---導出模塊---
from math import *
import pygame
from pygame.locals import *
import time
import sys
import binascii #任意中文字符時使用到此庫
import math
2.第2步:
#---第2步---初始化定義---
#字符倍數比例函數,修改次數據可以實現整體的放大和縮小,建議此數值在0.8-1.3 之間,看起來比較合適
fontmultiple=1
#屏幕的寬和高,圓心坐標是屏幕大小的一半
SCREEN_X_MAX=int(1500*fontmultiple)
SCREEN_Y_MAX=int(1500*fontmultiple)
#游戲初始化
pygame.init()
#本人喜歡加RESIZABLE,屏幕大小
screen=pygame.display.set_mode((SCREEN_X_MAX,SCREEN_Y_MAX),RESIZABLE)
FOCAL_DISTANCE=512 #透視模型
3.第3步:
#---第3步---顏色定義---
BLACK=(0,0,0)
WHITE=(255,255,255)
RED=(255,0,0)
GREEN=(0,255,0)
BLUE=(0,0,255)
ForeColor=RED #前景色和背景色
BackColor=BLACK
#中文字體,可以自己下載,hwfs=hwfs
font=pygame.font.Font('hwfs.ttf', 36)
4.第4步:原作者是放入一個py文件(Transform3D.py),用模塊一樣導出,我將他整合進去,刪除不需要的部分。
#---第4步---3d相關定義---
#定義畫點函數---need
def Gui_Point(x,y,color):
pygame.draw.line(screen,color,(int(x),int(y)),(int(x+1),int(y)),2)
#定義坐標結構體類---need
class zuobiaostruct:
def __init__(self):
self.x=0
self.y=0
self.z=0
#矩陣相乘函數---need
def MATRIX_multiply(MAT1,MAT2):
newMAT=[[0.0 for i in range(4)] for n in range(4)]
for a in range(4):
for b in range(4):
newMAT[a][b]=MAT1[a][0]*MAT2[0][b]+MAT1[a][1]*MAT2[1][b]+MAT1[a][2]*MAT2[2][b]+MAT1[a][3]*MAT2[3][b]
return newMAT
#矢量與矩陣相乘函數---need
def vector_matrix_MULTIPLY(Source,MAT):
Result=zuobiaostruct()
Result.x=Source.x*MAT[0][0]+Source.y*MAT[1][0]+Source.z*MAT[2][0]+MAT[3][0]
Result.y=Source.x*MAT[0][1]+Source.y*MAT[1][1]+Source.z*MAT[2][1]+MAT[3][1]
Result.z=Source.x*MAT[0][2]+Source.y*MAT[1][2]+Source.z*MAT[2][2]+MAT[3][2]
return Result
#構造單位矩陣函數
def structure_3D():
MAT=[[0.0 for i in range(4)] for i in range(4)]
MAT[0][0]=1.0
MAT[0][1]=0.0
MAT[0][2]=0.0
MAT[0][3]=0.0 #// 1 0 0 0
MAT[1][0]=0.0
MAT[1][1]=1.0
MAT[1][2]=0.0
MAT[1][3]=0.0 #// 0 1 0 0
MAT[2][0]=0.0
MAT[2][1]=0.0
MAT[2][2]=1.0
MAT[2][3]=0.0 #// 0 0 1 0
MAT[3][0]=0.0
MAT[3][1]=0.0
MAT[3][2]=0.0
MAT[3][3]=1.0 #// 0 0 0 1
return MAT
#平移變換矩陣函數---need
def Translate3D(MAT,tx, ty, tz):
tMAT=[[0.0 for i in range(4)] for i in range(4)]
tMAT[0][0]=1
tMAT[0][1]=0
tMAT[0][2]=0
tMAT[0][3]=0 #// 1 0 0 tx
tMAT[1][0]=0
tMAT[1][1]=1
tMAT[1][2]=0
tMAT[1][3]=0 #// 0 1 0 ty
tMAT[2][0]=0
tMAT[2][1]=0
tMAT[2][2]=1
tMAT[2][3]=0 #// 0 0 1 tz
tMAT[3][0]=tx
tMAT[3][1]=ty
tMAT[3][2]=tz
tMAT[3][3]=1; #// 0 0 0 1
return MATRIX_multiply(MAT,tMAT)#//相乘
#比例(scale)變換矩陣函數---need
def Scale_3D( MAT, sx, sy, sz):
tMAT=[[0.0 for i in range(4)] for i in range(4)]
tMAT[0][0]=sx
tMAT[0][1]=0
tMAT[0][2]=0
tMAT[0][3]=0 #// sx0 0 0
tMAT[1][0]=0
tMAT[1][1]=sy
tMAT[1][2]=0
tMAT[1][3]=0 #// 0 sy0 0
tMAT[2][0]=0
tMAT[2][1]=0
tMAT[2][2]=sz
tMAT[2][3]=0 #// 0 0 sz0
tMAT[3][0]=0
tMAT[3][1]=0
tMAT[3][2]=0
tMAT[3][3]=1 #// 0 0 0 1
return MATRIX_multiply(MAT,tMAT) # //相乘
#旋轉變換矩陣函數---need
def Rotate_3D( MAT, ax, ay, az):
MAT1=[[0.0 for i in range(4)] for i in range(4)]
MAT2=[[0.0 for i in range(4)] for i in range(4)]
MATx=[[0.0 for i in range(4)] for i in range(4)]
MATy=[[0.0 for i in range(4)] for i in range(4)]
MATz=[[0.0 for i in range(4)] for i in range(4)]
ax=(3.1415926*ax)/180.0 #//角度轉換為弧度量
ay=(3.1415926*ay)/180.0
az=(3.1415926*az)/180.0
#*****************************繞x軸旋轉********************************************
MATx[0][0]=1
MATx[0][1]=0
MATx[0][2]=0
MATx[0][3]=0 #//1 0 0 0
MATx[1][0]=0
MATx[1][1]=cos(ax)
MATx[1][2]=-sin(ax)
MATx[1][3]=0 #//0 cos(ax) -sin(ax) 0
MATx[2][0]=0
MATx[2][1]=sin(ax)
MATx[2][2]=cos(ax)
MATx[2][3]=0 #//0 sin(ax) cos(ax) 0
MATx[3][0]=0
MATx[3][1]=0
MATx[3][2]=0
MATx[3][3]=1 #//0 0 0 1
#*****************************繞y軸旋轉********************************************
MATy[0][0]=cos(ay)
MATy[0][1]=0
MATy[0][2]=sin(ay)
MATy[0][3]=0 #//cos(ay) 0 sin(ay) 0
MATy[1][0]=0
MATy[1][1]=1
MATy[1][2]=0
MATy[1][3]=0 #// 0 1 0 0
MATy[2][0]=-sin(ay)
MATy[2][1]=0
MATy[2][2]=cos(ay)
MATy[2][3]=0 #// -sin(ay) 0 cos(ay) 0
MATy[3][0]=0
MATy[3][1]=0
MATy[3][2]=0
MATy[3][3]=1 #// 0 0 0 1
#*****************************繞z軸旋轉********************************************
MATz[0][0]=cos(az)
MATz[0][1]=-sin(az)
MATz[0][2]=0
MATz[0][3]=0 #//cos(az) -sin(az) 0 0
MATz[1][0]=sin(az)
MATz[1][1]=cos(az)
MATz[1][2]=0
MATz[1][3]=0 #// sin(az) cos(az) 0 0
MATz[2][0]=0
MATz[2][1]=0
MATz[2][2]=1
MATz[2][3]=0 #// 0 0 1 0
MATz[3][0]=0
MATz[3][1]=0
MATz[3][2]=0
MATz[3][3]=1 #// 0 0 0 1
MAT1=MATRIX_multiply(MAT,MATx)
MAT2=MATRIX_multiply(MAT1,MATy)
return MATRIX_multiply(MAT2,MATz)
#透視投影(Perspective projection)---need
def PerProject( Space, XO, YO):
Screen=zuobiaostruct()
if (Space.z==0):
Space.z=0.01 #//被除數不能為零
Screen.x=(int)(FOCAL_DISTANCE*Space.x /(Space.z+FOCAL_DISTANCE)+XO)
Screen.y=(int)(FOCAL_DISTANCE*Space.y /(Space.z+FOCAL_DISTANCE)+YO)
return Screen
#顯示3D的16x16字符---need
def Show3D16x16Char(font,ax,ay,az,x,y,Z_Size,frontcolor,backcolor,model=1.5,fontmultiple=1.0):
length=len(font)
if length==0:#字符數要大于一個
return
if length==1: #只支持一個字符的顯示
text=font
else:
text=font[0]
m=0
i=0
k=0
j=0
XO=0
YO=0
gMAT=[[0.0 for i in range(4)] for n in range(4)]
Point0=zuobiaostruct()
Point1=zuobiaostruct()
PointDis=zuobiaostruct()
gMAT=structure_3D() #//構建單位矩陣
gMAT=Translate3D(gMAT,-8,-8,-8); #//平移變換矩陣
gMAT=Scale_3D(gMAT,fontmultiple,fontmultiple,fontmultiple); #//比例變換矩陣
gMAT=Rotate_3D(gMAT,ax,ay,az); #//旋轉變換矩陣
for m in range(length): #理論上就是將單個的字符延長為多個字符,最重要的就是坐標的確定和計算
text=font[m]
gb2312=text.encode('gb2312')
hex_str=binascii.b2a_hex(gb2312)
result=str(hex_str,encoding='utf-8' ) #換算出漢字對應的字符地址
if eval('0x' + result[:2]) <128:
return
else:
area=eval('0x' + result[:2]) - 0xA0
index=eval('0x' + result[2:]) - 0xA0 #換算為16進制地址
offset=(94 * (area - 1)+ (index - 1))*32 #得出具體地址
font_rect=None
#注意這個文件HZK16,二進制文件需要單獨下載
with open("/home/xgj/Desktop/漢字時鐘/pyxgj/HZK16","rb") as f: #16x16字符集的地址,從中讀取出一個字符的點陣數據
f.seek(offset)
font_rect=f.read(32)#得到32個點陣數據
f.close()
for i in range(16):
for k in range(8):
temp=0x01 << k
for j in range(2):
data=font_rect[i*2+j] #取出數據
if data & temp==temp:
Point0.x=16-(k+(1-j)*8)+m*16+m*2 #第m個字符的當前點的坐標
#每個字符16個像素,第m個字符共m*16個像素,每兩個字符間的間距設為2,則m*16+m*2,前面的時實現當前點陣坐標的計算
Point0.y=i #(i*8)+k
Point0.z=Z_Size #//此參數能夠改變字符距離旋轉軸中心的距離
Point1=vector_matrix_MULTIPLY(Point0,gMAT)#//矢量與矩陣相乘
PointDis=PerProject(Point1,XO,YO) #//映射投影
Gui_Point(PointDis.x+x,PointDis.y+y,frontcolor)
else:
if model==1: #模式為1 時才會繪制底色
Point0.x=16-(k+(1-j)*8)+m*16+m*2
Point0.y=i #(i*8)+k
Point0.z=Z_Size #//此參數能夠改變字符距離旋轉軸中心的距離
Point1=vector_matrix_MULTIPLY(Point0,gMAT)#//矢量與矩陣相乘
PointDis=PerProject(Point1,XO,YO) #//映射投影
Gui_Point(PointDis.x+x,PointDis.y+y,backcolor)
5.第5步:我增加了秒的相關定義和設置,在后續(xù)中補充秒的部分代碼。
#---第5步---中文標簽定義-------------
Week_zw=("一","二","三","四","五","六","日") #星期的中文
Day_zw=("零","一","二","三","四","五","六","七","八","九","十") #可用于所有需要0-10的中文的地方
Mouth_day=[31,28,31,30,31,30,31,31,30,31,30,31] #月份時長表
#秒
Second_add=['零','一', '二', '三', '四', '五', '六', '七', '八', '九', '十',
'十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九',
'二十','二十一', '二十二', '二十三', '二十四', '二十五', '二十六', '二十七', '二十八', '二十九',
'三十','三十一', '三十二', '三十三', '三十四', '三十五', '三十六', '三十七', '三十八', '三十九',
'四十','四十一', '四十二', '四十三', '四十四', '四十五', '四十六', '四十七', '四十八', '四十九',
'五十', '五十一', '五十二', '五十三', '五十四', '五十五', '五十六', '五十七', '五十八', '五十九',
]
6.第6步:這里有增加秒的代碼
#---第6步---相關顯示函數定義---
#顯示年
def Show_Year(x0,y0,r,angel):
timenow=time.localtime(time.time()) #獲取時間
yearstr=Day_zw[(int)(timenow[0]/1000)]+Day_zw[int((timenow[0]%1000)/100)]+Day_zw[int((timenow[0]%100)/10)]+Day_zw[int((timenow[0]%10))]+"年"
Show3D16x16Char(yearstr,0,0,angel-90,x0,y0,1,WHITE,BackColor,0,fontmultiple)
#顯示周(星期)
def Show_Week(x0,y0,r,agl):
timenow=time.localtime(time.time()) #獲取時間
for i in range(7):
angel=360/7
if i < timenow[6]:
angel=agl-angel*(timenow[6]-i)
ForeColor=RED
elif i >timenow[6]:
angel=agl+angel*(i-timenow[6])
ForeColor=RED
else :
angel=agl #當前周設為90度,即在水平方向上
ForeColor=WHITE
x1=x0 + r * math.sin(angel * 3.14/180) #由角度計算出當前應在的坐標點
y1=y0 + r * math.cos(angel * 3.14/180)
Show3D16x16Char("周"+Week_zw[i],0,0,angel-90,(int)(x1),(int)(y1),1,ForeColor,BackColor,0,fontmultiple)#輸出旋轉后的字符串
#顯示月份
def Show_Month(x0,y0,r,agl):
timenow=time.localtime(time.time())#獲取時間
for i in range(1,13): #一年12個月
angel=360/12
if i < timenow[1]:
angel=agl-angel*(timenow[1]-i) #其他月份相應得到角度推算
ForeColor=GREEN
elif i >timenow[1]:
angel=agl+angel*(i-timenow[1])
ForeColor=GREEN
else :
angel=agl #當前月份設為90度,即在水平方向上
ForeColor=WHITE
x1=x0 + r * math.sin(angel * 3.14/180) #由角度計算出當前應在的坐標點
y1=y0 + r * math.cos(angel * 3.14/180)
if i>10:
monthstr=Day_zw[10]+Day_zw[i%10]+"月" #得出要顯示的字符串
else:
monthstr=Day_zw[i]+"月"
Show3D16x16Char(monthstr,0,0,angel-90,(int)(x1),(int)(y1),1,ForeColor,BackColor,0,fontmultiple)#顯示字符串
#顯示日期
def Show_Day(x0,y0,r,agl):
timenow=time.localtime(time.time()) #獲取時間
if (timenow[0]%4==0 and timenow[0]%100 !=0) or (timenow[0]%400==0):
Mouth_day[1]=29 #閏年,補全二月的時長表
else:
Mouth_day[1]=28
#Mouth_day 為月份的時長表
for i in range(1,Mouth_day[timenow[1]-1]+1):
angel=360/Mouth_day[timenow[1]-1]
if i < timenow[2]:
angel=agl-angel*(timenow[2]-i)#其他日期相應得到角度推算
ForeColor=RED
elif i >timenow[2]:
angel=agl+angel*(i-timenow[2])
ForeColor=RED
else :
angel=agl #當前日期設為90度,即在水平方向上
ForeColor=WHITE
x1=x0 + r * math.sin(angel * 3.14/180)#由角度計算出當前應在的坐標點
y1=y0 + r * math.cos(angel * 3.14/180)
if i>20:
if i%10 !=0:
daystr=Day_zw[(int)(i/10) ]+ Day_zw[10] +Day_zw[i%10]+"日"#得出要顯示的字符串
else:
daystr=Day_zw[(int)(i/10) ]+ Day_zw[10]+"日"
elif i>10:
daystr=Day_zw[10]+Day_zw[i%10]+"日"
else:
daystr=Day_zw[i]+"日"
Show3D16x16Char(daystr,0,0,angel-90,(int)(x1),(int)(y1),1,ForeColor,BackColor,0,fontmultiple)#顯示字符串
#顯示時=小時=h
def Show_Hour(x0,y0,r,agl):
timenow=time.localtime(time.time())#獲取時間
for i in range(0,24):
angel=360/24
if i < timenow[3]:
angel=agl-angel*(timenow[3]-i)#其他時間相應得到角度推算
ForeColor=GREEN
elif i >timenow[3]:
angel=agl+angel*(i-timenow[3])
ForeColor=GREEN
else :
angel=agl #當前時間設為90度,即在水平方向上
ForeColor=WHITE
x1=x0 + r * math.sin(angel * 3.14/180)
y1=y0 + r * math.cos(angel * 3.14/180)
if i>20:
if i%10 !=0:
daystr=Day_zw[(int)(i/10) ]+ Day_zw[10] +Day_zw[i%10]+"時" #得到要顯示的字符串
else:
daystr=Day_zw[(int)(i/10) ]+ Day_zw[10]+"時"
elif i>10:
daystr=Day_zw[10]+Day_zw[i%10]+"時"
else:
daystr=Day_zw[i]+"時"
Show3D16x16Char(daystr,0,0,angel-90,(int)(x1),(int)(y1),1,ForeColor,BackColor,0,fontmultiple) #顯示角度計算后的字符串
# 顯示分=分鐘=m
def Show_Min(x0,y0,r,agl):
timenow=time.localtime(time.time())
for i in range(0,60):
angel=360/60
if i < timenow[4]:
#將秒數也代入角度計算中就可以得到更精確的角度偏移,而且每秒鐘都會移動,好看
angel=agl-angel*(timenow[4]-i)-(360/60/60 * timenow[5] )
ForeColor=RED
elif i > timenow[4]:
angel=agl + angel * (i-timenow[4]) - (360/60/60 * timenow[5] )
ForeColor=RED
else :
angel=agl - (360/60/60 * timenow[5] ) #當前日期設為90度-秒鐘的角度,實現動態(tài)顯示
ForeColor=WHITE
x1=x0 + r * math.sin(angel * 3.14/180) #由角度計算出當前應在的坐標點
y1=y0 + r * math.cos(angel * 3.14/180)
if i>=20:
if i%10 !=0:
daystr=Day_zw[(int)(i/10) ]+ Day_zw[10] +Day_zw[i%10]+"分" #得到要顯示的字符串
else:
daystr=Day_zw[(int)(i/10) ]+ Day_zw[10]+"分"
elif i>10:
daystr=Day_zw[10]+Day_zw[i%10]+"分"
else:
daystr=Day_zw[i]+"分"
Show3D16x16Char(daystr,0,0,angel-90,(int)(x1),(int)(y1),1,ForeColor,BackColor,0,fontmultiple)#顯示角度計算后的字符串
# 顯示秒=秒針=s
def Show_Sec(x0,y0,r,agl):
#獲取時間列表
timenow=time.localtime(time.time())
#print(timenow)
#time.struct_time(tm_year=2020, tm_mon=3, tm_mday=28, tm_hour=9, tm_min=24, tm_sec=18)
for i in range(0,60):
angel=360/60
if i < timenow[5]:
#有一個bug,如何實現跳一秒走一格,整體轉一圈優(yōu)雅些,暫時不會。
angel=agl-angel*(timenow[5]-i)-(360/60 * timenow[5])
ForeColor=GREEN
elif i > timenow[5]:
angel=agl + angel * (i-timenow[5])-(360/60 * timenow[5])
ForeColor=GREEN
else :
#當前日期設為90度-秒鐘的角度,實現動態(tài)顯示
angel=agl-(360/60 * timenow[5] )
#歸零=o時顯示紅色
if angel==90:
ForeColor=RED
#當前時間為白色
else:
ForeColor=WHITE
#根據秒表動態(tài)轉圈
x1=x0 + r * math.sin(angel * 3.14/180) #由角度計算出當前應在的坐標點
y1=y0 + r * math.cos(angel * 3.14/180)
if i>=20:
if i%10 !=0:
#加入秒的字符串
daystr=Second_add[(int)(i/10) ]+ Second_add[10] +Second_add[i%10]+"秒" #得到要顯示的字符串
else:
daystr=Second_add[(int)(i/10) ]+ Second_add[10]+"秒"
elif i>10:
daystr=Second_add[10]+Second_add[i%10]+"秒"
else:
daystr=Second_add[i]+"秒"
#顯示秒的字符串一圈
Show3D16x16Char(daystr,0,0,angel-90,(int)(x1),(int)(y1),1,ForeColor,BackColor,0,fontmultiple)#顯示角度計算后的字符串
7.第7步:我增加了打印當前時間的打印文字函數
#---第7步---定義打印屏幕文字函數---
def print_text(font, x, y, text, color=WHITE):
imgText=font.render(text, True, WHITE)
screen.blit(imgText, (int(float(x)),int(float(y))))
8.第8步:
#---第8步---游戲循環(huán)---
i=0
while True:
#獲取今天的時間
timenow=time.localtime(time.time())
#定義年月日
years=timenow[0]
months=timenow[1]
days=timenow[2]
#定義時分秒
#hours=today.hour % 12 #顯示12h制
hours=timenow[3] % 24 #顯示24h制
minutes=timenow[4]
seconds=timenow[5]
#顯示當前時間,x=400,y=550,為坐標
print_text(font, 500, 150, '當前時間:'+str(years) +'年'+str(months) +'月'+str(days)
+'日'+str(hours) +'時'+ ":" + str(minutes) + '分'+":" + str(seconds)+'秒')
#退出設置
for event in pygame.event.get():
if event.type in (QUIT,KEYDOWN):
pygame.quit()
sys.exit()
i+=1
#當i<90啟動時整體圓盤都要轉動,當≥90時停止
if i > 90:
i=90
#圓盤設置
#坐標點,水平向右坐標定固定顯示白色當前時間;
Show_Year(SCREEN_X_MAX/2-40*fontmultiple,SCREEN_Y_MAX/2,32,90) #顯示年
Show_Week(SCREEN_X_MAX/2,SCREEN_Y_MAX/2,65*fontmultiple,180-i) #顯示周
Show_Month(SCREEN_X_MAX/2,SCREEN_Y_MAX/2,110*fontmultiple,i) #顯示月份
Show_Day(SCREEN_X_MAX/2,SCREEN_Y_MAX/2,170*fontmultiple,180-i) #顯示日期
Show_Hour(SCREEN_X_MAX/2,SCREEN_Y_MAX/2,245*fontmultiple,i) #顯示時
Show_Min(SCREEN_X_MAX/2,SCREEN_Y_MAX/2,325*fontmultiple,180-i) #顯示分
Show_Sec(SCREEN_X_MAX/2,SCREEN_Y_MAX/2,425*fontmultiple,180-i) #顯示秒
#線圈的設置
pygame.draw.circle(screen,ForeColor,((int)(SCREEN_X_MAX/2),(int)(SCREEN_Y_MAX/2)),int(55*fontmultiple),1) #顯示幾個圓
pygame.draw.circle(screen,ForeColor,((int)(SCREEN_X_MAX/2),(int)(SCREEN_Y_MAX/2)),int(100*fontmultiple),1)
pygame.draw.circle(screen,ForeColor,((int)(SCREEN_X_MAX/2),(int)(SCREEN_Y_MAX/2)),int(160*fontmultiple),1)
pygame.draw.circle(screen,ForeColor,((int)(SCREEN_X_MAX/2),(int)(SCREEN_Y_MAX/2)),int(235*fontmultiple),1)
pygame.draw.circle(screen,ForeColor,((int)(SCREEN_X_MAX/2),(int)(SCREEN_Y_MAX/2)),int(315*fontmultiple),1)
pygame.draw.circle(screen,ForeColor,((int)(SCREEN_X_MAX/2),(int)(SCREEN_Y_MAX/2)),int(415*fontmultiple),1)
pygame.display.update()
screen.fill(0) #屏幕清零
四、結束語:
據說python無所不能,可惜我也是新手小白,我也是站在巨人和大神的肩膀上的,感謝大神執(zhí)念執(zhí)戰(zhàn)(王成程)。最重要的是python為什么這么火?第1是代碼簡潔;第2是代碼及庫很多,都是開源的、免費的,都是大神們之間互相免費提供的,在此多謝他們。
喜歡python的人,不管多大年紀、不管男女,看我的python,你學起來簡單有趣,我都是親測過的。
它們通通變成數字時鐘吧!
前段時間,一個「Kindle 疑似退出中國市場」的新聞登上熱搜,很多人這才想起被自己冷落許久的 Kindle。雖然經常被吐槽為壓泡面神器,但事實往往更殘酷,大多數人即使是泡面時也懶得翻出它——假如就在手邊能隨時拿到,那也算不上是壓箱底了。(看到這里,你可以把自己的 Kindle 拿出來充充電了)
在吃灰列表中,Kindle 只是最常被吐槽的那個,像它一樣被打入冷宮的產品還有不少。過時或已經損壞的電子產品已經失去了其使用價值,情懷玩家只是拿來收藏。除了放在抽屜里吃灰,還有什么方法可以讓它們「發(fā)揮余熱」嗎?
先來說說 Kindle。網上很多人曬出的圖都顯示電量不足,也有人提供了一種新用法,把 Kindle 當數字時鐘。Kindle 官方系統(tǒng)自然是不能隨便安裝應用,需要用「網頁瀏覽器」來實現。
通過代碼能讓 Kindle 進入常亮狀態(tài)(重啟可以恢復),建議將背光亮度調到最低,同時打開飛行模式,這樣能讓續(xù)航時間長一點。
不知道有多少人是為健身環(huán)買了 Switch?能堅持鍛煉(變禿)變強的人只是少數,更多人是一時沖動。如果你本身不是重度玩家,又找不到人一起玩聚會游戲,Switch 的使用場景其實很少,最終難逃吃灰命運。
任天堂官方出了一個《AAA 時鐘》,售價 79 港元。是的你沒有看錯,它的功能就是讓你的 Switch 顯示數字時鐘,顏值相當贊,可切換 24 小時制、更改顏色樣式。配合顏色豐富的手柄或貼紙保護套,放在桌上當擺件也是不錯的。
這款鬧鐘軟體中還附送了一個游戲,類似 Chrome 的斷網小恐龍,沒什么游戲體驗。
吃灰的還有健身環(huán),健身器材怎么二次利用,不用我多說了吧?
圖片來源于網絡
iPad 的情況比前兩者好一點,雖然不是所有人都把它當「生產力工具」使用,不過至少也能看看愛奇藝。iPad 的使用場景被手機電腦搶走許多,這么大又優(yōu)秀的屏幕,放著實在是浪費,不如——把它變成數字時鐘吧!
iPad 時鐘應用我推薦「謎底時鐘」,樣式比較豐富,還帶音效,可以利用快捷指令設置為充電時自動運行,或者添加小組件到桌面。
謎底時鐘也有 iPhone 版本,推薦給家里有舊 iPhone 的朋友。
安卓端的時鐘應用就多了,或者還有一種選擇,買一個「堅果鬧鐘式無線充電座」,二手市場價格不到百元,幾款支持無線充電的堅果手機可以直接放上去顯示翻頁鬧鐘,其他品牌需要安裝「堅果時鐘」App。
上面介紹的是過時或者使用場景較少的產品,并不是不能用,有的產品是真的完全失去了使用價值。
最近流行把數碼零件裝進展示框的玩法,有人把這做成了一門生意,你可以直接購買到裱好的成品來收藏:
(某寶店鋪:尋樂造物)
有人把電路板做成了項鏈:
某寶店鋪:1ceas
時尚圈和數碼圈的組合也很有意思,AirPods 可以當配飾使用:
圖片來源:《Vogue》
人們購買數碼產品時,大多把實用性放在第一位,買之前會詳細對比價格和參數,設想好了各種用法。但事與愿違,人每天可支配的時間有限,而數碼領域最不缺的就是新品迭代。當舊的物件失去其使用價值,除了賣二手之外,不如想想如何才能讓自己不要忘記它。
本文作者:劉丟丟
本文首發(fā)于極客之選,轉載請聯(lián)系極客君(ID:geekparker)。
家我呀,我是yangyang,此刻看到一個小特效,是國外一哥們做的,特來分享給大家.
數字時代,數字發(fā)光時鐘體現了形式與功能的融合。在這篇文章中,我們將深入研究如何使用 HTML、CSS 和 JavaScript 來構建一個。
構建一個結構化基礎,其中包含小時、分鐘、秒和可選的 AM/PM 指示器元素。可訪問性至關重要,因此我們將使用語義標簽并提供有意義的描述。
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Digital clock</title>
<link rel="stylesheet" href="css/style.css" />
</head>
<body>
<div class="hero">
<div class="box">
<style></style>
<div class="clock">
<span id="hrs">00</span>
<span>:</span>
<span id="min">00</span>
<span>:</span>
<span id="sec">00</span>
</div>
</div>
</div>
<script src="js/index.js"></script>
</body>
</html>
利用 box-shadow 和 text-shadow 等屬性,我們將為時鐘注入活力。通過微調顏色和發(fā)光強度,我們將確保它吸引用戶。
* {
margin: 0;
padding: 0;
font-family: "Poppins", sans-serif;
box-sizing: border-box;
}
.hero {
width: 100%;
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
background: #2f363e;
position: relative;
}
.box {
position: relative;
width: 800px;
height: 300px;
display: flex;
align-items: center;
justify-content: center;
}
.clock {
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
backdrop-filter: blur(40px);
color: #6e7f92f6;
z-index: 10;
}
.clock span {
font-size: 80px;
width: 110px;
display: inline-block;
text-align: center;
position: relative;
}
.clock span::after {
font-size: 16px;
position: absolute;
bottom: -15px;
left: 50%;
transform: translateX(-50%);
}
#hrs::after {
content: "HOURES";
color: #0f0;
font-weight: 600;
margin-bottom: -10px;
}
#min::after {
content: "MINS";
color: #0ff;
font-weight: 600;
margin-bottom: -10px;
}
#sec::after {
content: "SEC";
color: #ff0;
font-weight: 600;
margin-bottom: -10px;
}
/*------Anemated Border---------*/
.box::before {
content: "";
position: absolute;
inset: 0;
background: repeating-conic-gradient(
from var(--a),
#0f0,
#ff0,
#0ff,
#f0f,
#0ff
);
border-radius: 20px;
animation: rotate 6s linear infinite;
}
.box::after {
content: "";
position: absolute;
inset: 0;
background: repeating-conic-gradient(
from var(--a),
#0f0,
#ff0,
#0ff,
#f0f,
#0ff
);
border-radius: 20px;
animation: rotate 4s linear infinite;
filter: blur(40px);
opacity: 0.75;
}
.box style {
position: absolute;
inset: 4px;
background: #2f363e;
border-radius: 16px;
color: #ff0;
font-size: 20px;
z-index: 1;
display: flex;
align-items: center;
justify-content: center;
}
@property --a {
syntax: "<angle>";
inherits: false;
initial-value: 0deg;
}
@keyframes rotate {
0% {
--a: 0;
}
0% {
--a: -360deg;
}
}
JavaScript 為我們的時鐘注入了活力,實現了小時、分鐘和秒的實時更新。我們還將考慮添加時區(qū)支持和用戶偏好的自定義選項等功能。
*請認真填寫需求信息,我們會在24小時內與您取得聯(lián)系。