wxpython错误 - “compute()只需要2个参数(给定1个)”但它有2个参数

时间:2013-08-08 18:34:00

标签: python wxpython

所以最近我一直在努力学习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 个答案:

答案 0 :(得分: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或使compute成为类方法而不是类方法中的方法

答案 1 :(得分:0)

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

答案 2 :(得分:0)

事件处理程序'compute'不是此处的方法,而是方法内的函数( _ init _ )。如果你将'self'作为一个参数添加它,它希望在调用它时传递一个父类的实例,而你没有专门做(不是你应该这样做)。当你绑定一个事件时,wx会自动将事件发送给处理程序,如果你的处理程序接受它,那么......你可以用它来进行进一步的操作。处理程序可以是任何函数,如方法或lambda函数等。 所以,这就是说,你可以在这里删除'self'参数或将处理程序移动到它自己的方法中。顺便说一下,如果这是代码中唯一的按钮,则不需要将事件专门绑定到该按钮。 这还有用吗?你期待一个标签显示结果,对吧?由于c3在函数内部,我认为它不会! (您可能需要使用方法调用SetLabel())

答案 3 :(得分:0)

您需要在&#34;计算&#34;上移动定义。超出 init 。 此外,声明属于该类的面板并为静态文本创建处理程序,因为在按下按钮后,必须使用新结果更新静态文本。 您还可以节省一些空间,而不是分配&#34; c&#34;在 init

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))