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

时间:2014-02-12 03:32:32

标签: 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) + " + " + 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

请帮忙。

3 个答案:

答案 0 :(得分:3)

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

使用以下表格(gobject.GObject.connect):

object.connnect("signla_name", handler, arg1, arg2, ...)

例如,替换以下行

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

使用:

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

<强>更新

除了上述内容之外,回调函数setResultAs应该接收小部件(发出信号的小部件)作为第一个参数。

替换以下行:

def setResultAs(operation):

使用:

def setResultAs(widget, operation):

还有一个错字:

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

答案 1 :(得分:1)

Callable是Python的抽象方式,说“它是某种功能吗?”

您尚未传递连接功能;你已经传递了None(因为setResultAs没有返回值)。有一些gtk可以回电话。

答案 2 :(得分:1)

def clickedPlus(widget):
    setResultAs("plus")

plusBtn.connect("clicked", clickedPlus)

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