我正在尝试为我制作的模块(see this SO question)制作输入小部件。
输入窗口小部件应在下方具有标题栏和可变数量的输入行。我想在每个输入行的末尾都有一个删除按钮。
理想情况下,“删除”按钮应删除容器小部件和所有子级小部件,但也可以隐藏容器小部件和子级。
我无法找到解决此问题的有用方法。
目前我有这段代码,但是对于解决问题我一无所知。
import ipywidgets as w
def add_btn_clicked(b):
input_box.children = (input_box.children[0], line()) + input_box.children[1:]
def delete_btn_clicked(b):
# ???
with output:
print(b.keys)
return None
add = w.Button(icon="plus-circle")
add.on_click(add_btn_clicked)
title = w.HBox([w.Label(value=str(i)) for i in range(3)]+[add])
def line():
delete = w.Button(icon="trash")
delete.on_click(delete_btn_clicked)
return w.HBox([w.FloatText(value=i) for i in range(3)]+[delete])
input_box = w.VBox([title,line()])
output = w.Output()
display(input_box)
display(output)
有没有一种方法可以通过单击按钮来告诉父元素是什么,或者有其他方法可以实现我正在尝试的目的?
答案 0 :(得分:0)
您可以分别创建小部件和容器,然后在组装在一起之前将子级上的.parent
属性定义为容器。这样,您可以在单击按钮时有效地隐藏容器(使用.parent.layout.display = 'none'
)。
import ipywidgets as w
def add_btn_clicked(b):
input_box.children = (input_box.children[0], line()) + input_box.children[1:]
def delete_btn_clicked(b):
b.parent.layout.display = 'none'
add = w.Button(icon="plus-circle")
add.on_click(add_btn_clicked)
title = w.HBox([w.Label(value=str(i)) for i in range(3)]+[add])
def line():
delete = w.Button(icon="trash")
delete.on_click(delete_btn_clicked)
val_widgets = [w.FloatText(value=i) for i in range(3)]
container = w.HBox()
delete.parent = container
for widg in val_widgets:
widg.parent = container
children = val_widgets + [delete]
container.children = children
return container
input_box = w.VBox([title,line()])
output = w.Output()
display(input_box)
display(output)