好的代码:
#!/usr/bin/python
import wx
import sys
class XPinst(wx.App):
def __init__(self, redirect=False, filename=None):
wx.App.__init__(self, redirect, filename)
def OnInit(self):
frame = wx.Frame(None, -1, title='Redirect Test', size=(620,450), style=wx.STAY_ON_TOP|wx.DEFAULT_FRAME_STYLE)
panel = wx.Panel(frame, -1)
log = wx.TextCtrl(panel, -1, size=(500,400), style = wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL)
redir=RedirectText(log)
sys.stdout=redir
print 'test'
frame.Show()
return True
class RedirectText:
def __init__(self,aWxTextCtrl):
self.out=aWxTextCtrl
def write(self,string):
self.out.WriteText(string)
app = XPinst()
app.MainLoop()
加入:
class MyFrame(wx.Frame)
def __init__(self, parent, id, title, size=(620,450), style=wx.STAY_ON_TOP|wx.DEFAULT_FRAME_STYLE):
wx.Frame.__init__(self, parent, id, title, size=(620,450), style=wx.STAY_ON_TOP|wx.DEFAULT_FRAME_STYLE)
取代:
frame = wx.Frame(None, -1, title='Redirect Test', size=(620,450), style=wx.STAY_ON_TOP|wx.DEFAULT_FRAME_STYLE)
使用:
frame = MyFrame(None, -1, title='Redirect Test', size=(620,450), style=wx.STAY_ON_TOP|wx.DEFAULT_FRAME_STYLE)
现在,它没有运行......
我希望能够在我的代码中多次调用MyFrame构造函数传递不同的参数
我做了很多事......
使用所有参数实现MyFrame
实现myFrame和所有,但默认参数
带有所有参数的构造函数方法签名
构造函数方法签名包含所有但默认参数
用所有参数调用父构造函数方法
使用all但默认参数调用父构造函数方法
加上教程http://zetcode.com/wxpython/提到了一个默认和可选参数数量不同的方法! (有什么区别?)
UDPATE:
“它有七个参数。第一个参数没有默认值。其他六个参数都有。这四个参数是可选的。前三个是强制性的。” - http://zetcode.com/wxpython/firststeps/
更新2:
采用分号校正,我刚试过:
class MyFrame(wx.Frame):
def __init__(self, parent, id, title, size, style):
wx.Frame.__init__(self, parent, id, title, size, style)
更新3:
完整的错误消息是:
Traceback (most recent call last):
File "test.py", line 29, in <module>
app = XPinst()
File "test.py", line 8, in __init__
wx.App.__init__(self, redirect, filename)
File "/usr/lib/python2.6/dist-packages/wx-2.8-gtk2-unicode/wx/_core.py", line 7978, in __init__
self._BootstrapApp()
File "/usr/lib/python2.6/dist-packages/wx-2.8-gtk2-unicode/wx/_core.py", line 7552, in _BootstrapApp
return _core_.PyApp__BootstrapApp(*args, **kwargs)
File "test.py", line 10, in OnInit
frame = MyFrame(None, -1, title='Redirect Test', size=(620,450), style=wx.STAY_ON_TOP|wx.DEFAULT_FRAME_STYLE)
File "test.py", line 21, in __init__
wx.Frame.__init__(self, parent, id, title, size, style)
File "/usr/lib/python2.6/dist-packages/wx-2.8-gtk2-unicode/wx/_windows.py", line 497, in __init__
_windows_.Frame_swiginit(self,_windows_.new_Frame(*args, **kwargs))
TypeError: Expected a 2-tuple of integers or a wxSize object.
为什么不起作用?
答案 0 :(得分:1)
通过一次调整为我运行正常;在你的子wx.Frame
声明后,你错过了一个冒号。
一条评论;如果您只是“传递”父级初始化器的参数,请使用*args
和/或**kwargs
来保存一些输入。
class MyFrame(wx.Frame):
def __init__(self, *args, **kwargs):
wx.Frame.__init__(self, *args, **kwargs)
如果您想修改或添加特定参数,您只需修改字典kwargs
,例如
class MyFrame(wx.Frame):
def __init__(self, *args, **kwargs):
kwargs['size']=(1000,200)
wx.Frame.__init__(self, *args, **kwargs)
使用python
而非pythonw
在控制台中运行您正在处理的脚本。后者只有在看到错误时才会退出并将它们发送到lala-land。
N:\Code>pythonw wxso.pyw
N:\Code>rem nothing happened.
N:\Code>python wxso.pyw
File "wxso.pyw", line 24
class MyFrame(wx.Frame)
^
SyntaxError: invalid syntax
N:\Code>
class MyFrame(wx.Frame):
def __init__(self, parent, id, title, size, style):
#wx.Frame.__init__(self, parent, id, title, size, style) # broken
# equivalent to:
#wx.Frame.__init__(self, parent, id=id, title=title, pos=size, size=style)
# the below works.
wx.Frame.__init__(self, parent, id, title=title, size=size, style=style)
将参数作为关键字传递时,例如标题,大小,风格,它们对实际带来它们的功能的位置可能完全不同。第一行将“size”分配给wx.Frame.__init__
函数中的第五个参数,这可能不是大小。它可能是第100个参数,但您使用关键字告诉它去哪里。
“可选”有些模糊; 关键字参数提供默认值,但默认值可能不合适。
答案 1 :(得分:1)
您错过了pos
来电中的Frame.__init__
。这是docs的原型:
Frame.__init__(self, parent, id, title, pos, size, style, name)
所以基本上错误就是说它期望size
是一个2元组或wxSize对象,而你传递的内容与那个不匹配。当你从这里的构造函数中删除size=
时,我猜这是悄悄的:
class MyFrame(wx.Frame):
def __init__(self, parent, id, title, size, style):
wx.Frame.__init__(self, parent, id, title, size, style)
编辑:以下任何一种情况都可以
wx.Frame.__init__(self, parent, id, title, size=size, style=style)
wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, size, style)
但是通过省略参数中的关键字,您的呼叫将按照传递的顺序进行处理,如
wx.Frame.__init__(self, parent, id, title, pos=size, size=style)