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镜像为例):

broken

默认是使用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. 测试代码一

测试代码如下:

配套代码 io/lcd/lcd_test1.py文件内容
 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显示屏的一个窗口上:

broken

6.3.1. 实验步骤

将配套代码 Lcd目录中的测试代码及测试图片,一并上传至开发板同一目录下:

# 在终端中输入如下命令,因为访问硬件注意sudo权限:
sudo python3 lcd_test1.py

6.4. 测试代码二

配套代码 io/lcd/lcd_test2.py文件内容
 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 教程