ipywidget 交互式隐藏可见性

14

我想使用ipywidgets创建一个交互式模块。 目前还不错,但我卡住了。 我想要根据某种情况隐藏特定的ipywidget对象,并且希望我的打印文本出现在部件上方并保持在那里。

dropdown=widgets.Dropdown(
    options={'Coffee machine': 1, 'Washing machine': 2, 'Water Heater': 3, 'Heating System': 4, 'Dryer': 5, 'Oven': 6, 'Microwave': 7, 'Other':8},
    value=1,
    description='Apparaat:',
    )
text_new=widgets.Text()
def text_field(value):
    if(value==8):
        display(text_new)
        text_new.on_submit(handle_submit)
    else:
        text_new.visible(False) #Doesn't work but I want something like this
print("Today you had an increase in electricity consumption, would you like to name this device?") #This just be above the dropdown menu and be stuck
i=widgets.interactive(text_field, value=dropdown)
display(i)

现在的功能是:当下拉菜单中选择“其他”时,会出现一个文本框,用户可以在其中输入内容。但是,当勾选另一台机器时,该文本框仍然存在。我只需要一个“隐藏”功能,但似乎找不到可用的。此外,在下拉菜单中选择另一个选项后,打印内容消失了,不再出现。
3个回答

22

4
谢谢 @pir0,boton.layout.visibility = 'hidden' 对我有用!使用 boton.layout.visibility = 'visible' 可以使它再次可见。 - Ron Kalian
@RonKalian,两个答案之间有区别:visibility='hidden'保留了字段的边界框,而display='none'则完全折叠了该字段,并向上移动了表单的其余部分。顺便说一下,相反的情况只是JS词汇:display='block'。 - Myoch

11

给定一个小部件:

import ipywidgets
button = ipywidgets.Button()

有两种直接隐藏小部件的方式,它们之间有一个明显的区别。

隐藏和显示小部件而不影响整个页面布局

# Turn the widget "invisible" without affecting layout
button.layout.visibility = "hidden"

# Make the widget visible again, layout unaffected
button.layout.visibility = "visible"

隐藏和显示小部件,并折叠小部件占用的空间:

# Hide widget and collapse empty space
button.layout.display = "none"

# Re-add the widget, adjusting page layout as necessary.
button.layout.display = "block"

什么时候使用哪个?原则上,使用 layout.visibility 可以避免在切换可见性时页面布局不断跳动。但是,对于非常大的小部件,考虑使用 layout.display 以避免出现巨大的空白区域。
有关适用于此处的更一般的 CSS 信息,请参见What is the difference between visibility:hidden and display:none?

6
除了被接受的答案之外,如果你想动态改变控件的可见性,你可以声明布局变量并重复使用。
layout_hidden  = widgets.Layout(visibility = 'hidden')
layout_visible = widgets.Layout(visibility = 'visible')

像附加到事件一样:

def visible_txt(b):
    text_box.layout = layout_visible

def hidden_txt(b):
    text_box.layout = layout_hidden

btn_visible.on_click(visible_txt)
btn_hidden.on_click(hidden_txt)

有趣...将整个布局对象分配与直接切换“可见性”相比,有什么优势呢? - ILoveCoding

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接