2024-03-28 15:55:23 发布
网友
我想知道是否有可能创建一个“def”列表,连接一个包含20个按钮的列表,并为每个按钮提供不同的回调。你知道吗
谢谢
你可以用一个回调函数来做你想做的事,而不是把你的程序弄乱。你知道吗
下面的程序使用助手函数来创建每个按钮。此函数将两项用户数据传递给每个按钮的connect方法:按钮的标签文本和按钮的索引号。调用回调时,它接收这些数据项以及按钮小部件本身。回调可以使用button小部件的get_label()方法来标识按钮,但是传递索引号通常很方便。将标签文本作为用户数据传递在这里有点多余,但我这样做只是为了演示该技术。(您对20分钟内编写的演示程序有何期待?:))
connect
get_label()
#!/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()
Python中的def只是将名称绑定到函数/闭包的常规语句。例如你可以写
def
flist = [] for i in range(30): def func(x, i=i): print(x * i) flist.append(func)
之后flist[7](6)将返回42。你知道吗
flist[7](6)
棘手的部分只是上述声明中的i=i。这是必需的,因为闭包是变量的,而不是当前的变量值。如果没有i=i,所有函数都将使用用于循环的相同变量i。你知道吗
i=i
i
Python还支持匿名函数,因此在上面的简单示例中,代码可以缩短为
flist = [] for i in range(30): flist.append(lambda x, i=i: print(x * i))
但是lambda非常有限(只有一个表达式,没有语句)
lambda
你可以用一个回调函数来做你想做的事,而不是把你的程序弄乱。你知道吗
下面的程序使用助手函数来创建每个按钮。此函数将两项用户数据传递给每个按钮的
connect
方法:按钮的标签文本和按钮的索引号。调用回调时,它接收这些数据项以及按钮小部件本身。回调可以使用button小部件的get_label()
方法来标识按钮,但是传递索引号通常很方便。将标签文本作为用户数据传递在这里有点多余,但我这样做只是为了演示该技术。(您对20分钟内编写的演示程序有何期待?:))Python中的
def
只是将名称绑定到函数/闭包的常规语句。例如你可以写之后
flist[7](6)
将返回42。你知道吗棘手的部分只是上述声明中的
i=i
。这是必需的,因为闭包是变量的,而不是当前的变量值。如果没有i=i
,所有函数都将使用用于循环的相同变量i
。你知道吗Python还支持匿名函数,因此在上面的简单示例中,代码可以缩短为
但是
lambda
非常有限(只有一个表达式,没有语句)相关问题 更多 >
编程相关推荐