国外摄影网站推荐,旅游网站建设模块,网站备案 注销,php和什么语言做网站【Python零基础到精通】特别篇 | 浪漫至死不渝#xff1a;用代码打造 3D 交互深空爱心实验室Python 版本#xff1a;Python 3.12 (建议使用 3.10 以上版本) 开发工具#xff1a;PyCharm 或 VS Code 操作系统#xff1a;Windows / macOS / Linux (通用)1. 引言#xff1a;当…【Python零基础到精通】特别篇 | 浪漫至死不渝用代码打造 3D 交互深空爱心实验室Python 版本Python 3.12(建议使用 3.10 以上版本)开发工具PyCharm或VS Code操作系统Windows/macOS/Linux(通用)1. 引言当编程遇上浪漫谁说程序员不浪漫今天我们将跳出枯燥的控制台利用 Python 的tkinter库和基础动力学原理打造一个全交互式的深空爱心实验室。它不仅有会呼吸的爱心还有随鼠标起舞的视察星空甚至点击屏幕还能触发划破长空的流星。2. 核心技术点本程序虽然代码量不大但涵盖了多个有趣的知识点参数方程利用爱心的几何数学公式生成粒子坐标。动力学粒子系统模拟摩擦力、弹性趋向力和鼠标排斥力。视差滚动 (Parallax)通过鼠标坐标实时微调背景营造 3D 空间感。事件驱动编程实时捕捉鼠标移动与点击。3. 核心代码实现浪漫深空实验室这里是爱心的核心逻辑你可以直接复制到heart_art.py中运行importtkinterastkimportrandomimportmathimporttime# --- 深度艺术配置 ---WIDTH1100HEIGHT750BG_COLOR#050508# 极深蓝黑深空感HEART_COLORS[#FF2D55,#FF69B4,#FF1493,#FFC0CB,#FFFFFF,#8A2BE2]STAR_COLORS[#FFFFFF,#FFE4E1,#F0F8FF,#FFFACD]TEXT_COLOR#F8F8F8PImath.pidefget_heart_point(t,scale15):爱心参数方程x16*(math.sin(t)**3)y-(13*math.cos(t)-5*math.cos(2*t)-2*math.cos(3*t)-math.cos(4*t))returnx*scale,y*scaleclassBackgroundStar:背景动态星星支持视差滚动与呼吸闪烁def__init__(self,canvas):self.canvascanvas self.xrandom.randint(0,WIDTH)self.yrandom.randint(0,HEIGHT)self.sizerandom.uniform(0.5,2.0)self.colorrandom.choice(STAR_COLORS)self.parallaxrandom.uniform(0.01,0.03)# 视差系数self.alpha_speedrandom.uniform(0.02,0.05)self.idself.canvas.create_oval(self.x,self.y,self.xself.size,self.yself.size,fillself.color,outline)defupdate(self,mouse_x,mouse_y,frame):# 1. 视差效果随鼠标反向轻微移动dx(mouse_x-WIDTH/2)*self.parallax dy(mouse_y-HEIGHT/2)*self.parallax# 2. 呼吸闪烁brightness(math.sin(frame*self.alpha_speed)1)/2curr_x,curr_yself.x-dx,self.y-dy self.canvas.coords(self.id,curr_x,curr_y,curr_xself.size*brightness,curr_yself.size*brightness)classMeteor:随机划过的流星def__init__(self,canvas):self.canvascanvas self.reset()self.idself.canvas.create_line(0,0,0,0,fillwhite,width1)defreset(self):self.xrandom.randint(0,WIDTH)self.yrandom.randint(0,HEIGHT//2)self.lenrandom.randint(40,80)self.speedrandom.randint(10,20)self.anglePI/4# 45度滑落self.activeFalseifrandom.random()0.01:# 触发概率self.activeTruedefupdate(self):ifnotself.active:ifrandom.random()0.005:self.reset()returnself.xself.speed*math.cos(self.angle)self.yself.speed*math.sin(self.angle)ifself.xWIDTHorself.yHEIGHT:self.activeFalseself.canvas.coords(self.id,-10,-10,-10,-10)else:self.canvas.coords(self.id,self.x,self.y,self.x-self.len*math.cos(self.angle),self.y-self.len*math.sin(self.angle))classParticle:增强版动力学粒子def__init__(self,canvas,x,y,is_coreTrue):self.canvascanvas self.is_coreis_core self.target_x,self.target_yx,y self.curr_x,self.curr_yxrandom.uniform(-200,200),yrandom.uniform(-200,200)self.vx,self.vy0,0self.frictionrandom.uniform(0.9,0.94)self.easerandom.uniform(0.06,0.1)self.sizerandom.uniform(1.5,3.5)ifis_coreelserandom.uniform(0.8,1.5)self.colorrandom.choice(HEART_COLORS)ifis_coreelse#2A2A3Aself.idself.canvas.create_rectangle(self.curr_x,self.curr_y,self.curr_xself.size,self.curr_yself.size,fillself.color,outline)defupdate(self,mouse_x,mouse_y,frame):# 1. 目标吸引力 (带呼吸脉冲)pulse(math.sin(frame*0.1)*0.051)ifself.is_coreelse1tx(self.target_x-WIDTH/2)*pulseWIDTH/2ty(self.target_y-HEIGHT/2)*pulseHEIGHT/2self.vx(tx-self.curr_x)*self.ease self.vy(ty-self.curr_y)*self.ease# 2. 鼠标排斥m_dxself.curr_x-mouse_x m_dyself.curr_y-mouse_y dist_sqm_dx**2m_dy**2ifdist_sq150**2:distmath.sqrt(dist_sq)0.1force(150-dist)/150self.vx(m_dx/dist)*force*20self.vy(m_dy/dist)*force*20self.vx*self.friction self.vy*self.friction self.curr_xself.vx self.curr_yself.vy self.canvas.coords(self.id,self.curr_x,self.curr_y,self.curr_xself.size,self.curr_yself.size)classUltimateLoveLab:def__init__(self):self.roottk.Tk()self.root.title(Ultimate Love Lab - Deep Space Edition)self.root.attributes(-topmost,True)self.canvastk.Canvas(self.root,widthWIDTH,heightHEIGHT,bgBG_COLOR,highlightthickness0)self.canvas.pack(fillboth,expandTrue)self.frame0self.mouse_x,self.mouse_yWIDTH/2,HEIGHT/2# 粒子分层渲染self.bg_stars[BackgroundStar(self.canvas)for_inrange(150)]self.meteors[Meteor(self.canvas)for_inrange(3)]self.particles[]self.init_heart()# 文案self.text_idself.canvas.create_text(WIDTH/2,HEIGHT-60,text点击星空许下心愿,fillTEXT_COLOR,font(Microsoft YaHei,15,italic))self.root.bind(Motion,lambdae:setattr(self,mouse_x,e.x)orsetattr(self,mouse_y,e.y))self.root.bind(Button-1,self.on_click)self.animate()definit_heart(self):# 生成爱心粒子for_inrange(2200):trandom.uniform(0,2*PI)ox,oyget_heart_point(t)rmath.sqrt(random.random())# 内部填充均匀分布px,pyox*rWIDTH/2,oy*rHEIGHT/2-40self.particles.append(Particle(self.canvas,px,py,is_coreTrue))# 生成少量漂浮尘埃for_inrange(300):self.particles.append(Particle(self.canvas,random.randint(0,WIDTH),random.randint(0,HEIGHT),is_coreFalse))defon_click(self,event):# 爆发效果forpinself.particles:dx,dyp.curr_x-event.x,p.curr_y-event.y dmath.sqrt(dx**2dy**2)0.1p.vx(dx/d)*60p.vy(dy/d)*60# 随机产生一颗流星forminself.meteors:ifnotm.active:m.activeTruebreakdefanimate(self):self.frame1# 更新背景forstarinself.bg_stars:star.update(self.mouse_x,self.mouse_y,self.frame)formeteorinself.meteors:meteor.update()# 更新主体粒子forpinself.particles:p.update(self.mouse_x,self.mouse_y,self.frame)self.root.after(16,self.animate)if__name____main__:UltimateLoveLab().root.mainloop()4. 进阶如何将这份浪漫“打包”送人写好代码后如果对方电脑没装 Python 怎么办我们需要把它打包成.exe文件。为了实现“无脑式”打包我特意写了一个带界面的打包助手one_click_packer.py。它会自动安装依赖、清理垃圾文件并在完成后自动打开文件夹。一键打包工具代码importosimportsubprocessimportsysimportshutilimportthreadingimporttkinterastkfromtkinterimportmessagebox,ttkclassBrainlessPacker:def__init__(self):self.roottk.Tk()self.root.title(Python 无脑打包工具 v1.0)self.root.geometry(450x300)self.root.resizable(False,False)# 样式设置stylettk.Style()style.configure(TButton,font(Microsoft YaHei,10))style.configure(TLabel,font(Microsoft YaHei,10))# 主界面self.main_framettk.Frame(self.root,padding20)self.main_frame.pack(fillboth,expandTrue)self.labelttk.Label(self.main_frame,text 准备就绪将打包 heart_art.py,wraplength400)self.label.pack(pady20)self.progressttk.Progressbar(self.main_frame,modeindeterminate,length300)self.progress.pack(pady10)self.btn_packttk.Button(self.main_frame,text开始一键打包 (生成 EXE),commandself.start_packing)self.btn_pack.pack(pady20)self.status_vartk.StringVar(value等待操作...)self.status_labelttk.Label(self.main_frame,textvariableself.status_var,foregroundgray)self.status_label.pack()defupdate_status(self,text,colorblack):self.status_var.set(text)self.status_label.configure(foregroundcolor)self.root.update_idletasks()defstart_packing(self):self.btn_pack.config(statedisabled)self.progress.start()# 开启新线程打包防止界面卡死threading.Thread(targetself.pack_process,daemonTrue).start()defpack_process(self):target_fileheart_art.pyexe_name浪漫深空实验室try:# 1. 检查文件ifnotos.path.exists(target_file):self.root.after(0,lambda:messagebox.showerror(错误,f找不到{target_file}))return# 2. 安装环境self.root.after(0,lambda:self.update_status(正在检查/安装打包引擎 (PyInstaller)...,blue))subprocess.check_call([sys.executable,-m,pip,install,pyinstaller,-i,https://pypi.tuna.tsinghua.edu.cn/simple])# 3. 开始打包self.root.after(0,lambda:self.update_status(正在疯狂打包中请稍候 (约 1-2 分钟)...,orange))cmd[pyinstaller,--onefile,--noconsole,--clean,f--name{exe_name},target_file]# 执行打包命令resultsubprocess.run(cmd,capture_outputTrue,textTrue)ifresult.returncode0:# 4. 清理垃圾文件self.root.after(0,lambda:self.update_status(打包完成正在清理临时文件...,green))ifos.path.exists(build):shutil.rmtree(build)spec_filef{exe_name}.specifos.path.exists(spec_file):os.remove(spec_file)# 5. 成功提示并打开目录self.root.after(0,self.finish_success)else:self.root.after(0,lambda:messagebox.showerror(打包失败,f错误详情\n{result.stderr}))exceptExceptionase:self.root.after(0,lambda:messagebox.showerror(发生意外错误,str(e)))finally:self.root.after(0,self.reset_ui)deffinish_success(self):self.update_status( 打包大成功,green)dist_pathos.path.join(os.getcwd(),dist)messagebox.showinfo(成功,fEXE 已生成在 dist 文件夹下\n即将为你自动打开目录。)# 自动打开文件夹ifos.nament:# Windowsos.startfile(dist_path)else:# macOS/Linuxsubprocess.run([openifsys.platformdarwinelsexdg-open,dist_path])defreset_ui(self):self.progress.stop()self.btn_pack.config(statenormal)if成功notinself.status_var.get():self.update_status(准备就绪)if__name____main__:appBrainlessPacker()app.root.mainloop()5. 避坑小贴士性能优化由于本程序使用了 2500 个粒子如果你的电脑配置较低可以尝试将init_heart中的循环次数2200调小。打包路径确保打包脚本和heart_art.py放在同一个文件夹下。环境问题如果一键打包失败请检查是否已将 Python 添加到系统环境变量中。6. 结语代码是理性的但爱是感性的通过这篇教程我们不仅学习了tkinter的高级用法和粒子系统的动力学模拟更重要的是我们学会了如何用代码去表达情感。如果你觉得这篇文章有帮助欢迎点赞支持作者继续输出高质量教程。收藏留着下次情人节/纪念日备用。评论分享你运行后的截图看看谁的爱心最亮眼