使用多处理创建两个pygame屏幕

问题描述

我正在尝试使用pygame开发应用程序,并且想要创建一个弹出窗口。
我试图将所有内容保存在一个文件中,所以我正在使用multiprocessing来完成此任务。

我有两个类,即应用程序和弹出窗口。每个窗口都在一个函数中,该函数创建窗口并启动两个循环。

这是一些简化的代码

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()

但是,当我执行此代码时,只会显示一个窗口,具有应用程序的大小,然后将其调整为PopUp的大小,即使它是一个不同的过程。

如果我以其他方式这样做,那么将出现两个单独的窗口,完全没有问题。

为什么会发生这种情况,如何从应用程序类创建弹出窗口?

解决方法

您正在调用pygame.init()之后复制该过程。因此,很可能他们正在共享窗口句柄等。

如果该过程是在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 )))
    p1.start()
    p2 = multiprocessing.Process(target=pyGameWindow,args=('Window Two',( 500,255,0 )))
    p2.start()

    p1.join()
    p2.join()