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