Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在tkinter中使用for循环创建超链接标签,同时将每个标签绑定到不同的回调_Python_For Loop_Tkinter_Label_Bind - Fatal编程技术网

Python 在tkinter中使用for循环创建超链接标签,同时将每个标签绑定到不同的回调

Python 在tkinter中使用for循环创建超链接标签,同时将每个标签绑定到不同的回调,python,for-loop,tkinter,label,bind,Python,For Loop,Tkinter,Label,Bind,我有一个这样的口述: dict = {"site1": link to site1, "site2": link to site2, "site3": link to site3, [...] } 我也不知道在dict中会有多少个站点 我试图实现的是将不同的链接绑定到for循环中动态创建的标签。我想做一个有名字列表的窗口,当你点击名字时,它会在网站上重定向你 我使用下面

我有一个这样的口述:

dict = {"site1": link to site1,
        "site2": link to site2,
        "site3": link to site3,
        [...]
        }

我也不知道在dict中会有多少个站点

我试图实现的是将不同的链接绑定到for循环中动态创建的标签。我想做一个有名字列表的窗口,当你点击名字时,它会在网站上重定向你

我使用下面的例子,但没有成功

from tkinter import Tk, Label, StringVar
import webbrowser

root = Tk()

list1 = ["site1-google","site2-facebook"]
list2 = ["google.com", "fb.com"]

for v1, v2 in zip(list1, list2):

    item_values = '{}'.format(v1)
    sv = StringVar()
    lbl = Label(root, width="100", height="2",textvariable=sv)
    lbl.pack()
    lbl.bind("<Button-1>", lambda e: callback(v2))

    

    sv.set(item_values)
    
    def callback(url):
        webbrowser.open_new(url)

root.mainloop()
从tkinter导入Tk、标签、StringVar
导入网络浏览器
root=Tk()
列表1=[“site1谷歌”、“site2 facebook”]
列表2=[“google.com”,“fb.com”]
对于zip中的v1、v2(列表1、列表2):
项目值=“{}”。格式(v1)
sv=StringVar()
lbl=标签(根,宽度=“100”,高度=“2”,文本变量=sv)
lbl.pack()
lbl.bind(“,lambda e:callback(v2))
sv.set(项目值)
def回调(url):
webbrowser.open_new(url)
root.mainloop()
当我运行该程序时,它只是将列表2中的“最后一个站点”绑定到所有新创建的标签上

我在某个地方读到lambda是延迟绑定的,因此它将在每次给定列表的最后一个值绑定时进行绑定,但我不知道如何解决这个问题


我该怎么做呢?

你可能不需要回调函数,没有回调函数也可以,只需执行
lbl.bind(“”,lambda e,url=v2:webbrowser.open\u new(url))
就行了!我真的很感激,伙计!我可以问一下这个解决方案是如何工作的吗?我还在学习,找不到关于它的文档,你来了,只用一行就解决了。!在循环中使用
lambda
时,我们需要传递lambda函数中使用的参数,否则只考虑for循环的最后一个值(您可以进一步阅读),您可能不需要
回调
函数,也可以不用它,只需执行
lbl.bind(“,lambda e,url=v2:webbrowser.open\u new(url))
好吧,那就行了!我真的很感激,伙计!我可以问一下这个解决方案是如何工作的吗?我还在学习,找不到关于它的文档,你来了,只用一行就解决了。!在循环中使用
lambda
时,我们需要传递lambda函数中使用的参数,否则只考虑for循环的最后一个值(您可以进一步读取)