python - 是否可以创建" def"?

时间:2014-11-22 10:45:51

标签: python list function

我想知道是否可以创建一个" def"列表来连接20个按钮的列表,并为每个按钮设置不同的回调。

由于

2 个答案:

答案 0 :(得分:2)

Python中的

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()