2012-05-26 265 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