python - 是否可能创建一个"def"列表?

2024-03-28 15:55:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道是否有可能创建一个“def”列表,连接一个包含20个按钮的列表,并为每个按钮提供不同的回调。你知道吗

谢谢


Tags: 列表def按钮
2条回答

你可以用一个回调函数来做你想做的事,而不是把你的程序弄乱。你知道吗

下面的程序使用助手函数来创建每个按钮。此函数将两项用户数据传递给每个按钮的connect方法:按钮的标签文本和按钮的索引号。调用回调时,它接收这些数据项以及按钮小部件本身。回调可以使用button小部件的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()

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非常有限(只有一个表达式,没有语句)

相关问题 更多 >