記錄一起走過的那些日子
2016年10月2日在一起到現在快6年了,也有了小寶寶,希望以後一家人開開心心,健康生活,各自實現自己的目標。
最近在學Python,那也用代碼送個鑽石戒指給你吧,哈哈~
(一)繪制戒指
使用tkinter的canvas畫布繪制8個點,然後把這8個點使用canvas.create_line()劃線函數用直線連接起來形成鑽石形狀。為了增強效果讓鑽石旋轉起來,使用while循環,每隔一段時間重新繪制鑽石,但繪制的起始角度偏轉11.25度,這樣運行程序鑽石看上去就旋轉起來了。
繪制好鑽石後,再使用canvas.create_oval()繪制兩個橢圓作為戒指環就可以了。
(二)繪制雪花
只有戒指單調了一點,來給畫布添加點雪花。這裡使用random.randint()函數每隔一段時間隨機繪制50個10px大小的白色正方形,並繪制在畫布上,這裡看起來就好多了。這裡繪制正方形使用到了canvas.create_rectangle()函數。
import time,random,math
from tkinter import Tk, Canvas
# 打開窗口
def open_window():
_root = Tk()
_root.title("七夕,用Python給你送個鑽石戒指")
_root.config(bg='black')
# 設置畫板
_canvas = Canvas(_root, width=640, height=380, bg='black')
_canvas.pack()
# 待窗口創建後,2秒後執行動畫
_root.after(2000, paint_canvas(_root, _canvas))
_root.mainloop()
# 啟動動畫函數
def paint_canvas(_tk, _canvas):
# 設置鑽石開始角度
_start_angle = 0
# 設置存放鑽石八個點x,y坐標的列表
_list_x, _list_y = [], []
# 設置鑽石八個點之間的角度_angel,鑽石中心點x,y坐標_x_center,_y_center,鑽石半徑_r
_angle, _x_center, _y_center, _r = 30, 320, 120, 50
while True:
# 清空畫板
_canvas.delete("all")
# 畫戒指
paint_ring(_canvas, _start_angle, _angle, _x_center, _y_center, _r, _list_x, _list_y)
_list_x.clear()
_list_y.clear()
# 從新計算鑽石開始角度
_start_angle = (_start_angle + 11.25) % 360
# 畫星星
paint_star(_canvas)
# 動畫刷新時間間隔
time.sleep(0.05)
_canvas.update()
_tk.update()
# 畫戒指函數
def paint_ring(_canvas, _start_angle, _angle, _x_center, _y_center, _r, _list_x, _list_y):
_canvas.create_oval(180, 110, 460, 280, outline='white')
_canvas.create_oval(190, 130, 450, 275, outline='white')
for i in range(12):
_list_x.append(_x_center + _r * math.cos((_start_angle + (_angle * i)) * math.pi / 180))
_list_y.append(_y_center + _r * math.sin((_start_angle + (_angle * i)) * math.pi / 180))
for i in range(12):
for j in range(12):
_canvas.create_line(_list_x[i], _list_y[i], _list_x[j], _list_y[j], fill='white')
# 畫雪花函數
def paint_star(_canvas):
# 隨機生成不超過畫布長、寬的50個正方形點
for i in range(50):
x = random.randint(0, 630)
y = random.randint(0, 370)
_canvas.create_rectangle(x, y, x + 5, y + 5, fill='white')
if __name__ == '__main__':
# 打開程序窗口
open_window()