Pygame 动画/事件循环与 flask-socketio

1 投票
2 回答
1135 浏览
提问于 2025-04-18 11:36

我正在做一个用树莓派驱动的拍照亭,用户可以通过手机上的网页界面来控制,这是我第一个树莓派项目。

这个拍照亭有一个内置显示屏,使用pygame来提供动画指导和拍照倒计时。它还用flask-socketio(http://flask-socketio.readthedocs.org/en/latest/)来处理用户通过手机发送的连接和输入事件。

因为pygame需要在应用的主线程上运行,socketio也是如此,所以我遇到的问题是,当我在显示pygame视图时,socketio就无法正常工作。

我最开始的想法是让socketio事件创建一个事件,像这样:

@socketio.on('connect', namespace'/photo')
def client_connect():
    evnt = pygame.event.Event(gui.INFOEVENT, msg="client_connect")
    pygame.event.post(evnt)

然后在pygame线程中捕捉这个事件:

running = True
while running:
    for event in pygame.event.get():
        if (event.type is gui.INFOEVENT and event.msg == "client_connect"):
           # welcome client on photobooth screen and start guide

注意:我没有检查这个语法,可能是错的。

有没有人知道我该怎么做?如果可以的话,我的想法算是有点道理吗?

我在理解线程和队列方面遇到了一些困难,虽然我学到了很多,但这个“有趣”的项目让我慢慢感到疲惫!非常感谢任何帮助。

-安德鲁

2 个回答

0

最后我没能找到答案,但我决定这么做。

我没有选择在照相亭上直接用像pygame这样的库来创建一个图形界面,因为那样涉及到很多复杂的线程问题。我决定在我的socketio应用中创建一个单独的路由,然后在树莓派上用一个专门的浏览器模式来加载这个路由。

我的想法是,用户可以通过他们的智能手机与照相亭互动(通过这个路由),然后这些互动会反馈到服务器(树莓派)上。服务器会处理这些互动,并通过不同的命名空间向本地的图形界面发送事件。

这些事件可以触发动画、过渡效果或者倒计时等在“本地图形界面”上显示。

唯一可能的问题是性能和动画的流畅度,因为这个界面需要一个浏览器在运行。另外,如果有多个用户同时连接到照相亭,也可能会出现问题(如果两个客户端同时尝试访问摄像头,可能会有硬件上的问题,但这又是另一个话题!)

祝好

安德鲁

1

有三个问题:

  1. pygame.event.Event 的实例没有 tpe 这个属性。我想你是想说:

    if (event.type is gui.INFOEVENT and event.type == client_connect):
    
  2. 一个 pygame 事件(或者其他任何 Python 对象)的类型属性不能同时指向 gui.INFOEVENTclient_connect,除非这两个值是一样的(这样第二个检查就没必要了)。
  3. client_connect 这个变量在任何地方都没有声明。我想你是想说 "client_connect"

不过,pygame 事件可以有任意的属性和它们关联,所以你可以通过把第二次使用的 event.type(存储 client_connect 的那个)改成其他值来解决第二个问题。

注意:我对 socketio 不太熟悉

撰写回答