使用多处理创建两个 pygame 屏幕
Creating two pygame screens using multiprocessing
我正在尝试使用 pygame 开发一个应用程序,我想创建一个弹出窗口 window。
我试图将它全部保存在一个文件中,所以我使用 multiprocessing
来完成这项任务。
我有两个 class,应用程序和弹出窗口 window。每个都在一个函数中,该函数创建 windows 并启动它们的两个循环。
这是一些简化的代码:
main.py
from multiprocessing import Process
def popup():
import pygame as pg
pg.init()
class PopUp:
def __init__(self):
self.screen = pg.display.set_mode((300,300))
def update(self):
pg.display.flip()
p = PopUp()
while True:
p.update()
def app():
import pygame as pg
pg.init()
class App:
def __init__(self):
self.screen = pg.display.set_mode((800,600))
self.create_popup()
def create_popup(self):
p = Process(target=popup)
p.start()
p.join()
def update(self):
pg.display.flip()
a = App()
while True:
a.update()
if __name__ == '__main__':
a = Process(target=app)
a.start()
a.join()
但是,当我执行这段代码时,只出现了一个window,和App的大小一样,然后调整到PopUp的大小,尽管它是一个不同的过程。
如果我这样做,那么两个单独的 windows 将毫无问题地出现。
为什么会发生这种情况,我怎样才能从应用 class 创建弹出窗口 window?
您在调用 pygame.init()
之后重复该过程。所以他们可能共享 window 句柄等
如果在 init()
之前复制该过程,则可以正常工作。
import multiprocessing
import pygame
import os
def handleUpdates( window, colour ):
""" Simple pygame message loop.
Paints the window in a single colour,
handles quit event """
clock = pygame.time.Clock()
exiting = False
while not exiting:
# Handle user-input
for event in pygame.event.get():
if ( event.type == pygame.QUIT ):
exiting = True
# draw the window
window.fill( colour )
pygame.display.flip()
# save CPU
clock.tick( 30 )
pygame.quit()
def pyGameWindow( name, window_pos, colour ):
""" Initialise PyGame for a new window """
os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % window_pos
pygame.init()
window = pygame.display.set_mode( ( 300, 300 ) )
pygame.display.set_caption( name )
handleUpdates( window, colour )
if __name__ == '__main__':
p1 = multiprocessing.Process(target=pyGameWindow, args=('Window One', ( 100, 100 ), (255, 0, 0 )))
p1.start()
p2 = multiprocessing.Process(target=pyGameWindow, args=('Window Two', ( 500, 100 ), (255, 255, 0 )))
p2.start()
p1.join()
p2.join()
我正在尝试使用 pygame 开发一个应用程序,我想创建一个弹出窗口 window。
我试图将它全部保存在一个文件中,所以我使用 multiprocessing
来完成这项任务。
我有两个 class,应用程序和弹出窗口 window。每个都在一个函数中,该函数创建 windows 并启动它们的两个循环。
这是一些简化的代码:
main.py
from multiprocessing import Process
def popup():
import pygame as pg
pg.init()
class PopUp:
def __init__(self):
self.screen = pg.display.set_mode((300,300))
def update(self):
pg.display.flip()
p = PopUp()
while True:
p.update()
def app():
import pygame as pg
pg.init()
class App:
def __init__(self):
self.screen = pg.display.set_mode((800,600))
self.create_popup()
def create_popup(self):
p = Process(target=popup)
p.start()
p.join()
def update(self):
pg.display.flip()
a = App()
while True:
a.update()
if __name__ == '__main__':
a = Process(target=app)
a.start()
a.join()
但是,当我执行这段代码时,只出现了一个window,和App的大小一样,然后调整到PopUp的大小,尽管它是一个不同的过程。
如果我这样做,那么两个单独的 windows 将毫无问题地出现。
为什么会发生这种情况,我怎样才能从应用 class 创建弹出窗口 window?
您在调用 pygame.init()
之后重复该过程。所以他们可能共享 window 句柄等
如果在 init()
之前复制该过程,则可以正常工作。
import multiprocessing
import pygame
import os
def handleUpdates( window, colour ):
""" Simple pygame message loop.
Paints the window in a single colour,
handles quit event """
clock = pygame.time.Clock()
exiting = False
while not exiting:
# Handle user-input
for event in pygame.event.get():
if ( event.type == pygame.QUIT ):
exiting = True
# draw the window
window.fill( colour )
pygame.display.flip()
# save CPU
clock.tick( 30 )
pygame.quit()
def pyGameWindow( name, window_pos, colour ):
""" Initialise PyGame for a new window """
os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % window_pos
pygame.init()
window = pygame.display.set_mode( ( 300, 300 ) )
pygame.display.set_caption( name )
handleUpdates( window, colour )
if __name__ == '__main__':
p1 = multiprocessing.Process(target=pyGameWindow, args=('Window One', ( 100, 100 ), (255, 0, 0 )))
p1.start()
p2 = multiprocessing.Process(target=pyGameWindow, args=('Window Two', ( 500, 100 ), (255, 255, 0 )))
p2.start()
p1.join()
p2.join()