【问题标题】:Defining a global variable from an ipywidget function using JupyterNotebook使用 Jupyter Notebook 从 ipywidget 函数定义全局变量
【发布时间】:2020-01-08 20:51:26
【问题描述】:

我正在使用 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 变量的范围有关,但我不知道。我将不胜感激。

【问题讨论】:

    标签: python ipywidgets


    【解决方案1】:

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

    此外,如果您将 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      • 2022-06-14
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 2016-10-06
      相关资源
      最近更新 更多