我想编写一个pygame程序,通过套接字连接从Raspberry Pi接收数据。但是,我只希望在字符串到达后立即运行Pygame代码。这涉及到代码等待一段时间,然后当从Raspberry Pi接收到字符串时,pygame运行代码以更新显示。 目前,我的Pygame在等待数据收入时冻结并关闭。 有任何想法吗。谢谢。
答案 0 :(得分:0)
Pygame“冻结”最有可能是由于网络通话被阻止。考虑旋转一个新线程来处理数据通信,而Pygame接管主线程并用一些“等待”消息更新显示。收到数据后,第二个线程应将其传递给将显示它的主线程。
答案 1 :(得分:0)
这里有两个问题。 @Josep Valls回答时,代码需要在子线程中进行套接字通信。另外,PyGame主线程需要不断轮询事件循环(并可能重新绘制屏幕)。显然,如果代码在每个循环中没有做任何事情,那么也许不必像下面的示例那样每次都重新绘制整个屏幕。
那么,处理与PyGame进行的套接字通信需要什么?首先,您需要在套接字上侦听以接受连接。在示例中,ConnectionHandlerThread
类正是这样做的。它侦听传入的客户端连接,一旦发生,它将创建一个ConversationHandlerThread
来为每个客户端进行读取/写入。 (如果您要处理很多套接字,也许您想为此使用一个线程池,但是我也试图将示例保持简单。)
因此,为了解释示例代码-它绘制了一个窗口,其中有两个AlienSprite
弹跳。客户端可以在端口5555
上连接它(例如,用telnet
)并发出命令。发送颜色字(红色/绿色/蓝色)会产生一种新的外星人颜色。 quit
命令断开连接。
要在套接字处理线程和PyGame主线程之间进行通信,套接字线程使用PyGame event.post()
发送事件。这些用户事件已在名为enum
的{{1}}中实现以跟踪它们。这样做的好处是,当两个线程都针对不同的事件类型发布NetworkEvents
时,您不会感到困惑。
pygame.USEREVENT + 27
对于此答案中的代码长度,我深表歉意,但我认为有必要正确演示适当的答案。省略枚举类型,或者套接字侦听器可能会阻碍学习价值。