首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyGObject,循环按钮

PyGObject,循环按钮
EN

Stack Overflow用户
提问于 2014-06-28 18:39:31
回答 1查看 118关注 0票数 1

我正在绑定以创建一个按钮循环,并在按下按钮时执行命令。

代码语言:javascript
复制
k=0
for row in list:

        delete_list.append("button_delete"+str(k))
        delete_list[k] = Gtk.Button(label="Delete")
        grid.attach(delete_list[k], columns+1, k, 1, 1)
        delete_list[k].connect("clicked",globals()["on_button"+str(k)+"_clicked"])

        k+=1

按钮显示正确,但我在连接“点击”信号时遇到了问题。

代码语言:javascript
复制
delete_list[k].connect("clicked",globals()["on_button"+str(k)+"_clicked"])
KeyError: 'on_button0_clicked'

首先,我认为错误是因为没有方法on_button0_clicked,但是我创建它,并且仍然得到相同的错误。

另外,如果有一些很好的方法/建议来动态创建按钮响应的方法,那就太好了。实际上,我需要为使用"k“计数器的每个按钮创建一个方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-29 06:49:45

要动态创建将循环变量绑定为局部变量的函数,需要一个工厂函数来生成它们:

代码语言:javascript
复制
def callback_factory(num):
    def new_callback(widget):
        print(widget, num)
    return new_callback

for k, row in enumerate(somelist):
    button = Gtk.Button(label=str(k))
    button.connect('clicked', callback_factory(k))

这避免了一个常见的缺陷,即在循环体中创建一个方法或lambda,从而为每个按钮点击打印相同的内容。这是由于环境的原因,该函数是在绑定到生成的函数时创建的,在该函数中,k变量正在所有回调之间进行变异和共享。下面的代码可以观察到这个陷阱,这些代码不像您可能预期的那样工作:

代码语言:javascript
复制
for k, row in enumerate(somelist):
    def callback(widget):
        print(k)
    button = Gtk.Button(label=str(k))
    button.connect('clicked', callback)

PyGObject还支持传递到回调的每个连接调用的唯一用户数据:

代码语言:javascript
复制
def callback(widget, num):
    print(widget, num)

for k, row in enumerate(somelist):
    button = Gtk.Button(label=str(k))
    button.connect('clicked', callback, k))

这允许使用相同的回调和不同的参数,这在某些情况下可能更清晰。

附带注意:通过将内置的" list“类分配给您自己的list实例,掩盖它可能不是一个好主意。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24469834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档