我正在使用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
请帮忙。
答案 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
函数。