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)
我能够创建一个 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)