Raspberry Pi で pygame


「Raspberry Pi で framebuffer で遊ぶ」
https://qiita.com/nanbuwks/items/71062ada859846ec89eb
では、 fbi コマンドを使って簡単に framebuffer の描画を行いました。
ちらつきが激しいので、
別のやり方をすることにしました。

今回は python のライブラリ pygame を使ってみます。



# 環境

- Raspberry Pi 3B
- Raspberry Pi OS Lite (2024-07-04-raspios-bookworm-armhf-lite.img.xz)

# pygame のインストール

```
 $ sudo apt install python3-pygame
```

または、 pip から無理やりシステムにインストール

```
$ sudo pip3 install --break-system-package pygame
```
どちらも同じように動作しました。

:::note
pip でインストールする場合、RaspberryPi で pip をインストール
「https://qiita.com/nanbuwks/items/315f4281cbad51c73510」
のようにして、pip をインストールしておきます。
:::


# サンプルプログラム
```
#!/usr/bin/python
# -*- coding: utf-8 -*-

import os
from os import environ
environ['PYGAME_HIDE_SUPPORT_PROMPT'] = '1'
import pygame
from time import sleep

# os.putenv('SDL_FBDEV', '/dev/fb0')
os.putenv('XDG_RUNTIME_DIR', os.getenv('HOME')+"/.cache/xdgr")
pygame.init()

display = pygame.display.set_mode((800,480))
display.fill((255,0,0))
for i in range(480):
  pygame.draw.line(display, (0, i % 255 , 255), (i, i), (800-i, i), 2)
  pygame.display.update()

# pygame.draw.line(lcd, (30,80,200),[0,270],[0,319],2);
pygame.display.update()
sleep(2)
```


`# os.putenv('SDL_FBDEV', '/dev/fb0')`

は、ssh で実行する時に必要かなと思ったのですが、無くても描画できました。

# エラーの対処などの Tips

## 警告を抑制する
```
<frozen importlib._bootstrap>:241: RuntimeWarning: Your system is neon capable but pygame was not built with support for it. The performance of some of your blits could be adversely affected. Consider enabling compile time detection with environment variables like PYGAME_DETECT_AVX2=1 if you are compiling without cross compilation.
```
と出てくる。

これは実行時に python3 -W ignore ac.py とすることで表示しなくした。


## pygame の Helloメッセージが表示される

```
pygame 2.6.0 (SDL 2.26.5, Python 3.11.2)
Hello from the pygame community. https://www.pygame.org/contribute.html
```
と出てくる。これは
```
from os import environ
environ['PYGAME_HIDE_SUPPORT_PROMPT'] = '1'
```
で抑制しています。

何故か os.putenv では効きませんでした。




## MESA--LOADER: failed to open ... エラー


```
pygame 2.1.2 (SDL 2.26.5, Python 3.11.2)
Hello from the pygame community. https://www.pygame.org/contribute.html
error: XDG_RUNTIME_DIR is invalid or not set in the environment.
MESA-LOADER: failed to open vc4: /usr/lib/dri/vc4_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/arm-linux-gnueabihf/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
MESA-LOADER: failed to open zink: /usr/lib/dri/zink_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/arm-linux-gnueabihf/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
MESA-LOADER: failed to open kms_swrast: /usr/lib/dri/kms_swrast_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/arm-linux-gnueabihf/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
MESA-LOADER: failed to open swrast: /usr/lib/dri/swrast_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/arm-linux-gnueabihf/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
Traceback (most recent call last):
  File "/home/pi/./pg.py", line 11, in <module>
    lcd = pygame.display.set_mode((480, 320)) 
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pygame.error: EGL not initialized

```
以下で対処
```
$ sudo apt install libgl1-mesa-dri
```

## pygame.error: EGL not initialized

```
<frozen importlib._bootstrap>:241: RuntimeWarning: Your system is neon capable but pygame was not built with support for it. The performance of some of your blits could be adversely affected. Consider enabling compile time detection with environment variables like PYGAME_DETECT_AVX2=1 if you are compiling without cross compilation.
pygame 2.6.0 (SDL 2.26.5, Python 3.11.2)
Hello from the pygame community. https://www.pygame.org/contribute.html
error: XDG_RUNTIME_DIR is invalid or not set in the environment.
Traceback (most recent call last):
  File "/home/pi/./pg.py", line 11, in <module>
    lcd = pygame.display.set_mode((480, 320)) 
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pygame.error: EGL not initialized
```
以下で対処

```
$ sudo apt install libegl-dev
```

## error: XDG_RUNTIME_DIR is invalid or not set in the environment.

sudo で実行した時に以下の表示が出ました。エラーが出るだけで実行には問題なかったです。

以下の一文を入れると解消。

`os.putenv('XDG_RUNTIME_DIR', os.getenv('HOME')+"/.cache/xdgr")`

しかしながら /etc/rc.local に入れて起動するとエラー。

`TypeError: expected str, bytes or os.PathLike object, not NoneType `

これは /etc/rc.local で起動すると HOME 環境変数が設定されていないことによるようです。

仕方がないので

`os.putenv('XDG_RUNTIME_DIR', "/tmp/.cache/xdgr")`

としてごまかしています。

# kill できない

このプログラムが起動していると、システムシャットダウンが妨げられます。
kill -HUP だと殺せるけど、kill だけだと死なない。
処理途中に以下を入れて対処。
```
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      pygame.quit()
      sys.exit()

```