我正在绑定以创建一个按钮循环,并在按下按钮时执行命令。
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按钮显示正确,但我在连接“点击”信号时遇到了问题。
delete_list[k].connect("clicked",globals()["on_button"+str(k)+"_clicked"])
KeyError: 'on_button0_clicked'首先,我认为错误是因为没有方法on_button0_clicked,但是我创建它,并且仍然得到相同的错误。
另外,如果有一些很好的方法/建议来动态创建按钮响应的方法,那就太好了。实际上,我需要为使用"k“计数器的每个按钮创建一个方法。
发布于 2014-06-29 06:49:45
要动态创建将循环变量绑定为局部变量的函数,需要一个工厂函数来生成它们:
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变量正在所有回调之间进行变异和共享。下面的代码可以观察到这个陷阱,这些代码不像您可能预期的那样工作:
for k, row in enumerate(somelist):
def callback(widget):
print(k)
button = Gtk.Button(label=str(k))
button.connect('clicked', callback)PyGObject还支持传递到回调的每个连接调用的唯一用户数据:
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实例,掩盖它可能不是一个好主意。
https://stackoverflow.com/questions/24469834
复制相似问题