Python ipyleaflet on_单击for循环中的事件在每次迭代中调用函数

Python ipyleaflet on_单击for循环中的事件在每次迭代中调用函数,python,python-3.x,ipyleaflet,Python,Python 3.x,Ipyleaflet,我一直在地图上绘制标记,每个标记都有自己的位置和样本id。我正在尝试在每个标记上添加一个click_事件,以便每个标记在被单击时打印出其样本id。我的主要问题是on_click事件,它似乎在我单击标记之前在每次迭代中调用button_click函数 capitol_loc = (38.89, -77.02) #(lat, long) m = Map(center=(capitol_loc), zoom=14) locations = [(38.89, -77.02), (38.88, -77.0

我一直在地图上绘制标记,每个标记都有自己的位置和样本id。我正在尝试在每个标记上添加一个click_事件,以便每个标记在被单击时打印出其样本id。我的主要问题是on_click事件,它似乎在我单击标记之前在每次迭代中调用button_click函数

capitol_loc = (38.89, -77.02) #(lat, long)
m = Map(center=(capitol_loc), zoom=14)
locations = [(38.89, -77.02), (38.88, -77.02), (38.88, -77.01), (38.873, -77.02), (38.891, -77.02), (38.89, -77.022)]

def button_click(sample_id):
    print(str(sample_id))


for i in range(len(locations)):
    new_marker_loc = (locations[i][0], locations[i][1])
    new_marker = Marker(location=new_marker_loc, draggable=False)
    
    sample_id = "Sample Id: 1234567"
    
    new_marker.on_click(button_click(sample_id)) 
    m.add_layer(new_marker)
    
m  #Display map
输出:


我注意到的一件奇怪的事情是,如果我设置on_click事件来调用一个没有参数的函数(在本例中是简单的“hello world”函数),它可以正常工作,但是,我需要for循环中的一个参数,

一个可能的解决方案是创建一个返回相应函数的函数:

def create_button_click(val):
    def button_click():
        print(val)
    
    return button_click
然后,您可以将此返回函数传递给单击时标记事件:

new_marker.on_click(create_button_click(val))