使用多处理创建两个 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()