使用 wxPython Phoenix 创建媒体播放器时出现类型错误

Typerror when creating media player with wxPython Pheonix

一直在尝试使用 wx.media 模块在 wx.Python Phoenix (Python 3.5.2) 中创建媒体播放器以播放电影预告片。 当 运行 以下代码时,它会引发 TypeErrorTypeError: __init__() takes 1 positional argument but 2 were given

我似乎无法找到引发此错误的位置。 我是面向对象编程的新手,所以代码中也可能存在其他逻辑错误。 以下是到目前为止的代码:

import wx,wx.media


class window(wx.Frame):
    def __init__(self,parent,id):
        wx.Frame.__init__(self,parent,id,title='Media Player')
        panel1=wx.Panel(self)
        button1=wx.Button(panel1,-1,'play')
        button1.Bind(wx.EVT_BUTTON,media)


class media(wx.media.MediaCtrl):
    def __init__(self):
         super(media,media).__init__(self)
         wx.media.MediaCtrl.Create(self,frame,id=-1,fileName='Trailer.wmv')
         wx.media.MediaCtrl.Load(self,'Trailer.wmv')
         wx.media.MediaCtrl.ShowPlayerControls(self)
         wx.media.MediaCtrl.Play(self)


if __name__=='__main__':
    app=wx.App()
    frame=window(parent=None, id=-1)
    frame.Show()
    app.MainLoop()`

代码应打开一个 window,在其中按下 'Play' 按钮 (button1),应播放名为 'Trailer.wmv' 的电影预告片。 任何有关打字错误或预告片播放的帮助将不胜感激。

media.__init__() 函数中的 super() 调用更改为:

super().__init__()

你有:

button1.Bind(wx.EVT_BUTTON,media)

其中 media 是 class。这样做没关系,尽管有点不合常规。问题是事件处理程序总是使用一个参数来调用,该参数表示已发送事件的详细信息。所以 wxPython 试图调用 media(event) ,因为它是一个 class,Python 变成 media.__init__(self, event) 并且你的代码只接受一个参数,所以它引发异常。

也就是说,更好的设计是在框架的 __init__ 中创建媒体控件作为面板的子项,然后只执行 LoadPlay按钮事件处理程序。