python - 动态更新 Holoviz 面板布局

标签 python bokeh panel holoviews holoviz

在不深入讨论动机细节的情况下,我想使用面板执行以下步骤序列:

  1. 显示 panel.widgets.FileInput 元素。
  2. 选择文件后,将显示一个 panel.widgets.MultiSelect 元素,其中包含文件中的项目,其中前几个项目将被选中。 MultiSelect 元素出现在 FileInput 元素下方。
  3. 根据所选内容(最初以及通过用户与 panel.widgets.MultiSelect 元素的交互),在 FileInput 元素右侧的列中显示一些项目。

第 1 步和第 2 步工作正常,但我无法让第三件事发生。这是一个说明运行时问题的最小示例:

import panel as pn
pn.extension()

# Create and organize basic elements to show where things go
file_input = pn.widgets.FileInput()
item_selector = pn.widgets.MultiSelect()
controls = pn.Column(file_input, "layout[0][1]")
layout = pn.Row(controls, pn.Column("layout[1][0]"))
print(layout)

# Set up selector object
@pn.depends(file_contents=file_input, watch=True)
def _item_selector(file_contents):
    # Dummy items for illustration purpose
    items = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']    
    item_selector = pn.widgets.MultiSelect(
        name="Choose items", 
        options=items,
        size=12,
        width=120,
        value=items[:2],
    )
    layout[0][1] = item_selector

# Define interactivity based on selector object
@pn.depends(selected_items=item_selector, watch=True)
def _col(selected_items):
    col = pn.Column()
    for item in selected_items:
        col.append(item)
    layout[1] = col

layout

任何有助于消除我的误解的指示将不胜感激。

最佳答案

我知道我哪里错了。在函数 _item_selector() 中,我将 layout[0][1] 设置为新的 MultiSelect 对象,并且函数 _col() 受到影响通过第 6 行设置的原始 MultiSelect 对象。下面的代码修复了问题

import panel as pn
pn.extension()

# Create and organize basic elements to show where things go
file_input = pn.widgets.FileInput()
item_selector = pn.widgets.MultiSelect()
controls = pn.Column(file_input, "")
layout = pn.Row(controls, pn.Column(""))

# Set up selector object
@pn.depends(file_contents=file_input, watch=True)
def _item_selector(file_contents):
    # Dummy file contents
    items = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] 
    item_selector.options = items
    item_selector.value = ['a', 'c']
    item_selector.size = 12
    item_selector.width = 120
    layout[0][1] = item_selector

# Define interactivity based on selector object
@pn.depends(selected_items=item_selector, watch=True)
def _col(selected_items):
    col = pn.Column()
    for item in selected_items:
        col.append(item)
    layout[1] = col

layout

我确信这不是解决我试图解决的问题的最优雅的方法,我会对任何反馈感兴趣。特别是,作为Panel的新手,我不知道是否有必要在第5-8行预先设置布局,或者是否也可以动态完成。

关于python - 动态更新 Holoviz 面板布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62480303/

相关文章:

python - 通用工厂方法的类型提示

python 包装器函数在装饰器中接受参数

python - 将 URL 编码为 google 可读的格式

python - 如何在 Bokeh 中设置默认样式?

python - 从面板仪表板引发错误并显示回溯消息

python - pandas 数据框中同一客户的行与其上一行/下一行之间的时间差

python - 选择 Bokeh 图中的文本

c# - 窗体上的自动调整大小面板

Java 多边形调整大小

iframe - Ext.getCmp无法在Youtube Video Sencha Touch的隐藏上工作