我在Tkinter的标签上加上一个for循环。如何在事件处理程序中识别单击了哪个标签(或其循环索引)?我想它在功能上类似于一个ListBox,但没有格式限制。我可能想把标签圈在一起,或者把它们对角线放置。我试图找到标签的坐标,但是只有当标签是第一个可见的,或者当标签被激活时重新绘制时,这些坐标才可用。在事件处理程序中传递的x,y也是标签中的x,y,它无助于标识标签。
我可以复制标签代码约10次,并有大约10个事件处理程序。这是可行的,但现在已经不是1970年了!
也许我可以将处理程序绑定到选项卡画布,并从它的坐标中识别标签。标签需要在第一个选项卡上或在活动时绘制的选项卡上。
也许我可以通过将事件处理程序保存在数组中为每个标签创建不同的事件处理程序。我需要为每个标签设置一个事件处理程序。如果标签数量发生变化,则代码将需要更改。
我目前正在尝试一个带有“”的标签。使用带有命令的按钮会更容易吗?
我错过了Python的哪个简单部分?我不能成为第一个需要这个的人!如有任何帮助或建议,将不胜感激。
发布于 2022-02-09 15:12:13
您可以在dict中为每个标签小部件保存对label文本的引用。
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.geometry('+800+50')
notebook = ttk.Notebook(root, width=300, height=200, padding=[10,10,10,10])
notebook.pack()
tab_one = tk.Frame(notebook, bg='wheat')
notebook.add(tab_one, text='Cheese', padding=[10,10,10,10])
tab_two = tk.Frame(notebook, bg='mint cream')
notebook.add(tab_two, text='Misc.', padding=[10,10,10,10])
def clicked(event):
print('Clicked:', name_dict[event.widget])
# Populating Cheese tab with clickable Labels
name_list = ['Cheddar', 'Ilchester', 'Limburger']
name_dict = {}
for index, name in enumerate(name_list):
a = tk.Label(tab_one, width=10, text=name, bg='peru')
a.grid(row=index, column=0, padx=5, pady=5)
name_dict[a] = name # Save references in a dict
a.bind('<Button-1>', clicked)
tk.Label(tab_two, text='Just some text...', bg='powder blue').pack(anchor='nw')
root.mainloop()你就是这么想的吗?
发布于 2022-02-09 16:14:09
绑定事件时,函数接收一个对象,该对象包含对接收事件的小部件的引用。在下面的示例中,请注意它如何使用event.widget引用单击的小部件。
import tkinter as tk
def update_label(event):
event.widget.configure(text="You clicked me")
root = tk.Tk()
for i in range(10):
l = tk.Label(root, text="Click me", width=20)
l.pack()
l.bind("<1>", update_label)
root.mainloop()https://stackoverflow.com/questions/71049636
复制相似问题