首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态更新Holoviz面板布局

动态更新Holoviz面板布局
EN

Stack Overflow用户
提问于 2020-06-20 00:32:26
回答 1查看 1.3K关注 0票数 1

在不讨论动机细节的情况下,我想使用Panel执行以下步骤:

  1. 显示一个panel.widgets.FileInput元素。一旦一个文件被选中,
  2. ,然后显示一个panel.widgets.MultiSelect元素,其中包含来自该文件的项,其中的前几项被选中。MultiSelect元素出现在FileInput元素下面。
  3. 基于所选内容(包括最初和用户与panel.widgets.MultiSelect元素的交互),在FileInput元素右侧的列中显示一些项。

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

代码语言:javascript
复制
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

任何能帮助我澄清误解的建议都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-20 17:27:29

我知道我哪里出了问题。在函数_item_selector()中,我将layout[0][1]设置为一个新的MultiSelect对象,而函数_col()受第6行中设置的原始MultiSelect对象的影响。

代码语言:javascript
复制
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行的布局,或者是否也可以动态地设置布局。

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

https://stackoverflow.com/questions/62480303

复制
相关文章

相似问题

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