因為播放MP3時,主程式會無法動作產生"沒有回應"的訊息,
所以想出解決方法是使用multiprocess多進程的方式,產生子進程來播放,
學習到原來使用子進程把它變成全域副程式:
def PlayStart(mp3):
mp3.play()
time.sleep(10)
mp3.stop()
主呼叫程序:
def OnPlay(self, event):
'''Play MP3'''
global mp3
plfileid = self.playlist.GetItem(event.m_itemIndex,0).GetText() # Download file ID
filename = r'F:/Test/' + plfileid
mp3 = mp3play.load(filename)
try:
p = Process(target=PlayStart, args=(mp3,))
p.start()
p.join
except:
print 'error!!'
結果發生了Error:
File "F:\Python27\lib\pickle.py", line 880, in load_eof
raise EOFError
EOFError
Exception AttributeError: "'AudioClip' object has no attribute '_mci'" in <bound method AudioClip.__del__ of <mp3play.windows.AudioClip object at 0x0321F290>> ignored
解決辦法尋找中...
因為太少人使用mp3play這個套件,所以上網找不到相關資訊,
看來只好重回pymedia的懷抱,看了一長串官方範例及他人範例後
http://pymedia.org/tut/dump_wav.html
http://www.cnblogs.com/myqiao/archive/2011/08/07/2129777.html
寫出了利用子進程播放的成功程式,但播放出來後,即使關掉主程式也無法停止音樂,
看來還有下一步要忙...
Rudolf 學習之路
2012年4月26日 星期四
2012年4月21日 星期六
Python套件=>MP3播放器
找了幾個pymedia範例檔來看,但有些參數未說明總是難以理解,
在找的過程中找到網站
http://www.open-open.com/lib/view/open1325062469921.html
指出有人寫好mp3播放套件,官方網站
http://code.google.com/p/mp3play/
下載網站
http://pypi.python.org/pypi/mp3play/#downloads
下載了mp3play-0.1.15.zip (md5)套件,easy_install完,成功安裝,接下來寫程式測試。
的確可以使用(我是Windows 7系統)!! Good!!
在找的過程中找到網站
http://www.open-open.com/lib/view/open1325062469921.html
指出有人寫好mp3播放套件,官方網站
http://code.google.com/p/mp3play/
下載網站
http://pypi.python.org/pypi/mp3play/#downloads
下載了mp3play-0.1.15.zip (md5)套件,easy_install完,成功安裝,接下來寫程式測試。
的確可以使用(我是Windows 7系統)!! Good!!
2012年4月13日 星期五
安裝Pymedia所遇到的困難
要播放avi、mp3等音視訊檔,得安裝Pymedia這個Package,於是從官網抓
http://pymedia.org/
這次是抓pymedia-1.3.7.3.tar.gz這個版本,用命令提示字元run easy_install卻發現問題
根據http://zhidao.baidu.com/question/108857316回答顯示:
http://pymedia.org/
這次是抓pymedia-1.3.7.3.tar.gz這個版本,用命令提示字元run easy_install卻發現問題
根據http://zhidao.baidu.com/question/108857316回答顯示:
=======================================================
把模块放到python 目录下载 安装( setup.py )
他还会输出一些 path for ....
查找所需要的东西
如果是not found 还要安装 not found 的东西 =======================================================
所以先不論一些not found的訊息,按Y後竟出現
error: Setup script exited with error: Unable to find vcvarsall.bat
根據http://stackoverflow.com/questions/2272786/python-issueunable-to-find-vcvarsall-bat
=======================================================
You will need MSVC compiler or mingw32 to compile that, and also need MySQL Header files.
I've compiled once for MySQL1.2.3c1 for Python2.6, you could find it here.
========================================================
於是找了MSVC與mingw32大概的定義如下:
MSVC: Microsoft Visual Studio C++
Mingw32: 是一套以 Gnu gcc/egcs 計劃為基礎的編譯器,其可編譯出在 Win32 系統上執行的 ojbect code
出現新的錯誤 error: command 'gcc' failed with exit status 1...
後來終於找到問題好像是pymedia不支援Python2.7版本,只有非官方套件能解決這個問題!!
http://www.lfd.uci.edu/~gohlke/pythonlibs/
下載pymedia-1.3.7.3.win32-py2.7.exe後點兩下安裝,成功!!
所以先不論一些not found的訊息,按Y後竟出現
error: Setup script exited with error: Unable to find vcvarsall.bat
根據http://stackoverflow.com/questions/2272786/python-issueunable-to-find-vcvarsall-bat
=======================================================
You will need MSVC compiler or mingw32 to compile that, and also need MySQL Header files.
I've compiled once for MySQL1.2.3c1 for Python2.6, you could find it here.
========================================================
於是找了MSVC與mingw32大概的定義如下:
MSVC: Microsoft Visual Studio C++
Mingw32: 是一套以 Gnu gcc/egcs 計劃為基礎的編譯器,其可編譯出在 Win32 系統上執行的 ojbect code
看似Mingw32好像比較少見,找檔案來安裝看看,下列網址
使用mingw-get-inst-20111118.exe (591.9 kB)版本,因為不知道安裝哪一個,所以框框全打勾
跑完一長串的安裝過程後,按照
http://stackoverflow.com/questions/2817869/error-unable-to-find-vcvarsall-bat的指示,
結果還是出現錯誤:
error: command 'gcc' failed: No such file or directory ....
http://stackoverflow.com/questions/2817869/error-unable-to-find-vcvarsall-bat的指示,
結果還是出現錯誤:
error: command 'gcc' failed: No such file or directory ....
不小心忘記重開cmd.exe,再開啟一次輸入後
出現新的錯誤 error: command 'gcc' failed with exit status 1...
後來終於找到問題好像是pymedia不支援Python2.7版本,只有非官方套件能解決這個問題!!
http://www.lfd.uci.edu/~gohlke/pythonlibs/
下載pymedia-1.3.7.3.win32-py2.7.exe後點兩下安裝,成功!!
2012年2月20日 星期一
wxPython 學習筆記 事件 event
來源:http://www.wretch.cc/blog/DieWanger/10375486
http://docs.wxwidgets.org/trunk/classwx_list_event.html
wxPython 學習筆記 事件 event
當觸發條件滿足後,觸發的動作.
例如:按下右鍵後,開啟一個視窗
或是移動滑鼠並將滑鼠的座標顯示出來
在python中,事件event的運作是透過以下三個步驟來進行
1.給定觸發條件類型如 wx.EVT_SIZE, wx.EVT_CLOSE等
2.創造條件觸發後的要處理的觸發事件
3.將事件與條件綁定連結(Bind )在一起
Ex1. 創造一個視窗,當滑鼠進入視窗時,顯示進入訊息,當按左鍵時,顯示按鈕訊息
source:
import wx
class mouseEvent(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(400, 200))
self.Bind(wx.EVT_LEFT_DOWN, self.LEFT_DOWN)
self.Bind(wx.EVT_ENTER_WINDOW, self.enter)
self.Centre()
self.Show(True)
def LEFT_DOWN(self, event):
wx.StaticText(self,label=u"you click the left buttom",pos=(0,0))
def enter(self, event):
wx.StaticText(self,label=u"mouse enter the window",pos=(0,30))
app = wx.App()
mouseEvent(None, -1, 'mouse motion')
app.MainLoop()
淡藍色區域的self.Bind(wx.EVT_LEFT_DOWN, self.LEFT_DOWN) 是將按滑鼠左鍵,跟觸發後的執行程式LEFT_DOWN綁定在一起.淡藍色區域的def LEFT_DOWN(self, event):是定義這個觸發事件是將"you click the left buttom"顯示在螢幕淡綠色區域的self.Bind(wx.EVT_ENTER_WINDOW, self.enter) 是將滑鼠移入視窗,跟觸發後的執行程式enter綁定在一起.淡綠色區域的def enter(self, event):是定義這個觸發事件是將"mouse enter the window"顯示在螢幕
wxpython中常用的class
wx.EVT_LEFT_DOWN 按左鍵
wx.EVT_LEFT_UP 放左鍵
wx.EVT_LEFT_DCLICK 雙擊左鍵
wx.EVT_MIDDLE_DOWN 按滾輪鍵 (大概吧 我沒玩過)
wx.EVT_MIDDLE_UP 放滾輪鍵
wx.EVT_MIDDLE_DCLICK 雙擊滾輪鍵
wx.EVT_RIGHT_DOWN 按右鍵
wx.EVT_RIGHT_UP 放右鍵鍵
wx.EVT_RIGHT_DCLICK 雙擊右鍵
wx.EVT_MOTION 移動滑鼠
wx.EVT_ENTER_WINDOW 滑鼠移入視窗
wx.EVT_LEAVE_WINDOW 滑鼠移出視窗wx.EVT_MOUSEWHEEL 滑鼠滾輪紐
wx.EVT_MOUSE_EVENTS (不清楚,大概只要有動作就觸發吧)wx.EVT_SIZE 當視窗大小改變時觸發事件
wx.EVT_MOVE 當視窗位置改變時觸發事件
wx.EVT_CLOSE 當框架frame被請關閉時觸發事件wx.EVT_PAINT 當只要視窗有部份被重畫時觸發事件
wx.EVT_CHAR 當視窗被選取時,送出一個字元?(when the window has the focus)wx.EVT_IDLE 當沒有其他事件被觸發時,週期性的觸發事件wx.EVT_SCROLL 當視窗捲軸被超作時觸發事件wx.EVT_BUTTON 當按鈕被按下去時,觸發事件wx.EVT_MENU 當選單裡的物件被選擇時,觸發事件
http://docs.wxwidgets.org/trunk/classwx_list_event.html
wxPython 學習筆記 事件 event
當觸發條件滿足後,觸發的動作.
例如:按下右鍵後,開啟一個視窗
或是移動滑鼠並將滑鼠的座標顯示出來
在python中,事件event的運作是透過以下三個步驟來進行
1.給定觸發條件類型如 wx.EVT_SIZE, wx.EVT_CLOSE等
2.創造條件觸發後的要處理的觸發事件
3.將事件與條件綁定連結(Bind )在一起
Ex1. 創造一個視窗,當滑鼠進入視窗時,顯示進入訊息,當按左鍵時,顯示按鈕訊息
source:
import wx
class mouseEvent(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(400, 200))
self.Bind(wx.EVT_LEFT_DOWN, self.LEFT_DOWN)
self.Bind(wx.EVT_ENTER_WINDOW, self.enter)
self.Centre()
self.Show(True)
def LEFT_DOWN(self, event):
wx.StaticText(self,label=u"you click the left buttom",pos=(0,0))
def enter(self, event):
wx.StaticText(self,label=u"mouse enter the window",pos=(0,30))
app = wx.App()
mouseEvent(None, -1, 'mouse motion')
app.MainLoop()
淡藍色區域的self.Bind(wx.EVT_LEFT_DOWN, self.LEFT_DOWN) 是將按滑鼠左鍵,跟觸發後的執行程式LEFT_DOWN綁定在一起.淡藍色區域的def LEFT_DOWN(self, event):是定義這個觸發事件是將"you click the left buttom"顯示在螢幕淡綠色區域的self.Bind(wx.EVT_ENTER_WINDOW, self.enter) 是將滑鼠移入視窗,跟觸發後的執行程式enter綁定在一起.淡綠色區域的def enter(self, event):是定義這個觸發事件是將"mouse enter the window"顯示在螢幕
wxpython中常用的class
wx.EVT_LEFT_DOWN 按左鍵
wx.EVT_LEFT_UP 放左鍵
wx.EVT_LEFT_DCLICK 雙擊左鍵
wx.EVT_MIDDLE_DOWN 按滾輪鍵 (大概吧 我沒玩過)
wx.EVT_MIDDLE_UP 放滾輪鍵
wx.EVT_MIDDLE_DCLICK 雙擊滾輪鍵
wx.EVT_RIGHT_DOWN 按右鍵
wx.EVT_RIGHT_UP 放右鍵鍵
wx.EVT_RIGHT_DCLICK 雙擊右鍵
wx.EVT_MOTION 移動滑鼠
wx.EVT_ENTER_WINDOW 滑鼠移入視窗
wx.EVT_LEAVE_WINDOW 滑鼠移出視窗wx.EVT_MOUSEWHEEL 滑鼠滾輪紐
wx.EVT_MOUSE_EVENTS (不清楚,大概只要有動作就觸發吧)wx.EVT_SIZE 當視窗大小改變時觸發事件
wx.EVT_MOVE 當視窗位置改變時觸發事件
wx.EVT_CLOSE 當框架frame被請關閉時觸發事件wx.EVT_PAINT 當只要視窗有部份被重畫時觸發事件
wx.EVT_CHAR 當視窗被選取時,送出一個字元?(when the window has the focus)wx.EVT_IDLE 當沒有其他事件被觸發時,週期性的觸發事件wx.EVT_SCROLL 當視窗捲軸被超作時觸發事件wx.EVT_BUTTON 當按鈕被按下去時,觸發事件wx.EVT_MENU 當選單裡的物件被選擇時,觸發事件
2012年2月14日 星期二
什麼是__init__() ?
Python 使用 class 敘述來定義一個類別,而由呼叫某一類別名稱 (類似函式的呼叫方式) 而建立的新物件,被稱為該類別的一個「個體」(instance)
個體物件的設定值,可由 __init__ 這個起始函式自動完成,通常 __init__ 又被稱為類別的「建構子」(constructor)。每次有新的個體物件被建立,都會找尋 __init__ 的設定內容,自動完成新個體物件的起始設定值。
class Circle:
def __init__(self, r=1):
self.radius = r
def area(self):
return self.radius * self.radius * 3.14159
c = Circle(5)
print c.area()
上述則是另一個改進版本的 Circle 類別內容設定,增加預設變數 r,並指定其預設值為 1。如此一來,我們便可透過 Circle(5) 這樣的方式來指定新個體的建立。
個體物件的設定值,可由 __init__ 這個起始函式自動完成,通常 __init__ 又被稱為類別的「建構子」(constructor)。每次有新的個體物件被建立,都會找尋 __init__ 的設定內容,自動完成新個體物件的起始設定值。
class Circle: Œ
def __init__(self): Œ
self.radius = 1 Œ
def area(self):
return self.radius * self.radius * 3.14159
myCircle = Circle()
print 2 * 3.14 * myCircle.radius
myCircle.radius = 5 Ž
print 2 * 3.14 * myCircle.radius Ž
print myCircle.area()
Œ 類別 Circle 裡有個 __init__() 函式,設定其 radius 值為 1。
注意到 self 這個參數,慣例上它就是 __init__() 函式的第一個參數,
當 __init__ 起始設定時,self 就會被設定為新建立的個體上。
新個體物件建立後,有自己的個體變數 (instance variables),如 radius 即為一例。
Ž 個體變數的值可以重新設定。
可以為個體物件設定物件方法 (method),其方式就像定義函式一般。
================================================================
class Circle:
def __init__(self, r=1):
self.radius = r
def area(self):
return self.radius * self.radius * 3.14159
c = Circle(5)
print c.area()
上述則是另一個改進版本的 Circle 類別內容設定,增加預設變數 r,並指定其預設值為 1。如此一來,我們便可透過 Circle(5) 這樣的方式來指定新個體的建立。
Python要self的理由
Python類別的方法和普通的函數有一個很明顯的區別,在類別的方法必須有個額外的第一個參數 ( self ),但在調用這個方法的時候不必為這個參數賦值 (顯勝於隱 的引發)。Python類別的方法的這個特別的參數指的是對象本身,而按照Python的慣例,它用self來表示。(當然我們也可以用其他任何名稱來代替,只是規範和標准在那建議我們一致使用self)
================================================
給C++/Java/C#程序員的註釋
Python中的self等價於C++中的self指針和Java、C#中的this參考。
================================================
Python中的self等價於C++中的self指針和Java、C#中的this參考。
================================================
為何Python給self賦值而你不必給self賦值?
例子說明:創建了一個類MyClass,實例化MyClass得到了MyObject這個對象,然後調用這個對象的方法
MyObject.method(arg1,arg2) ,
這個過程中,Python會自動轉為
Myclass.mehod(MyObject,arg1, arg2)
這就是Python的self的原理了。即使你的類別方法不需要任何參數,但還是得給這個方法定義一個self參數,雖然我們在實例化調用的時候不用理會這個參數不用給它賦值。
實例:
class Python:def selfDemo(self):print 'Python,why self?'p = Python()p.selfDemo()
輸出:Python,why self?
把p.selfDemo()帶個參數如:p.selfDemo(p),得到同樣的輸出結果
如果把self去掉的話,
class Python:def selfDemo():print 'Python,why self?'p = Python()p.selfDemo()
這樣就報錯了:TypeError: selfDemo() takes no arguments (1 given)
擴展
self在Python裡不是關鍵字。self代表當前對象的地址。self能避免非限定調用造成的全局變量。
在Python3之後不知道將self隱了沒?感覺在Python類裡的方法都要帶個self這樣有點死板
Pydev unresolved import errors
For those seeing a lot of Pydev unresolved import errors the problem is related to the fact that pydev doesn’t seem to register nested modules.
So if your package contains a package which contains a module, unless the parents of both packages appears on the Pythonpath, pydev will hit you with an unresolved import error.
To make it go away you have 2 choices:
1. Add the parent to the python path
2. Click Ctl + 1 and select Unresolved import error
1. Add the parent to the python path
2. Click Ctl + 1 and select Unresolved import error
訂閱:
意見 (Atom)


