Pygame 动画/事件循环与 flask-socketio
我正在做一个用树莓派驱动的拍照亭,用户可以通过手机上的网页界面来控制,这是我第一个树莓派项目。
这个拍照亭有一个内置显示屏,使用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 个回答
最后我没能找到答案,但我决定这么做。
我没有选择在照相亭上直接用像pygame这样的库来创建一个图形界面,因为那样涉及到很多复杂的线程问题。我决定在我的socketio应用中创建一个单独的路由,然后在树莓派上用一个专门的浏览器模式来加载这个路由。
我的想法是,用户可以通过他们的智能手机与照相亭互动(通过这个路由),然后这些互动会反馈到服务器(树莓派)上。服务器会处理这些互动,并通过不同的命名空间向本地的图形界面发送事件。
这些事件可以触发动画、过渡效果或者倒计时等在“本地图形界面”上显示。
唯一可能的问题是性能和动画的流畅度,因为这个界面需要一个浏览器在运行。另外,如果有多个用户同时连接到照相亭,也可能会出现问题(如果两个客户端同时尝试访问摄像头,可能会有硬件上的问题,但这又是另一个话题!)
祝好
安德鲁
有三个问题:
pygame.event.Event
的实例没有tpe
这个属性。我想你是想说:if (event.type is gui.INFOEVENT and event.type == client_connect):
- 一个 pygame 事件(或者其他任何 Python 对象)的类型属性不能同时指向
gui.INFOEVENT
和client_connect
,除非这两个值是一样的(这样第二个检查就没必要了)。 client_connect
这个变量在任何地方都没有声明。我想你是想说"client_connect"
。
不过,pygame 事件可以有任意的属性和它们关联,所以你可以通过把第二次使用的 event.type
(存储 client_connect 的那个)改成其他值来解决第二个问题。
注意:我对 socketio
不太熟悉