1. 为什么选择Pyglet一个老玩家的真心话如果你刚接触Python想做个带点图形、能出声儿的小程序或者干脆就是想试试自己做个小游戏那你可能已经听过Pygame的大名。但今天我想跟你聊聊另一个选择Pyglet。我用过不少这类库Pyglet给我的感觉就像一把瑞士军刀它没那么“重”但该有的功能一个不少而且设计得非常“Pythonic”——用起来很顺手。Pyglet到底是什么简单说它是一个纯Python的、跨平台的多媒体库。你不用装一堆乱七八糟的运行时环境一个pip install pyglet命令下去从Windows到macOS再到Linux它都能跑起来。它直接给你提供了一个窗口你可以在里面画图、播放声音视频、处理鼠标键盘事件。官方说它是为了游戏和视觉丰富的应用设计的这话不假。我最早用它做过一个简单的粒子系统演示后来也用它搭过一些小工具的可视化界面体验都很流畅。跟一些“重量级”选手比Pyglet的优势在哪首先就是零外部依赖。你不需要先装一个庞大的游戏引擎或者配置复杂的OpenGL环境。它自己就封装好了这些底层的东西。其次它原生支持多窗口和多显示器。这个特性在做演示或者需要多视图的应用时特别有用你不用自己去折腾那些麻烦的跨屏显示逻辑。最后它的媒体支持非常广泛。图片、音频、视频常见的格式它基本都能读。想播放个MP3或者MP4只要你的系统里有FFmpeg一个非常常见的多媒体处理工具Pyglet就能直接调用省心。所以Pyglet特别适合谁呢我觉得是这几类朋友一是编程新手想找个门槛低的图形库入门体验一下“创造”的乐趣二是需要快速原型验证的开发者比如你想演示一个算法效果或者做个简单的数据可视化Pyglet能让你很快搭出个带界面的程序三是轻量级游戏或交互应用的爱好者不想被复杂引擎束缚享受从底层搭建的掌控感。如果你符合上面任何一条那接着往下看就对了。2. 5分钟搞定安装与环境配置万事开头难但Pyglet的开头真的不难。咱们先把“地基”打好。2.1 安装Pyglet一行命令的事安装Pyglet最推荐也最省事的方法就是用pip。打开你的命令行终端Windows上是CMD或PowerShellmacOS/Linux上是Terminal输入下面这行命令pip install pyglet对就这么简单。这条命令会从Python的官方包索引里下载最新稳定版的Pyglet并自动安装好。如果你用的是Python 3可能需要用pip3来确保是给Python 3安装pip3 install pyglet我建议你总是为项目创建一个独立的虚拟环境比如用venv或conda然后在虚拟环境里安装Pyglet。这样可以避免不同项目之间的库版本冲突。不过如果你是第一次尝试直接在全局环境安装也完全没问题Pyglet很“干净”一般不会引起冲突。安装过程通常很快。完成后你可以验证一下。在终端里输入python进入Python交互式环境然后尝试导入import pyglet print(pyglet.version)如果没有报错并且打印出版本号比如2.0.10恭喜你安装成功了2.2 关于FFmpeg让你的应用能“听”会“看”Pyglet本身能处理一些基础的媒体格式比如未压缩的WAV音频和PNG图片。但如果你想播放更常见的MP3、OGG音乐或者MP4、AVI视频就需要一个“外援”——FFmpeg。FFmpeg是什么它是一个功能极其强大的开源音视频处理程序库。Pyglet在需要解码压缩媒体文件时会去系统里找FFmpeg来帮忙。所以安装FFmpeg不是安装一个Python库而是为你的操作系统安装一个工具。怎么安装FFmpegWindows用户可以去FFmpeg官网下载编译好的可执行文件解压后把里面的bin文件夹路径添加到系统的环境变量PATH里。更简单的方法是使用包管理器比如用choco install ffmpeg如果你安装了Chocolatey或者scoop install ffmpeg。macOS用户最方便的是用Homebrew。打开终端输入brew install ffmpeg即可。Linux用户如Ubuntu使用自带的包管理器比如sudo apt install ffmpeg。安装好FFmpeg后你不需要在Python代码里做任何特殊操作。Pyglet会自动探测并使用它。你可以打开终端直接输入ffmpeg -version如果能显示出版本信息就说明安装和配置成功了。注意对于第一个“Hello World”应用我们暂时用不到音视频播放所以即使暂时没装FFmpeg也不影响我们创建窗口和显示图片。你可以先跳过这一步等需要播放音乐时再来安装。3. 创建第一个窗口从“黑盒子”开始安装好了让我们立刻来点有成就感的东西——创建一个属于你自己的应用窗口。在Pyglet里这只需要几行代码。3.1 最简窗口四行代码的奇迹打开你喜欢的代码编辑器VS Code、PyCharm甚至记事本都行新建一个文件比如叫first_window.py。然后输入以下代码import pyglet # 创建一个窗口设置宽度、高度和标题 window pyglet.window.Window(width800, height600, caption我的第一个Pyglet应用) # 启动Pyglet的应用事件循环 pyglet.app.run()保存文件然后在终端里导航到这个文件所在的目录运行它python first_window.py发生了什么一个800像素宽、600像素高的窗口弹了出来标题栏显示着“我的第一个Pyglet应用”。虽然现在里面一片空白默认是黑色背景但这已经是一个完整的、可以移动、缩放、最小化、关闭的桌面应用程序了。pyglet.app.run()这一行启动了Pyglet的事件循环它就像程序的心脏开始跳动等待着处理用户的输入比如点击关闭按钮和系统的消息。3.2 理解事件循环程序如何“活”起来你可能好奇为什么程序运行后没有立刻退出而是持续显示着窗口秘密就在pyglet.app.run()里。这行代码启动了一个事件循环。你可以把事件循环想象成一个永不疲倦的“前台接待员”。它一直坐在那里循环做着三件事检查事件队列看看有没有新的事情发生。比如用户按下了键盘on_key_press、移动了鼠标on_mouse_motion、点击了关闭按钮on_close。分发事件如果发生了事情它就立刻喊对应的“负责人”我们写的事件处理器函数来处理。更新与绘制在每一轮循环的间隙它会给我们一个机会去更新游戏逻辑比如让一个球移动位置然后清空窗口重新绘制所有东西。只要这个循环在跑我们的程序就是“活”的。当我们点击窗口的关闭按钮时一个关闭事件被触发默认的行为就是终止这个事件循环于是程序自然结束。这就是图形界面程序的基本工作模式。4. 让窗口“动”起来绘制与事件响应只有一个黑窗口太无聊了。让我们给它加点内容并让它能跟我们的操作互动。4.1 绘制文字向世界说“Hello”我们来绘制经典的“Hello, World!”。修改之前的代码import pyglet window pyglet.window.Window(800, 600, Hello Pyglet!) # 创建一个标签Label对象也就是一段文字 label pyglet.text.Label(Hello, World!, font_nameTimes New Roman, font_size36, xwindow.width//2, ywindow.height//2, anchor_xcenter, anchor_ycenter) # 定义一个事件处理器当窗口需要绘制时就调用这个函数 window.event def on_draw(): window.clear() # 清空上一帧的画面用默认的黑色填充 label.draw() # 绘制标签 pyglet.app.run()运行一下你会看到白色的“Hello, World!”显示在了窗口的正中央。这里有几个关键点on_draw事件这是窗口需要重绘时比如窗口刚出现、从最小化恢复、被其他窗口挡住后又露出会自动触发的事件。我们通过window.event这个装饰器告诉Pygleton_draw函数是处理绘制事件的。window.clear()在画新东西之前先把旧画面擦干净否则会留下残影。label.draw()调用标签对象的draw方法把它画到屏幕上。锚点anchoranchor_xcenter, anchor_ycenter意味着我们指定的坐标(x, y)是标签的中心点。如果我们设置成left和bottom那么(x, y)就是标签左下角的位置。这个设置对于精准定位非常有用。4.2 处理键盘与鼠标与用户对话让程序能“听”到我们的操作。我们来增加键盘和鼠标事件的处理import pyglet window pyglet.window.Window(800, 600) label pyglet.text.Label(Hello, World!, x400, y300, anchor_xcenter, anchor_ycenter) window.event def on_draw(): window.clear() label.draw() # 处理键盘按下事件 window.event def on_key_press(symbol, modifiers): # symbol是按键的编码modifiers是修饰键如Shift, Ctrl if symbol pyglet.window.key.A: label.text 你按下了 A 键 elif symbol pyglet.window.key.ESCAPE: # 按下ESC键关闭窗口 window.close() # 处理鼠标点击事件 window.event def on_mouse_press(x, y, button, modifiers): # x, y是点击位置的坐标button是鼠标按键左键、右键等 if button pyglet.window.mouse.LEFT: label.text f你在 ({x}, {y}) 位置点击了左键 # 顺便把标签移动到点击位置 label.x, label.y x, y pyglet.app.run()运行这个程序试试按下键盘的A键和ESC键再在窗口里用鼠标左键点几下。你会发现标签的文字和位置都随着你的操作改变了这就是事件驱动编程的魅力。我们不需要写一个循环去不停地检查键盘状态只需要预先定义好“当某某事件发生时我该做什么”。Pyglet的事件循环会帮我们打理好一切。5. 加载资源让应用“有声有色”一个真正的多媒体应用怎么能少了图片和声音Pyglet让资源加载变得异常简单。5.1 显示一张图片假设你有一张叫cat.png的图片放在和你的Python脚本同一个目录下。你可以这样加载并显示它import pyglet window pyglet.window.Window(800, 600) # 加载图片 cat_image pyglet.image.load(cat.png) # 创建一个精灵Sprite对象。精灵是带有位置、缩放、旋转等属性的图像对象。 cat_sprite pyglet.sprite.Sprite(cat_image, x200, y150) window.event def on_draw(): window.clear() cat_sprite.draw() pyglet.app.run()pyglet.image.load()方法非常强大它能自动识别PNG, JPEG, BMP, GIF等多种常见图片格式。加载后创建的sprite对象除了draw()方法你还可以轻松地设置它的属性比如cat_sprite.scale 0.5缩小到一半或者cat_sprite.rotation 45旋转45度这让制作动画变得很方便。5.2 播放一段音效声音资源同样容易加载。确保你的FFmpeg已经安装好如果需要播放MP3等压缩格式。我们准备一个meow.wav或meow.mp3文件。import pyglet # 加载音效 meow_sound pyglet.media.load(meow.wav, streamingFalse) # streamingFalse表示将整个音频文件加载到内存适合短小的音效。 window.event def on_key_press(symbol, modifiers): if symbol pyglet.window.key.SPACE: # 按下空格键时播放音效 meow_sound.play() print(喵) # 创建窗口并运行... window pyglet.window.Window(400, 300) pyglet.app.run()运行后按下空格键你应该就能听到“喵”的一声了。pyglet.media.load()方法同样支持多种音频格式。对于较长的背景音乐你可以使用streamingTrue流式播放来节省内存。6. 整合实战打造你的第一个迷你应用现在我们把前面学到的所有东西组合起来做一个稍微有点意思的小应用一个可以用键盘方向键控制移动的猫咪移动时还会播放音效。6.1 项目结构与代码创建一个新的项目文件夹里面放两个文件你的Python脚本比如my_cat_game.py和资源文件cat.png和meow.wav。import pyglet # 1. 创建窗口和加载资源 window pyglet.window.Window(800, 600, caption移动的猫咪) cat_image pyglet.image.load(cat.png) cat_sprite pyglet.sprite.Sprite(cat_image, x400, y300) cat_sprite.scale 0.5 # 让猫咪小一点 meow_sound pyglet.media.load(meow.wav, streamingFalse) # 2. 定义绘制事件 window.event def on_draw(): window.clear() cat_sprite.draw() # 3. 定义键盘事件控制猫咪移动 window.event def on_key_press(symbol, modifiers): speed 10 # 每次移动的像素距离 if symbol pyglet.window.key.UP: cat_sprite.y speed elif symbol pyglet.window.key.DOWN: cat_sprite.y - speed elif symbol pyglet.window.key.LEFT: cat_sprite.x - speed elif symbol pyglet.window.key.RIGHT: cat_sprite.x speed elif symbol pyglet.window.key.SPACE: meow_sound.play() print(猫咪叫了一声) elif symbol pyglet.window.key.ESCAPE: window.close() # 4. 启动程序 pyglet.app.run()6.2 运行与扩展运行这个程序你应该能看到窗口中央有一只小猫。使用键盘的上下左右方向键可以移动它按下空格键它会“喵喵”叫按下ESC键则退出程序。这个简单的程序已经包含了图形界面程序的核心要素资源管理加载图片声音、图形渲染绘制精灵、用户交互键盘事件处理和应用生命周期管理事件循环。你可以在此基础上无限扩展给猫咪加上动画比如切换多张图片形成走路效果。增加重力和跳跃逻辑让它更像一个平台游戏角色。在窗口里绘制背景和障碍物。添加鼠标控制让猫咪移动到点击的位置。我刚开始用Pyglet时就是从这样一个能控制的小方块开始的。后来慢慢加上了碰撞检测、状态管理、场景切换最终做出了第一个完整的小游戏。这个过程里Pyglet的API设计得很直观文档也还算清晰遇到问题去查查基本都能找到答案。最重要的是它让你能专注于“用代码创造东西”这个本质的快乐上而不是在配置环境和学习复杂概念上耗费太多精力。