新人求助wxPython中嵌入ActiveX控件的问题

新人求助wxPython中嵌入ActiveX控件的问题,第1张

我用wx.lib.activexwrapper 中的 MakeActiveXClass类在界面中嵌入ActiveX控件,一般的控件都没有问题

下面是我的代码:

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函数。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11549804.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存