初步探索Pyglet库:打造轻量级多媒体与游戏开发利器

目录

pyglet库

功能特点

安装和导入

安装

导入

基本代码框架

导入模块

创建窗口

创建控件

定义事件

运行应用  

程序界面

运行结果

完整代码

标签控件

常用事件

窗口事件

鼠标事件

键盘事件

文本事件

其它场景 

网页标签 

音乐播放

图片显示

祝大家新年快乐,龙行龘龘!


pyglet库

是一个跨平台的Python多媒体库,提供了一个简单易用的接口来创建窗口、加载图像和视频、播放音频、处理用户输入事件以及进行2D图形绘制。特别适合用于游戏开发、视听应用以及其它需要高效图形渲染和音频播放的项目。

功能特点

  1. 跨平台支持
    Pyglet 可以在 Windows、Mac OS X 和 Linux 平台上运行,得益于其对这些操作系统底层图形和音频API的良好封装。
  2. 窗口与事件处理
    创建窗口和全屏应用程序,并且能够轻松管理窗口的各种属性如大小、位置、标题等。
    提供全面的键盘、鼠标和其他输入设备事件处理机制,可以方便地编写交互式程序。
  3. 图形绘制
    支持OpenGL ES 2.0,可以在窗口中直接进行2D图形绘制,包括点、线、多边形、纹理贴图等。
    内置一套简单的图形API,可用于构建复杂的2D图形界面和动画。
  4. 图像与媒体文件
    能够加载和显示各种格式的图片(如PNG、JPG、GIF等)。
    支持播放多种音频格式,通过内部集成的音频解码器可以直接播放WAV、MP3、OGG等多种音频文件。
  5. 文本渲染
    提供基本的文本渲染能力,可以将文本转化为纹理并显示在屏幕上。
  6. 异步I/O与定时器
    内建了异步I/O的支持,允许开发者非阻塞地加载资源或执行其他后台任务。
    支持设置定时器,用于实现帧率控制、动画更新等功能。
  7. 架构灵活性
    Pyglet 没有采用严格的场景图结构或者游戏循环,而是给予开发者更大的自由度来设计自己的程序架构。
  8. 轻量化与性能
    相比于一些更大型的游戏开发框架,Pyglet 更为简洁和轻巧,启动速度快,内存占用相对较小。

安装和导入

安装

pip install pyglet

导入

import pyglet


基本代码框架

导入模块

import pyglet

创建窗口

window = pyglet.window.Window()  

创建控件

label = pyglet.text.Label('Hello, world',  
                          font_name='Times New Roman',  
                          font_size=36,  
                          x=window.width//2, y=window.height//2,  
                          anchor_x='center', anchor_y='center')

定义事件

@window.event  
def on_draw():  
    # 定义窗口的绘制事件处理函数
    window.clear()  #清除窗口 
    label.draw()   # 绘制标签

运行应用  

pyglet.app.run()

程序界面

运行结果

完整代码

import pygletwindow = pyglet.window.Window() label = pyglet.text.Label('Hello, world',  font_name='Times New Roman',  font_size=36,  x=window.width//2, y=window.height//2,  anchor_x='center', anchor_y='center')@window.event  
def on_draw():window.clear()label.draw()pyglet.app.run()

注:处理事件的函数装饰器为 @window.event 

标签控件

class Label(text=''font_name=Nonefont_size=Nonebold=Falseitalic=False

stretch=Falsecolor=(255, 255, 255, 255)x=0y=0z=0width=Noneheight=None

anchor_x='left'anchor_y='baseline'rotation=0align='left'multiline=False

dpi=Nonebatch=Nonegroup=Noneprogram=None)


常用事件

窗口事件

  1. on_draw():当窗口需要重绘时触发。这是最常用的事件之一,用于绘制图形、文本等到窗口上。
  2. on_resize(width, height):当窗口大小改变时触发。开发者可以在此事件中调整视图或重新布局界面元素。
  3. on_close():当用户尝试关闭窗口时触发。开发者可以在此事件中执行清理操作或询问用户是否真的想要退出。

鼠标事件

  1. on_mouse_motion(x, y, dx, dy):当鼠标在窗口内移动时触发。提供鼠标的当前位置。
  2. on_mouse_press(x, y, button, modifiers):当鼠标按钮按下时触发。提供鼠标的位置和按下的按钮。
  3. on_mouse_release(x, y, button, modifiers):当鼠标按钮释放时触发。类似于on_mouse_press,但表示按钮的释放动作。
  4. on_mouse_drag(x, y, dx, dy, buttons, modifiers):当鼠标按下并拖动时触发。提供鼠标的位置、移动的距离和按下的按钮。
  5. on_mouse_enter(x, y):当鼠标指针进入窗口时触发。
  6. on_mouse_leave(x, y):当鼠标指针离开窗口时触发。

键盘事件

  1. on_key_press(symbol, modifiers):当键盘上的键被按下时触发。提供按键的符号和任何修饰键(如Shift、Ctrl等)的状态。
  2. on_key_release(symbol, modifiers):当键盘上的键被释放时触发。类似于on_key_press,但表示按键的释放动作。

文本事件

  1. on_text(text):当可打印字符被输入时触发。这不同于键盘事件,因为它解释了键盘布局和修饰键,提供了实际的文本字符。
  2. on_text_motion(motion):当文本输入的光标或选择发生变化时触发(不常用)。
  3. on_text_motion_select(motion):当文本被选择时触发(不常用)。

例:增加一个按键事件 on_key_press

import pygletwindow = pyglet.window.Window()pyglet.gl.glClearColor(200/255, 220/255, 220/255, 1)label = pyglet.text.Label('Hello, world',  font_name='Times New Roman',  font_size=36,  x=window.width//2, y=window.height//2,  anchor_x='center', anchor_y='center',color=(0, 0, 0, 255))@window.event
def on_draw():window.clear()label.draw()@window.event
def on_key_press(symbol, modifiers):if symbol == pyglet.window.key.ESCAPE:window.close()pyglet.app.run()

另改变了窗口背景色(200,220,220) ,标签前景色改为黑色。

增加鼠标事件 on_mouse_press,同时引入key和mouse:

from pyglet.window import key
from pyglet.window import mouse

完整代码:

import pyglet
from pyglet.window import key
from pyglet.window import mousewindow = pyglet.window.Window()pyglet.gl.glClearColor(200/255, 220/255, 220/255, 1)label = pyglet.text.Label('Hello, world',  font_name='Times New Roman',  font_size=36,  x=window.width//2, y=window.height//2,  anchor_x='center', anchor_y='center',color=(0, 0, 0, 255))@window.event
def on_draw():window.clear()label.draw()@window.event
def on_key_press(symbol, modifiers):if symbol in range(97,97+26):text = f'The {chr(symbol-32)} key was pressed.'elif symbol == key.LEFT:text = 'The left arrow key was pressed.'elif symbol == key.ENTER:text = 'The enter key was pressed.'label.text = text@window.event
def on_mouse_press(x, y, button, modifiers):if button == mouse.LEFT:text = 'The left mouse button was pressed.'elif button == mouse.MIDDLE:text = 'The middle mouse button was pressed.'elif button == mouse.RIGHT:text = 'The right mouse button was pressed.'label.text = textpyglet.app.run()

按键和鼠标点击的消息在标签中显示,直接改变标签.text属性即可:

其它场景 

网页标签 

class HTMLLabel(text=''location=Nonex=0y=0z=0width=Noneheight=None

anchor_x='left'anchor_y='baseline'rotation=0multiline=Falsedpi=None

batch=Nonegroup=Noneprogram=None)

注意参数设置:multiline=True 

import pygletwindow = pyglet.window.Window()pyglet.gl.glClearColor(200/255, 220/255, 220/255, 1)text = '''
<html>
<head>
<meta charset="utf-8">
<title>pyglet</title>
</head>
<body><h1>第一级标题</h1><p>我的<font color="red">第1个</font>段落。</p><h2>第二级标题</h2><p>我的<font color="blue">第2个</font>段落。</p>
</body>
</html>
'''
label = pyglet.text.HTMLLabel(text, x=10, y=window.height-10, width=500, anchor_y='top', multiline=True)@window.event
def on_draw():window.clear()label.draw()pyglet.app.run()

运行结果:

音乐播放

import pygletmusic = pyglet.resource.media('voice1.mp3')
music.play()pyglet.app.run()

图片显示

import pygletwindow = pyglet.window.Window(width=1200, height=900)
image = pyglet.resource.image('lunar.jpg')@window.event
def on_draw():window.clear()image.blit(0, 0)pyglet.app.run()

祝大家新年快乐,龙行龘龘!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/464203.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Debezium发布历史120

原文地址&#xff1a; https://debezium.io/blog/2022/04/07/read-only-incremental-snapshots/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. Read-only Incremental Snapshots for MySQL April 7, 2022 by K…

【数学建模】【2024年】【第40届】【MCM/ICM】【B题 搜寻潜水器】【解题思路】

一、题目 &#xff08;一&#xff09;赛题原文 2024 MCM Problem A: Resource Availability and Sex Ratios Maritime Cruises Mini-Submarines (MCMS), a company based in Greece, builds submersibles capable of carrying humans to the deepest parts of the ocean. A …

Netty应用(一) 之 NIO概念 基本编程

目录 第一章 概念引入 1.分布式概念引入 第二章 Netty基础 - NIO 1.引言 1.1 什么是Netty&#xff1f; 1.2 为什么要学习Netty&#xff1f; 2.NIO编程 2.1 传统网络通信中开发方式及问题&#xff08;BIO&#xff09; 2.1.1 多线程版网络编程 2.1.2 线程池版的网络编程…

腾讯云4核8G服务器多少钱?轻量和CVM报价2024新版

腾讯云4核8G服务器S5和轻量应用服务器优惠价格表&#xff0c;轻量应用服务器和CVM云服务器均有活动&#xff0c;云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元&#xff0c;5年6490.44元&#xff0c;标准型SA2服务器1444.8元一年&#xff0c;轻量应用服务器4核8G12M带宽一…

网络扫描神器:Nmap 保姆级教程(附链接)

一、介绍 Nmap&#xff08;Network Mapper&#xff09;是一款用于网络发现和安全审计的开源工具。它最初由 Gordon Lyon&#xff08;也被称为 Fyodor Vaskovich&#xff09;开发&#xff0c;是一款功能强大且广泛使用的网络扫描工具。Nmap 允许用户在网络上执行主机发现、端口…

小程序-云开发 获取用户的openid等信息

说明介绍&#xff1a; 小程序云开发功能来获取用户的openid。 一般在我们需要用到用户登录的时候&#xff0c;通常是需要获取微信小程序的openid的&#xff0c;由于微信的限制&#xff0c;一般我们只能通过后台去调微信的接口&#xff0c;来授权获取&#xff0c;增加了后端开发…

第三百一十七回

文章目录 1. 概念介绍2. 实现方法2.1 hintText2.2 labelText2.3 controller 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何在输入框中处理光标"相关的内容&#xff0c;本章回中将介绍如何添加输入框默认值.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1.…

车载测试Vector工具——常见问题汇总

车载测试Vector工具——常见问题汇总 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何 消耗你的人和事,多看一眼都是你的…

无人机遥感技术应用分析,无人机遥感系统测绘技术详解

由于无人机具有机动快速、使用成本低、维护操作简单等技术特点,因此被作为一种理想的飞行平台广泛应用于军事和民用各个领域。尤其是进入二十一世纪以后,许多国家将无人机系统的研究、开发、应用置于优先发展的地位,体积小、重量轻、探测精度高的新型传感器的不断问世,也使无人…

结构体数组所有元素(1亿个元素)初始化为相同的值

一个结构体数组&#xff0c;有1亿个元素&#xff0c;每个元素都要初始化为相同的值&#xff0c;如果没有现成的语法直接支持这样的初始化操作&#xff0c;就得用for循环写&#xff0c;会不会非常耗时&#xff1f; 如果结构体里的成员都是一些简单的基本数据类型&#xff0c;整…

CodeWave学习笔记--博物馆预约管理系统

场馆信息管理页面搭建&#xff08;PC&#xff09; 首先是场馆实体的创建 页面的搭建 在总览界面下创建子界面venueManage界面 现在总览页中实现跳转场馆管理子界面 设计场馆管理界面 效果 访客预约申请页面搭建&#xff08;H5&#xff09; 添加H5端&#xff0c;点击确认即可 …

动态扩缩容下的全局流水号设计

关于全局流水号&#xff0c;业内用的比较多的就是雪花算法&#xff0c;一直没理解在动态扩缩容下其中的workId和 datacenterId如何设置&#xff0c;查到了几个方法&#xff1a;reidis中取&#xff0c;待后期实践下。 先简单的介绍一下雪花算法&#xff0c;雪花算法生成的Id由…