问题描述
我正在尝试使用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()