Pygame和多处理的Python帮助

Pygame和多处理的Python帮助,python,audio,multiprocessing,pygame,Python,Audio,Multiprocessing,Pygame,我使用pygame将一个图像blit到屏幕上,同时它执行主循环。我正在对线程使用多处理,但似乎存在一个问题。请不要对那些奇怪的想要的xml注释唠叨我,因为我对这方面还不太熟悉 这是我的密码 #Import libraries import pygame import os, sys import multiprocessing as threading import time from pygame.locals import * pygame.init() screen = pygame.di

我使用pygame将一个图像blit到屏幕上,同时它执行主循环。我正在对线程使用多处理,但似乎存在一个问题。请不要对那些奇怪的想要的xml注释唠叨我,因为我对这方面还不太熟悉

这是我的密码

#Import libraries
import pygame
import os, sys
import multiprocessing as threading
import time
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((1400,900), FULLSCREEN)
class loader:
    def sound(name):
        load = os.path.join("data", name)
        sound = pygame.mixer.Sound(load)
        return sound

    def song(name):
        load = os.path.join('data', name)
        song = pygame.mixer.Sound(load)
        return song

    def picture(name):
        load = os.path.join("data", name)
        image = pygame.image.load(load)
        image = image.convert()
        return image
    def movie(name):
        load = os.path.join("data", name + ".mpg")
        movie = pygame.movie.Movie(name)
        return movie











class data():
    class movies():
        #Turns out it's not supported D:
        pass
    class songs():
        theme = loader.song("theme.ogg")
    class sounds():
        fctune = loader.sound("fctune.wav")
    class pictures():
        fc = loader.picture("fc_opaque.tga")


#------------------------Logics-------------------------

def showlogo():
    screen.blit(data.pictures.fc, (0,0))
    data.sounds.fctune.play()
    time.sleep(30)



def startloops():
    logo = threading.Process(target=showlogo, args=())
    gameloop = threading.Process(target=mainloop, args=())
    logo.start()
    logo.join(None)
    gameloop.start()
    gameloop.join(None)

def mainloop():
    while 1:
        clock.tick(30)
        pygame.display.flip()
        for event in pygame.event.get():
            if event.type == QUIT:
                return
            elif event.type == KEYDOWN and event.key == K_ESCAPE:
                sys.exit(1)
            elif event.type == MOUSEBUTTONDOWN:
                pass
            elif event.type is MOUSEBUTTONUP:
                pass
            #End of looper.


#-----------------------/Logics-------------------------



#----------------------Globals--------------------------

clock = pygame.time.Clock() 
#----------------------/Globals-------------------------


if __name__ == "__main__": startloops()
它所做的是创建2个pygame窗口。。(你打电话的时候应该有一个人出现

screen = pygame.display.set_mode((1400,900), FULLSCREEN)
所以很明显,它叫了两次。
嗯,多处理似乎是罪魁祸首。有人能帮忙吗?

我认为正在发生的事情就是这样。基本上,
多处理
模块的工作原理是将
目标
所需的所有内容的副本发送给一个全新的解释器;这就是它如何避开问题的。但这意味着副作用(对全局变量的更改,对传入但未返回的对象的更改)未按预期传播。下面是一个简单的示例:

>>> import multiprocessing
>>> d = {'a':5, 'b':6}
>>> def alter_d():
...     d['a'] = 7
...     print d
... 
>>> p = multiprocessing(target=alter_d)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'module' object is not callable
>>> p = multiprocessing.Process(target=alter_d)
>>> p.start()
>>> {'a': 7, 'b': 6}

>>> d
{'a': 5, 'b': 6}
导入多处理 >>>d={'a':5,'b':6} >>>def alter_d(): …d['a']=7 …打印d ... >>>p=多处理(目标=更改) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:“模块”对象不可调用 >>>p=多处理。处理(目标=更改) >>>p.开始() >>>{'a':7,'b':6} >>>d {'a':5,'b':6} 如您所见,传递给新流程的
d
版本已被更改。但是
d
的本地版本保持不变

现在我对pygame的内部结构一无所知。但我猜,当你使用
logo=threading.process(target=showlogo,args=())
创建一个新进程时,它会复制
screen
。然后,当复制完成时,或者当
screen.blit(data.pictures.fc,(0,0))
在新流程中被调用,将生成一个全新的屏幕

幸运的是,您现在使用多处理的方式完全没有意义。
join
只是停止主进程并等待子进程完成——根本没有并发。此外,我敢打赌pygame提供了您实际需要的任何线程功能——我怀疑您是否需要多处理好吧,我建议你把它扔了