n00by:Python:“;第二个参数必须是可调用的";?

n00by:Python:“;第二个参数必须是可调用的";?,python,function,pygtk,Python,Function,Pygtk,我正在用Python构建一个GTK应用程序,该应用程序生成一个始终等于42的等式。我从linux命令行启动它。它说我的函数不可调用之类的。我认为它是可以调用的,我真的不知道这意味着什么,很抱歉发布这样一个问题。代码如下: #!/usr/bin/env python import random import gtk def makePlus(): num2 = random.randint(0,41) num = 42 - num2 return str(num) +

我正在用Python构建一个GTK应用程序,该应用程序生成一个始终等于42的等式。我从linux命令行启动它。它说我的函数不可调用之类的。我认为它是可以调用的,我真的不知道这意味着什么,很抱歉发布这样一个问题。代码如下:

#!/usr/bin/env python

import random
import gtk

def makePlus():
    num2 = random.randint(0,41)
    num = 42 - num2
    return str(num) + " + " + str(num2)

def makeMinus():
    num2 = random.randint(0,41)
    num = 42 + num2
    return str(num) + " - " + str(num2)

def makeTimes():
    num2 = random.randint(0,41)
    num2 = float(num2)
    num = 42.0 / num2
    return str(num) + " x " + str(num2)

def makeDivideBy():
    num2 = random.randint(0,41) 
    num = 42 * num2
    return str(num) + " / " + str(num2)

def setResultAs(operation):
    if operation == "plus":
        result = makePlus()
    if operation == "minus":
        result = makeMinus()
    if operation == "times":
        result = makeTimes()
    if operation == "divide":
        result = makeDivideBy()
    textbox.set_text(result)

win = gtk.Window()
win.set_title("OSFT Equation Generator")
win.connect('delete-event', gtk.main_quit)

mainbox = gtk.VBox()
win.add(mainbox)

textbox = gtk.Entry()
mainbox.pack_start(textbox)

btnbox = gtk.HBox()
mainbox.pack_start(btnbox)

plusBtn = gtk.Button("Plus")
btnbox.pack_start(plusBtn)
plusBtn.connect("clicked", setResultAs("plus"))

minusBtn = gtk.Button("Minus")
btnbox.pack_start(minusBtn)
minusBtn.connect("clicked", setResultAs("minus"))

timesBtn = gtk.Button("Times")
btnbox.pack_start(timesBtn)
timesBtn.connect("clicked", setResultAs("times"))

divideBtn = gtk.Button("Divide by")
btnbox.pack_start(plusBtn)
divideBtn.connect("clicked", setResultAs("divide"))

win.show_all()
gtk.main()
这就是我得到的错误:

Traceback (most recent call last):
  File "./osftgen.py", line 53, in <module>
    plusBtn.connect("clicked", setResultAs("plus"))
TypeError: second argument must be callable
回溯(最近一次呼叫最后一次):
文件“/osftgen.py”,第53行,在
plusBtn.connect(“单击”,setResultAs(“加”))
TypeError:第二个参数必须是可调用的

请帮助。

可调用是Python表示“它是某种函数吗?”


你还没有传递一个函数来连接;您未传递None(因为setResultAs不返回值)。有gtk可以调用的东西。

可调用是Python表示“它是某种函数吗?”


你还没有传递一个函数来连接;您未传递None(因为setResultAs不返回值)。有gtk可以调用的东西。

代码调用
setResultAs(..)
并使用函数的返回值作为回调(处理程序)

使用以下表单():

例如,替换以下行

plusBtn.connect("clicked", setResultAs("plus"))
与:

更新

除了上面提到的,回调函数
setResultAs
应该接收widget(发出信号的widget)作为第一个参数

替换以下行:

def setResultAs(operation):
与:

还有一个打字错误:

divideBtn = gtk.Button("Divide by")
btnbox.pack_start(plusBtn) # <-------- `plusBtn` should be `divideBtn`
divideBtn.connect("clicked", setResultAs("divide"))
divideBtn=gtk.按钮(“除以”)

btnbox.pack_start(plusBtn)#代码调用
setResultAs(..)
并使用函数的返回值作为回调(处理程序)

使用以下表单():

例如,替换以下行

plusBtn.connect("clicked", setResultAs("plus"))
与:

更新

除了上面提到的,回调函数
setResultAs
应该接收widget(发出信号的widget)作为第一个参数

替换以下行:

def setResultAs(operation):
与:

还有一个打字错误:

divideBtn = gtk.Button("Divide by")
btnbox.pack_start(plusBtn) # <-------- `plusBtn` should be `divideBtn`
divideBtn.connect("clicked", setResultAs("divide"))
divideBtn=gtk.按钮(“除以”)
btnbox.pack_start(plusBtn)#
将事件连接到操作时,需要传递一个字符串事件名称,然后传递一个可调用函数,这意味着“当名为“clicked”的事件发生在plusBtn上时,运行
clickedPlus
函数


将事件连接到操作时,需要传递字符串事件名称和可调用函数,这意味着“当名为“clicked”的事件发生在plusBtn上时,运行
clickedPlus
函数。

尝试将
plusBtn.connect(“clicked”,setResultAs(“plus”)
更改为
plusBtn.connect(“clicked”,lambda:setResultAs(“plus”)
谢谢。它说lambda不接受任何参数(给定一个参数),所以我想我将停止使用返回,只将结果变量的设置合并到数学函数中。天啊,伙计们,这是我的第一个堆栈溢出问题,所以我非常感谢所有帮助。谢谢。尝试更改
plusBtn.connect(“单击”),setResultAs(“plus”)
plusBtn.connect(“单击”),lambda:setResultAs(“plus”)
谢谢。它说lambda不接受任何参数(给定一个参数),所以我想我将停止使用返回,只需将结果变量的设置合并到数学函数中即可。天啊,伙计们,这是我的第一个堆栈溢出问题,所以我非常感谢所有的帮助。谢谢。我试着使用我的代码,但这似乎是最有希望的方法。谢谢(无论如何,我不会更新这个程序,这是我朋友的一次挑战)这不起作用。我得到
TypeError:clickedPlus()不接受任何参数(给定1个)
EDIT:它现在可以工作了。我不得不将
def clickedPlus(widget):
改为。我尝试使用我的代码,但这似乎是最有希望的方法。谢谢(无论如何,我不会更新这个程序,这是我朋友的一次挑战)这不起作用。我得到
TypeError:clickedPlus()不接受任何参数(给定1个)
EDIT:它现在可以工作了。我不得不把
defclickedplus(小部件):
改为。
def clickedPlus(widget):
    setResultAs("plus")

plusBtn.connect("clicked", clickedPlus)