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_)。如果您将“self”添加为参数,则它希望在调用它时传递父类的实例,而您没有专门这样做(不是您应该这样做)。当您绑定一个事件时,wx 会自动将事件发送到处理程序,并且如果您的处理程序接受它,那么……您可以将其用于进一步的操作。处理程序可以是任何函数,如方法或 lambda 函数等。因此,话虽如此,您可以在这里删除“self”参数或将处理程序移入自己的方法中。顺便说一句,如果这是代码中唯一的按钮,则不需要专门将事件绑定到该按钮。另外,这行得通吗?你期待一个标签来显示结果,对吧?由于 c3 在该函数中,我认为它不会!(你可能需要你的方法来调用 SetLabel())

于 2013-08-09T21:07:14.400 回答
0

您需要将“计算”上的定义移出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

您正在绑定,self.Bind(wx.EVT_BUTTON, compute, button)但计算需要参数,(self, evt)因此您需要将计算移出__init__您的游戏类并将其绑定为self.compute

于 2013-08-09T07:43:10.957 回答
0

嵌套函数不获取或不需要 self 参数

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 回答