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循环的最后一个值(您可以进一步读取)