Боке - как сделать множественный выбор зависимым от виджета выбора и получить значения множественного выбора? - PullRequest
0 голосов
/ 03 августа 2020

Я могу создать один виджет выбора (портфолио) и один зависимый виджет множественного выбора (ключевые слова) (ключевые слова меняются в зависимости от выбранного портфолио). Однако я изо всех сил пытаюсь получить значения Multiselect. Я не уверен, как передать виджет с заполненными ключевыми словами из 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)

1 Ответ

1 голос
/ 03 августа 2020

Вы перезаписываете исходный виджет ключевых слов в своей функции, который затем передаете дочерним элементам. Это работает, но глобальные ключевые слова не перезаписываются, а остаются старыми. Обратитесь к новому, обратившись непосредственно к дочернему элементу:

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

Более чистый способ сделать это - не заменять виджет новым, а только заменять параметры:

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

И удалите перезапись дочерних элементов, поскольку в этом больше нет необходимости.

layout.children[1] = keywords

Делая это таким образом, вы можете снова использовать старые операторы печати. ​​

print(portfolio.value, keywords.value)
...