アプリケーションの外部Event
からpygamesイベントキューに魔法のように入れることはできません。
このようなことをしたい場合は、何らかのIPCまたはネットワークを使用する必要があります。
簡単な方法は、たとえばUDPを使用することです。
このクラスはUDPメッセージに応答し、イベントをpygame
のイベントキューに入れます。
import socket
import pygame
pygame.init()
class UdpToPygame():
def __init__(self):
UDP_IP="127.0.0.1"
UDP_PORT=15006
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.sock.setblocking(0)
self.sock.bind((UDP_IP,UDP_PORT))
def update(self):
try:
data, addr = self.sock.recvfrom(1024)
ev = pygame.event.Event(pygame.USEREVENT, {'data': data, 'addr': addr})
pygame.event.post(ev)
except socket.error:
pass
アプリケーションでは、pygame
そのクラスのインスタンスを作成update
し、メインループでメソッドを呼び出します。
カスタムイベントに応答するサンプルアプリケーションはUdpToPygame
、キューに入れられます。
def main():
dispatcher = UdpToPygame()
screen = pygame.display.set_mode((800, 600))
l = 0
r = True
while r:
for ev in pygame.event.get():
if ev.type == pygame.QUIT:
r = False
if ev.type == pygame.USEREVENT:
t = pygame.font.SysFont('', 40).render(ev.data, True, (255,255,255))
screen.blit(t, (0, l*20))
l += 1
dispatcher.update()
pygame.display.flip()
if __name__ == "__main__":
main()
これを実行し、Pythonインタープリターを起動して、実行中のpygameアプリケーションにテキストを直接送信します。
>>> import socket
>>> sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>>> while True:
... sock.sendto(raw_input(), ("127.0.0.1", 15006))
...
hallo
5
pygame....
10
編集:
あなたのエラーについてpygame.error: video system not initialized
:
pygameをで初期化したことを確認してくださいpygame.init()
。