2

大丈夫コード:

#!/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とすべての引数でインスタンス化するコンストラクターメソッドの署名すべての引数でコンストラクターメソッドの署名
すべての引数で
コンストラクターメソッドの署名すべての
引数で親コンストラクターメソッドを呼び出すデフォルトの引数
以外のすべてのコンストラクターメソッドを呼び出す

さらに、チュートリアル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.

なぜうまくいかなかったのですか?

4

2 に答える 2

1

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番目の引数になる可能性がありますが、キーワードを使用してどこに行くかを指示します。

「オプション」はやや曖昧です。キーワード引数はデフォルトを提供しますが、デフォルトは不適切な場合があります。

于 2010-08-20T01:12:27.443 に答える
1

あなたはあなたの呼び出し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)
于 2010-08-20T01:55:33.700 に答える