2012-05-26 172 views
0

我正在制作一款游戏,在这里你是一艘逃避即将到来的流星的航天飞机,这是我的第一个Python程序,我真的很难与音乐部分斗争:想法是只使用wxPythonpyGame被禁止)。Python中的背景音乐

目前我以某种方式设法让音乐播放,当你点击一个按钮,但我无法控制宇宙飞船了。

我不完全理解发生了什么,我一直在寻找没有答案的日子。

class Board(wx.Panel): 
BoardWidth = 5 
BoardHeight = 12 
Speed = 50 
ID_TIMER = 1 

def __init__(self,parent): 
    wx.Panel.__init__(self,parent) 

    self.timer = wx.Timer(self, Board.ID_TIMER) 

    self.Bind(wx.EVT_PAINT, self.OnPaint) 
    self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) 
    self.Bind(wx.EVT_TIMER, self.OnTimer, id=Board.ID_TIMER) 
    self.ClearBoard() 

    self.music = wx.Panel(self) 
    button = wx.Button(self, label="Play") 
    self.music=wx.media.MediaCtrl(self.music, -1, "game.mp3") 
    button.Bind(wx.EVT_BUTTON, self.play) 

def play(self,event): 
    self.music.Play() 

就我而言,我该如何想象它应该工作,但它并不:

#... 
    self.music=wx.media.MediaCtrl(self, -1, "game.mp3") 
    self.Bind(wx.media.EVT_MEDIA_LOADED, self.play) 

def play(self,event): 
    self.music.Play() 
+0

谁在乎呢?但是,没有,学期计划,这是我的纯粹奖金,pyGame仍然被禁止,因为它太容易了;) – Nurgak

回答

2

您可以使用一个线程来播放音乐。现在你的画面在等待音乐完成时冻结,这当然不会发生,因为它是背景音乐。
有一个奇怪的错误,事件永远不会生成。为了解决这个问题,添加szBackend=wx.media.MEDIABACKEND_WMP10(见下面的代码)

尝试:

import threading 
#... 

self.music=wx.media.MediaCtrl(self.music, -1, "game.mp3", 
           szBackend=wx.media.MEDIABACKEND_WMP10)  

#... 
def play(self, event): 
    threading.Thread(target=self.music.Play).start() 

或者,你可以使用计时器来等待文件被加载:

def __init__(self, parent): 
    #... 
    self.play() 

def play(self): 
    threading.Timer(0.5, self.music.Play).start() 
+1

不要使用'thread'模块。使用更高级的['thrading'](http://docs.python.org/library/threading)模块。 – mata

+0

+1你是对的,我编辑了答案。我必须承认,我不太了解python中的线程,我最初是从http://wiki.wxpython.org/LongRunningTasks得到的,而且看起来并没有太多。感谢你,我也自己也学到了一些东西。 :) – BrtH

+0

仍然不工作,我得到移动我的太空飞船,但仍然没有音乐。 – Nurgak