我想知道是否可以创建一个" def"列表来连接20个按钮的列表,并为每个按钮设置不同的回调。
由于
答案 0 :(得分:2)
def
只是一个将名称绑定到函数/闭包的常规语句。例如,你可以写
flist = []
for i in range(30):
def func(x, i=i):
print(x * i)
flist.append(func)
之后flist[7](6)
将返回42。
在上述声明中,棘手的部分只是i=i
。这是必需的,因为闭包是变量,而不是当前的变量值。如果没有i=i
,所有函数都将使用用于循环的相同变量i
。
Python也支持匿名函数,所以在上面这个简单的例子中,代码可以缩短为
flist = []
for i in range(30):
flist.append(lambda x, i=i: print(x * i))
但是lambda
非常有限(只是一个表达式,没有语句)
答案 1 :(得分:1)
使用多个回调函数,您可以使用单个回调函数执行所需的操作,而不是使程序混乱。
下面的程序使用辅助函数来创建每个按钮。此功能将两项用户数据传递给每个按钮的connect
方法:按钮的标签文本和按钮的索引号。调用回调时,它会接收这些数据项以及按钮小部件本身。回调可以使用按钮小部件的get_label()
方法来识别按钮,但是传递索引号通常很方便。将标签文本作为用户数据传递在这里有点多余,但我只是为了演示该技术。 (你对20分钟写的演示程序有什么期望?:))
#!/usr/bin/env python
''' A simple gtk2+ button demo
Written by PM 2Ring 2014.11.22
'''
import pygtk
pygtk.require('2.0')
import gtk
class ButtonDemo(object):
def button_cb(self, widget, text, data):
print "Button '%s' clicked. Data=%s. Label '%s'" % (text, data, widget.get_label())
return True
def quit(self, widget): gtk.main_quit()
def __init__(self):
win = gtk.Window(gtk.WINDOW_TOPLEVEL)
width = gtk.gdk.screen_width() // 2
height = gtk.gdk.screen_height() // 8
win.set_size_request(width, height)
win.set_title("GTK Button demo")
win.set_border_width(10)
win.connect("destroy", self.quit)
box = gtk.HBox()
box.show()
win.add(box)
def make_button(text, data):
button = gtk.Button(label=text)
button.connect('clicked', self.button_cb, text, data)
button.show()
return button
base = ord('A')
for i in xrange(5):
button = make_button('Button_%s' % chr(base + i), i)
box.pack_start(button, True)
button = gtk.Button('_Quit')
button.show()
box.pack_start(button, False)
button.connect("clicked", self.quit)
win.show()
def main():
ButtonDemo()
gtk.main()
if __name__ == "__main__":
main()