banner
andrewji8

Being towards death

Heed not to the tree-rustling and leaf-lashing rain, Why not stroll along, whistle and sing under its rein. Lighter and better suited than horses are straw sandals and a bamboo staff, Who's afraid? A palm-leaf plaited cape provides enough to misty weather in life sustain. A thorny spring breeze sobers up the spirit, I feel a slight chill, The setting sun over the mountain offers greetings still. Looking back over the bleak passage survived, The return in time Shall not be affected by windswept rain or shine.
telegram
twitter
github

Python跳動的愛心代碼

聖誕節快到了,向女神表白的機會來了。廢話少說,直接看效果。。

image

import tkinter as tk
import tkinter.messagebox
import random
from math import sin, cos, pi, log
from tkinter.constants import *
width = 888
height = 500
heartx = width / 2
hearty = height / 2
side = 11
heartcolor = "pink"  # 愛心顏色,可修改
class Heart:
    def __init__(self, generate_frame=20):
        self._points = set()  # 原始愛心坐標集合
        self._edge_diffusion_points = set()  # 邊緣擴散效果點坐標集合
        self._center_diffusion_points = set()  # 中心擴散效果點坐標集合
        self.all_points = {}  # 每幀動態點坐標
        self.build(2000)
        self.random_halo = 1000
        self.generate_frame = generate_frame
        for frame in range(generate_frame):
            self.calc(frame)
    def build(self, number):
        for _ in range(number):
            t = random.uniform(0, 2 * pi)
            x, y = heart_function(t)
            self._points.add((x, y))
        for _x, _y in list(self._points):
            for _ in range(3):
                x, y = scatter_inside(_x, _y, 0.05)
                self._edge_diffusion_points.add((x, y))
        point_list = list(self._points)
        for _ in range(4000):
            x, y = random.choice(point_list)
            x, y = scatter_inside(x, y, 0.17)
            self._center_diffusion_points.add((x, y))
    @staticmethod
    def calc_position(x, y, ratio):
        force = 1 / (((x - heartx) ** 2 + (y - hearty) ** 2) ** 0.520)  # 魔法參數
        dx = ratio * force * (x - heartx) + random.randint(-1, 1)
        dy = ratio * force * (y - hearty) + random.randint(-1, 1)
        return x - dx, y - dy
    def calc(self, generate_frame):
        ratio = 10 * curve(generate_frame / 10 * pi)  # 圓滑的週期的縮放比例
        halo_radius = int(4 + 6 * (1 + curve(generate_frame / 10 * pi)))
        halo_number = int(3000 + 4000 * abs(curve(generate_frame / 10 * pi) ** 2))
        all_points = []
        heart_halo_point = set()
        for _ in range(halo_number):
            t = random.uniform(0, 2 * pi)
            x, y = heart_function(t, shrink_ratio=11.6)
            x, y = shrink(x, y, halo_radius)
            if (x, y) not in heart_halo_point:
                heart_halo_point.add((x, y))
                x += random.randint(-14, 14)
                y += random.randint(-14, 14)
                size = random.choice((1, 2, 2))
                all_points.append((x, y, size))
        for x, y in self._points:
            x, y = self.calc_position(x, y, ratio)
            size = random.randint(1, 3)
            all_points.append((x, y, size))
        for x, y in self._edge_diffusion_points:
            x, y = self.calc_position(x, y, ratio)
            size = random.randint(1, 2)
            all_points.append((x, y, size))
        for x, y in self._center_diffusion_points:
            x, y = self.calc_position(x, y, ratio)
            size = random.randint(1, 2)
            all_points.append((x, y, size))
        self.all_points[generate_frame] = all_points
    def render(self, render_canvas, render_frame):
        for x, y, size in self.all_points[render_frame % self.generate_frame]:
            render_canvas.create_rectangle(x, y, x + size, y + size, width=0, fill=heartcolor)
def heart_function(t, shrink_ratio: float = side):
    x = 16 * (sin(t) ** 3)
    y = -(13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t))
    x *= shrink_ratio
    y *= shrink_ratio
    x += heartx
    y += hearty
    return int(x), int(y)
def scatter_inside(x, y, beta=0.15):
    ratio_x = - beta * log(random.random())
    ratio_y = - beta * log(random.random())
    dx = ratio_x * (x - heartx)
    dy = ratio_y * (y - hearty)
    return x - dx, y - dy
def shrink(x, y, ratio):
    force = -1 / (((x - heartx) ** 2 + (y - hearty) ** 2) ** 0.6)
    dx = ratio * force * (x - heartx)
    dy = ratio * force * (y - hearty)
    return x - dx, y - dy
def curve(p):
    return 2 * (2 * sin(4 * p)) / (2 * pi)
def draw(main: tk.Tk, render_canvas: tk.Canvas, render_heart: Heart, render_frame=0):
    render_canvas.delete('all')
    render_heart.render(render_canvas, render_frame)
    main.after(160, draw, main, render_canvas, render_heart, render_frame + 1)
def love():
    root = tk.Tk()
    screenwidth = root.winfo_screenwidth()
    screenheight = root.winfo_screenheight()
    x = (screenwidth - width) // 2
    y = (screenheight - height) // 2 - 66
    root.geometry("%dx%d+%d+%d" % (width, height, x, y))
    root.title("❤")
    canvas = tk.Canvas(root, bg='black', height=height, width=width)
    canvas.pack()
    heart = Heart()
    draw(root, canvas, heart)
    tk.Label(root, text="我愛你!", bg="black", fg="#FF99CC", font="Helvetic 25 bold").place(relx=.5, rely=.5,
                                                                                                anchor=CENTER)
    root.mainloop()
if __name__ == '__main__':
    root = tk.Tk()
    root.title('❤')
    root.resizable(0, 0)
    root.wm_attributes("-toolwindow", 1)
    screenwidth = root.winfo_screenwidth()
    screenheight = root.winfo_screenheight()
    widths = 300
    heights = 100
    x = (screenwidth - widths) / 2
    y = (screenheight - heights) / 2 - 66
    root.geometry('%dx%d+%d+%d' % (widths, heights, x, y))  # 設置在螢幕中居中顯示
    tk.Label(root, text='親愛的,做我女朋友好嗎?', width=37, font=('宋體', 12)).place(x=0, y=10)
    def OK():  # 同意按鈕
        root.destroy()
        love()  # 同意後顯示動態愛心
    def NO():  # 拒絕按鈕,拒絕不會退出,必須同意才可以退出哦~
        tk.messagebox.showwarning('❤', '再給你一次機會!')
    def closeWindow():
        tk.messagebox.showwarning('❤', '逃避是沒有用的哦')
    tk.Button(root, text='好哦', width=5, height=1, command=OK).place(x=80, y=50)
    tk.Button(root, text='不要', width=5, height=1, command=NO).place(x=160, y=50)
    root.protocol('WM_DELETE_WINDOW', closeWindow)  # 綁定退出事件
    root.mainloop()

這段代碼實現了一個用 Python 的 Tkinter 庫繪製跳動愛心的程序,其中包括了一個彈窗來詢問是否做一個人的女朋友,如果同意則會顯示跳動的愛心,如果拒絕則會重新詢問。(無法解決,只能同意哦~)

下面對代碼進行詳細分析:

1. 導入必要的庫
01
首先,導入了一些必要的 Python 庫,包括 Tkinter 庫以及一些數學函數庫和常量庫。這些庫是用於程序中需要用到的功能,例如繪圖、隨機數生成、數學函數計算等。

2. 設置常量
02
接下來,設置了一些常量,包括了窗口的寬度和高度、愛心的顏色、以及心形的大小等。

3. 定義心形類
03
定義了一個名為 Heart 的類,其中包括了一些函數和變量。在__init__函數中,首先定義了原始愛心坐標集合(self._points)、邊緣擴散效果點坐標集合(self._edge_diffusion_points)、中心擴散效果點坐標集合(self._center_diffusion_points)以及每幀動態點坐標的集合(self.all_points)。然後調用了build函數生成原始愛心的坐標集合、邊緣擴散效果點坐標集合和中心擴散效果點坐標集合。在build函數中,首先生成了一定量的原始愛心坐標,並將其加入self._points集合中。然後對於每一個原始愛心坐標,隨機生成三個偏移量,通過scatter_inside函數將其加入到邊緣擴散效果點坐標集合中。最後,隨機從原始愛心坐標中選取一個,通過shrink函數將其縮小到某一個半徑內,並將其加入到中心擴散效果點坐標集合中。

在另一個函數calc中,定義了半徑的縮放比例、光暈的半徑和數量,並生成了一定量的光暈點並將其加入到self.all_points中。然後,針對每一個點集合,通過調用calc_position函數計算其移動後的坐標,將其加入到all_points中。在calc_position函數中,根據當前點和心形的位置計算出力的大小與方向,並根據這個大小與方向隨機移動一些距離。最後,在render函數中,將所有點集合中的點在畫布上繪製出來。

4. 繪製愛心
04
通過draw函數不停地在畫布上繪製出變化的愛心,實現了動態愛心的效果。

5. 詢問窗口
05
在主函數中,首先創建了一個名為 root 的 Tkinter 窗口,並設置其標題和大小。然後創建了兩個詢問按鈕的函數(同意和拒絕),並分別在窗口中設置其位置和響應函數。定義了一個函數closeWindow用於在點擊窗口關閉按鈕時提醒用戶不能通過逃避來解決問題。最後,通過調用mainloop函數進入主循環,等待用戶的響應。

總之,這段代碼實現了一個簡單的互動式動態愛心程序,可以通過相應的函數繪製跳動的愛心,並通過彈窗與用戶進行簡單的互動。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。