首页 > 解决方案 > 如何从内部函数访问在外部函数中定义的变量

问题描述

我有一个仪表板,其中根据用户选择的参数定义和显示数据框。我想添加一个按钮,允许用户在单击时下载先前定义的数据框。以下是我定义的用于定义和显示数据框的函数:

def filtra_dati(selezione, canale, metrica):
    output.clear_output()
        
    if canale == "ALL":
        df = canali_weekly.loc[(slice(None), slice(selezione[0],selezione[1])), list(metrica)]  
    else:
        df = canali_weekly.loc[(canale, slice(selezione[0],selezione[1])), list(metrica)]
    
    with output:
        pd.set_option('display.max_columns', None)
        pd.set_option('display.max_rows', None)
        display(df)

我尝试嵌套一个新函数 ( on_button_clicked()) 来添加下载按钮:

def filtra_dati(selezione, canale, metrica):
    output.clear_output()
        
    if canale == "ALL":
        df = canali_weekly.loc[(slice(None), slice(selezione[0],selezione[1])), list(metrica)]  
    else:
        df = canali_weekly.loc[(canale, slice(selezione[0],selezione[1])), list(metrica)]
    
    with output:
        pd.set_option('display.max_columns', None)
        pd.set_option('display.max_rows', None)
        display(df)
        
    def on_button_clicked(b):
        with output:
            print("Button clicked.")
            df.to_excel("~/Downloads/df.xlsx")

但它不起作用,我收到未定义数据框的错误,这让我认为我无法使用此解决方案访问上面定义的变量。

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-10-0246293b959d> in on_button_clicked(b)
     42     with output:
     43         print("Button clicked.")
---> 44         df.to_excel("~/Downloads/df.xlsx")
     45 
     46 

NameError: name 'df' is not defined

读了一些关于嵌套函数的东西,但我不确定这就是我要找的。

编辑 这是完整的代码:

kpi = [k for k in canali_weekly.columns]
dropdown_canali = widgets.Dropdown(options = crea_opzioni_con_ALL(canali_weekly.index.get_level_values(level=0)), description='Canali:')
select_metriche = widgets.SelectMultiple(options=kpi, value= kpi, rows=5, description='Metriche:')

download_dataframe = widgets.Button(description='Scarica i dati', icon='check')

def filtra_dati(selezione, canale, metrica):
    output.clear_output()
        
    if canale == "ALL":
        df = canali_weekly.loc[(slice(None), slice(selezione[0],selezione[1])), list(metrica)]  
    else:
        df = canali_weekly.loc[(canale, slice(selezione[0],selezione[1])), list(metrica)]
    
    with output:
        pd.set_option('display.max_columns', None)
        pd.set_option('display.max_rows', None)
        display(df)
        
    def on_button_clicked(b):
        with output:
            print("Button clicked.")
            df.to_excel("~/Downloads/df.xlsx")


        
        
def week_eventhandler(change):
    filtra_dati(change.new, dropdown_canali.value, select_metriche.value)       

def canali_eventhandler(change):
    filtra_dati(intRange_week.value, change.new, select_metriche.value)     
    
def metriche_eventhandler(change):
    filtra_dati(intRange_week.value, dropdown_canali.value, change.new) 
    
intRange_week.observe(week_eventhandler, names='value')
dropdown_canali.observe(canali_eventhandler, names='value')
select_metriche.observe(metriche_eventhandler, names='value')

download_dataframe.on_click(on_button_clicked)

标签: pythonpython-3.x

解决方案


推荐阅读