尝试使用wx.media模块在wx.Python Phoenix(Python 3.5.2)中创建媒体播放器以播放电影预告片。
运行以下代码时,它会引发TypeError
:
TypeError: __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或播放预告片的帮助都将不胜感激。
答案 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__()