6. 屏幕显示-Pygame¶
我们的鲁班猫板卡上支持各种各样的显示设备,板卡上一般有HDMI接口、MIPI DSI接口。
6.1. Pygame库简介¶
Pygame是Python库中用于开发游戏的一种工具,或许这么说有点限制Pygame的用法。 Pygame不仅可以用于游戏开发,还可以用于显示处理,多媒体设备处理等等方面, 该库提供了许多多媒体、显示设备的操作功能。 其中的display模块,提供控制Pygame显示界面(display)的各种函数,本章将使用该模块进行屏幕显示。
6.2. 实验准备¶
6.2.1. 添加屏幕资源¶
# 在终端中输入如下命令,可以查看到显示设备资源:
cat@lubancat:~$ ls /dev/dri/card*
/dev/dri/card0 /dev/dri/card1
# 连接好屏幕,会有:
cat@lubancat:~/lcd$ ls /dev/fb*
/dev/fb0
板卡上的显示设备资源示例,仅供参考(以LubanCat 2,ubuntu镜像为例):
默认是使用rk3568-LubanCat 2.dtb设备树,通过创建软连接选择对应设备树:
#必须先切换到boot目录
cd /boot
#切换mipi屏幕的设备树
ln -sf dtb/rk3568-LubanCat 2-mipi.dtb rk-kernel.dtb
#重启开启使用mipi屏幕
sudo reboot
更多屏幕显示相关,参考下 《屏幕》 。
6.2.2. 硬件连接¶
硬件连接小节,需要大家根据自身开发环境等情况对本章内容进行参考调整, 这里实验是mipi屏(5.5寸)连接LubanCat 2板卡,板卡系统带桌面。
6.2.3. Pygame库安装¶
我们使用apt工具安装。
# 在终端中输入如下命令,安装Pygame库:
sudo apt -y install python3-pygame
# 如果之前安装过,就不需要重新安装
6.2.4. Pygame库使用¶
安装好对应的库之后,我们就可以利用安装好的Pygame库编写一下测试代码。
虽然显示驱动是DRM,但是驱动也实现了模拟FB设备,测试前我们可以简单使用下Linux Framebuffer, 在Pygame库利用Linux Framebuffer机制实现了调整显示设备的功能, Linux Framebuffer把屏幕上的每个点映射成一段线性内存空间, 程序可以简单的改变这段内存的值来改变屏幕上某一点的颜色。 以使用以下命令不断地往 /dev/fb0 写入随机数据,使得屏幕花屏。
# 在终端中输入如下命令测试:
cat /dev/urandom > /dev/fb0
更多使用参考下 《屏幕显示(framebuffer)》 。
6.3. 测试代码一¶
测试代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | """ 使用pygame进行屏幕显示测试 """
import os
import sys
import time
import pygame
# 设置系统环境,无鼠标
os.environ["SDL_NOMOUSE"] = "1"
# 初始化显示设备
pygame.display.init()
# 设置显示窗口的范围为屏幕大小,并返回一个屏幕对象
screen = pygame.display.set_mode((448,418))
# 设置窗口名称
pygame.display.set_caption("test")
# 使用pygame image模块加载图片
ball = pygame.image.load("test.png")
# 将图片按位拷贝到窗口
screen.blit(ball,(0,0))
# 刷新窗口
pygame.display.flip()
time.sleep(5)
sys.exit()
|
以上代码会将下图显示到mipi显示屏的一个窗口上:
6.3.1. 实验步骤¶
将配套代码 Lcd目录中的测试代码及测试图片,一并上传至开发板同一目录下:
# 在终端中输入如下命令,因为访问硬件注意sudo权限:
sudo python3 lcd_test1.py
6.4. 测试代码二¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | """ 使用pygame进行屏幕测试 """
import os
import sys
import time
import pygame
class PyScope:
""" 定义一个PyScope类,进行屏幕测试 """
screen = None
def __init__(self):
"PyScope类的初始化方法,使用framebuffer构造pygame会使用到的图像缓冲区"
# 设置系统环境为无鼠标模式
#os.environ["SDL_NOMOUSE"] = "1"
pygame.display.init()
# 创建,设置pygame使用的窗口大小
self.screen = pygame.display.set_mode((600,600))
#设置窗口标题
pygame.display.set_caption('lcd_test2.py')
# 填充背景色为灰色
self.screen.fill((156,156,156))
# 初始化字体库
pygame.font.init()
# 使用默认字体显示英文
font=pygame.font.Font(None,32)
text=font.render("Hello!",True,(255,255,255))
self.screen.blit(text,(100,100))
# 使用默认字体显示文字
text=font.render("Display Test!",True,(255,0,0))
self.screen.blit(text,(100,150))
# 更新屏幕内容
pygame.display.flip()
def __del__(self):
"退出pygame库的时候会调用该方法,可以在此添加资源释放操作"
pygame.display.quit()
def test(self):
while True:
# 循环获取事件,监听事件
for event in pygame.event.get():
# 判断用户鼠标是否点了关闭按钮
if event.type == pygame.QUIT:
#卸载所有模块
pygame.quit()
#终止程序
sys.exit()
#更新屏幕内容
#pygame.display.flip()
# 创建一个测试实例,开始测试
scope = PyScope()
# 调用scope类的测试方法
scope.test()
|
代码功能简单看下上面注释,在__init__方法中,会初始化窗口显示,最终该代码会在弹窗显示两行英文。
6.4.1. 实验步骤¶
将配套代码Lcd目录中的测试代码上传至开发板任一目录下:
# 在终端中输入如下命令:
sudo python3 lcd_test2.py
命令执行后系统桌面会弹窗显示,鼠标点击或者关闭程序,可以关闭窗口。
6.5. 参考¶
本章没有详细介绍display模块基本函数使用,关于更多Pygame display模块函数等,可参考 Pygame display 。
关于Python Pygame库的使用,可参考 Pygame 教程 。