0

だから最近、私は wxpython を学ぼうとしていて、このエラーが発生し続けています。エラーは十分な引数がないことを知っていますが、計算関数の下には両方の引数があります。

import wx
import math
class game(wx.Frame):

    def __init__(self,parrent,id):

        c3 = "0"

        wx.Frame.__init__(self,parrent,id,"Form", size=(250,160))
        panel=wx.Panel(self)
        box2=wx.TextEntryDialog(None, "Input b", "Pythagorean theorem", "")
        if box2.ShowModal()==wx.ID_OK:
            b=box2.GetValue()
        box1=wx.TextEntryDialog(None, "Input A", "Pythagorean theorem", "")
        if box1.ShowModal()==wx.ID_OK:
            a=box1.GetValue()

        def compute(self, event):
            a2=int(a)**2
            b2=int(b)**2
            c = a2 + b2
            c2=math.sqrt(c)
            c3=str(c2)

        button=wx.Button(panel, label="Compute",pos=(90,70), size=(60,40))
        self.Bind(wx.EVT_BUTTON, compute, button)


        wx.StaticText(panel, -1, c3, (10,10))



if __name__=="__main__":
    app=wx.PySimpleApp()
    frame=game(parrent=None, id=-1)
    frame.Show()
    app.MainLoop()

エラー:「compute() は正確に 2 つの引数 (1 つ指定) を取ります」

4

4 に答える 4

0

「compute」の定義をinitから移動する必要があります。また、クラスに属するパネルを宣言し、静的テキストのハンドラーを作成します。これは、ボタンを押した後、静的テキストを新しい結果で更新する必要があるためです。initに「c」を割り当てずに、スペースを節約することもできます。

class game(wx.Frame):

def __init__(self,parrent,id):

    wx.Frame.__init__(self,parrent,id,"Form", size=(250,160))
    self.panel=wx.Panel(self)

    box2=wx.TextEntryDialog(None, "Input B", "Pythagorean theorem", "")
    if box2.ShowModal()==wx.ID_OK:
        self.b=box2.GetValue()

    box1=wx.TextEntryDialog(None, "Input A", "Pythagorean theorem", "")
    if box1.ShowModal()==wx.ID_OK:
        self.a=box1.GetValue()

    button=wx.Button(self.panel, label="Compute", pos=(90,70), size=(60,40))
    self.Bind(wx.EVT_BUTTON, self.compute, button)
    self.st = wx.StaticText(self.panel, -1, "", (10,10))

def compute(self, event):
    c = str(math.sqrt(int(self.a)**2 + int(self.b)**2))
    self.st = wx.StaticText(self.panel, -1, c, (10,10))
于 2013-08-22T19:30:08.297 に答える
0

イベント ハンドラ 'compute' は、ここではメソッドではなく、メソッド内の関数です ( _ init _)。「self」を引数として追加すると、呼び出されるたびに親クラスのインスタンスが渡されることが期待されますが、これは具体的には行いませんでした(そうすべきではありません)。イベントをバインドすると、wx はイベントでハンドラーに自動的に送信し、ハンドラーがそれを受け入れると、それをさらなるアクションに使用できます。ハンドラーは、メソッドやラムダ関数などの任意の関数にすることができます。つまり、ここでは、'self' 引数を削除するか、ハンドラーを独自のメソッドに移動することができます。ところで、それがコード内の唯一のボタンである場合、イベントをそのボタンに明確にバインドする必要はありません。また、これは機能しますか?ラベルに結果が表示されることを期待していますよね? c3 はその関数の中にあるので、そうはならないと思います! (SetLabel() を呼び出すメソッドが必要になる場合があります)

于 2013-08-09T21:07:14.400 に答える
0

ネストされた関数は、自己引数を取得または要求しません

class XYZ:
    def __init__(self):
        def some_func(x):
            print "SELF:",self
            print "X:",x
        some_func(6)


>>> print XYZ()
SELF: <__main__.XYZ instance at 0x029F7148>
X: 6
<__main__.XYZ instance at 0x029F7148>

これは、ネストされた関数が親関数のすべてのローカル変数 (つまり、self) にアクセスできるためです。

インスタンスでは、引数リストから self を削除するか、クラスメソッド内のメソッドではなくクラスメソッドを計算するだけです

于 2013-08-08T18:36:01.920 に答える