下面是我的代码:
import wx
from wx.lib.activexwrapper import MakeActiveXClass
import win32com.client.gencache as win32
mediaControl = win32.EnsureModule('{6BF52A50-394A-11D3-B153-00C04F79FAA6}',0,1,0)
print dir(mediaControl)
if mediaControl is None:
raise ImportError("Can't load wmp. Make sure you have wmp installed.")
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self,None,-1,'MediaPlayer',(50,50),(800,600))#初始化一个窗口
p=wx.Panel(self)
ActiveXWrapper =MakeActiveXClass(mediaControl.WindowsMediaPlayer)
self.med = ActiveXWrapper(p,-1)
if __name__=="__main__":
app=wx.PySimpleApp()
media1=MyFrame()
media1.Show()
app.MainLoop()
运行结果:
Traceback (most recent call last):
File "D:\JQC\Python\IDE\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py", line 310, in RunScript
exec codeObject in __main__.__dict__
File "D:\pyhtontest\Mymedia_client_3.py", line 58, in ?
media1=MyFrame()
File "D:\pyhtontest\Mymedia_client_3.py", line 25, in __init__
self.med = ActiveXWrapper(p,-1)
File "D:\JQC\Python\IDE\lib\site-packages\wx-2.8-msw-unicode\wx\lib\activexwrapper.py", line 119, in axw__init__
(0, 0, sz.width, sz.height), self._wnd, ID)
File "D:\JQC\Python\IDE\Lib\site-packages\pythonwin\pywin\mfc\activex.py", line 23, in CreateControl
self.__dict__["_obj_"] = win32ui.CreateControl(clsid, windowTitle, style, rect, parent, id, None, False, lic_string)
win32ui: The window can not be created as it has an invalid handle
同样方法用在别的控件上不会出错,我还试过日历控件,Quicktime,realplayer(结果嵌入的是音频的)
我试过别的方法嵌入media player控件,比如用wx.media.MediaCtrl,这可能是最简单的方法了,但是只能载入WMP6.4的,6.4在连接http服务器播放流媒体时会出错。
window有的都有,举例的话,有输入框,单选框,多选框,html文本,进度条等等。。。还可以自定义组件,wxpython可以做大部分界面,但是注意的是,如果涉及动画的东西,就最好不要选择这个东西了,做起来比较伤感,还有皮肤切换,什么的,因为没有相应封装的比较高端的组件,需要自己人工手写wxDirPickerCtrl的evt处理函数中,给wxListCtrl控件发一个事件消息,在wxListCtrl的对应事件处理函数中去响应,然后添加选择的目录路径到list中去,看起来才是结构比较合理的。所以压根没有想到这么去做。我刚才试了试感觉也没有显示出来,部分处理贴出来,请指点一下。
wxFormBuilder生成的UI代码,部分节选:
class FsFrameBase ( wx.Frame ):
def __init__( self, parent ):
。。。 。。。
self.m_listCtrl_DirList = wx.ListCtrl( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LC_NO_HEADER|wx.LC_REPORT )
。。。 。。。
self.m_dirPicker_DirChoise = wx.DirPickerCtrl( self, wx.ID_ANY, wx.EmptyString, u"Select a folder", wx.DefaultPosition, wx.DefaultSize, wx.DIRP_DIR_MUST_EXIST )
。。。 。。。
# Connect Events
self.m_dirPicker_DirChoise.Bind( wx.EVT_DIRPICKER_CHANGED, self.OnDirSelectButton )
。。。。。。
# Virtual event handlers, overide them in your derived class
。。。。。。
def OnDirSelectButton( self, event ):
event.Skip()
。。。。。。
自己实现的frame代码,部分节选:
class FsFrame(fs_ui.FsFrameBase):
。。。 。。。
def DrawDirList(self):
for idx, val in g_FsDirDb.GetData():
DbgPrint('==================') # 打印我从数据库中的已添加目录信息
DbgPrint('DrawDirList dbg:')
DbgPrint(' idx[%d], val[%s]' % (idx, val))
DbgPrint('==================')
rowidx = self.m_listCtrl_DirList.InsertStringItem(sys.maxint, val)
DbgPrint('Insert result: %d' % rowidx) # 打印添加结果动作
。。。 。。。
def OnDirSelectButton(self, evt):
g_FsDirDb.AddDir(evt.GetEventObject().GetPath())
DbgPrint('------------------') # 打印browser添加目录后,数据库中的目录信息dump
DbgPrint('Debuging: ')
g_FsDirDb.Debug()
DbgPrint('------------------')
self.DrawDirList() # 直接调用封装的listctrl.insertItem函数。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)