使用wxPython Pheonix创建媒体播放器时的Typerror

时间:2016-12-25 09:47:57

标签: python wxpython python-3.5

尝试使用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()`

代码应打开一个窗口,按下'播放'按钮(button1)名为' Trailer.wmv'的电影预告片应该玩。 任何有关typerror或播放预告片的帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

你有:

button1.Bind(wx.EVT_BUTTON,media)

其中media是一个类。这样做还可以,虽然有点不同寻常。问题是事件处理程序总是使用一个参数调用,该参数表示已发送事件的详细信息。所以wxPython试图调用media(event),因为它是一个类,Python变成media.__init__(self, event)而你的代码只接受一个参数,所以它引发了一个异常。

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

答案 1 :(得分:0)

super()功能中的media.__init__()来电更改为:

super().__init__()