n00by:Python:“;第二个参数必须是可调用的";?
我正在用Python构建一个GTK应用程序,该应用程序生成一个始终等于42的等式。我从linux命令行启动它。它说我的函数不可调用之类的。我认为它是可以调用的,我真的不知道这意味着什么,很抱歉发布这样一个问题。代码如下: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) +
#!/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)