首页 > 解决方案 > 使用 JupyterNotebook 从 ipywidget 函数定义全局变量

问题描述

我正在使用 ipywidgets 来允许用户选择一些值,并且我想将小部件内部的函数结果分配给函数外部的变量并在笔记本的下一个单元格上使用它(我尝试使用全局变量但是我无法让它工作):

def issuer_choice():

    from ipywidgets import widgets
    from IPython.display import display, clear_output
    import pandas as pd

    def myfunc(idnum):
        return data.loc[idnum]['cod']

    def on_button_clicked(b):
        global ticker
        ticker = myfunc(w.value)
        with output:
            clear_output()
            print('Ticker CIQ: ' + ticker)

    data = pd.read_csv('data.csv', sep=',', index_col = 1)
    w = widgets.Dropdown(options=list(data.index), description = 'Label:')

    button = widgets.Button(description="Obtain ID")
    output = widgets.Output()

    display(w)        
    display(button, output)
    button.on_click(on_button_clicked)
    return ticker

当调用此函数result = issuer_choice()并单击按钮时,代码ticker每次都能正确打印,这意味着在选择选项时会更新函数内部的值。但是,调用print(result)下一个单元格打印None,意思ticker是没有被分配到result

*data.csv 只是一列 DataFrame,其中存储了 ID 和名称的列表。

我认为它必须与ticker变量的范围有关,但我不知道。我将不胜感激任何帮助。

标签: pythonipywidgets

解决方案


如果您要求,请global ticker确保ticker在您的全局范围内已经定义了名称,即使您将其设置为 None,您也可以稍后在全局范围内调用它。

此外,如果您用read_csv提供相同行为的简单假数据框替换调用之类的内容,则可以更轻松地获取和使用您的示例。

ticker = None

def issuer_choice():

    from ipywidgets import widgets
    from IPython.display import display, clear_output
    import pandas as pd

    def myfunc(idnum):
        return data.loc[idnum]['cod']

    def on_button_clicked(b):
        global ticker
        ticker = myfunc(w.value)
        with output:
            clear_output()
            print('Ticker CIQ: ' + str(ticker))

    data = pd.Series({'A':1, 'B': 2, 'C': 3})
    data = data.to_frame(name='cod')
    w = widgets.Dropdown(options=list(data.index), description = 'Label:')

    button = widgets.Button(description="Obtain ID")
    output = widgets.Output()

    display(w)        
    display(button, output)
    button.on_click(on_button_clicked)

推荐阅读