デフォルトとオプションの引数の違い
-
30-09-2019 - |
質問
わかりましたコード:
#!/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 Constructorを複数回呼び出して、異なる引数を渡すことができるようになりたい
私は多くのことを試しました...
すべての議論でmyframeをインストールして、すべての議論で私の枠を入力しますが、デフォルトの引数
すべての引数を使用したコンストラクターメソッドの署名
コンストラクターメソッドの署名はすべて、デフォルトの引数です
すべての引数で親コンストラクター法を呼び出します
すべての人とともに親コンストラクター法を呼び出しますが、デフォルトの引数
さらに、チュートリアル http://zetcode.com/wxpython/ デフォルトとオプションの引数の数が異なる方法に言及します! (違いは何ですか?)
udpate:
「7つのパラメーターがあります。最初のパラメーターにはデフォルト値がありません。他の6つのパラメーターにはあります。これらの4つのパラメーターはオプションです。最初の3つのパラメーターは必須です。」 - 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)
- 私はどのような議論が進んでいるかを伝えます(2行目)
- 私は(3行目)になった議論で電話します
更新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.
なぜうまくいかなかったのですか?
解決
1回の調整で私のためにうまく動作します。サブクラス化した後、あなたはコロンが欠けています wx.Frame
声明。
1つのコメント。あなたが親イタライザーに引数を「通過」するだけなら、使用してください *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
. 。後者は、エラーを見て、ララランドに送信するときにやめます。
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)
引数をキーワードとして渡すと、タイトル、サイズ、スタイル、実際にそれらを取る関数に対する位置がまったく異なる可能性があります。そこにある最初の行は、「サイズ」を5番目の議論に割り当てます wx.Frame.__init__
機能、おそらくサイズではありません。それは100番目の議論かもしれませんが、キーワードを使用してどこに行くべきかを伝えます。
「オプション」はやや曖昧です。 キーワード引数 デフォルトを供給しますが、デフォルトは不適切な場合があります。
他のヒント
あなたはありません pos
あなたから Frame.__init__
電話。これがからのプロトタイプです ドキュメント:
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)