Bokeh - 如何使 multiselect 依赖于 select 小部件 'and retrieve multiselect values'?

Bokeh - how to make multiselect dependent on select widget 'and retrieve multiselect values'?

我能够创建一个 Select(投资组合)小部件和一个相关的多选(关键字)小部件(关键字根据所选投资组合而变化)。但是,我正在努力检索 Multiselect 的值。我不确定如何将填充的 'keywords' 小部件从 get_folio_terms() 传递到主要部分,以便它反映在多选中。对此的任何帮助表示赞赏。

PS:代码正确显示多选,并使用从 get_folio_terms() 填充的正确值。

代码如下:

keywords = MultiSelect(title="Keywords", options=[])

def get_folio_terms(attrname, old, new):
    connection = pymysql.connect(host='localhost',
                                 user='root',
                                 password='root',
                                 db='qa_env',
                                 charset='utf8mb4',
                                 cursorclass=pymysql.cursors.DictCursor)

    with connection.cursor() as cursor:
        sqlstmt1 = "SELECT * from portfolioterms where portfolio_name = "
        sql = sqlstmt1 + "'" + portfolio.value + "';" # handle Keyerror later
        print(sql)
        cursor.execute(sql)
        result = cursor.fetchall()
        if cursor.rowcount > 0:
            dfinput = pd.DataFrame.from_dict(result)
            print(dfinput)

            keywords = MultiSelect(title="Keywords", options=list(dfinput['businessterm']))
            layout.children[1] = keywords
        else:
            keywords = MultiSelect(title="Keywords", options=[]) # reset to empty
            layout.children[1] = keywords

def update_portfolio():

    print(portfolio.value, keywords.value)


def update(attrname, old, new):
    print(keywords.value)

# set up select widget
portfolio = Select(title="portfolio", options=['ERT','Trading', 'Wealth'])
portfolio.on_change('value', get_folio_terms)

keywords.on_change('value', update)

kwbutton = Button(label='Select Keywords',width=150,button_type="success")
kwbutton.on_click(update_portfolio)
layout = column(portfolio,keywords,kwbutton)
curdoc().add_root(layout)

您正在覆盖函数中的初始关键字小部件,然后将其传递给 children。这行得通,但全局关键字不会被覆盖,但仍然是旧关键字。引用新的直接引用child:

print(portfolio.value, layout.children[1].value)

更简洁的方法是不将小部件替换为新的小部件,而仅替换选项:

keywords.options=list(dfinput['businessterm'])

并删除 children 的覆盖,因为它不再需要了。

layout.children[1] = keywords

这样做时,您可以再次使用旧的打印语句。

print(portfolio.value, keywords.value)