如何为多个小部件添加带链接的右键菜单?
我的问题是跟这个问题有点关系。
我想要在右键点击某个控件后,对它执行一个操作。
条件:
- 在“我的标签 2”上右键点击
- 选择“显示标签”
期望的结果:
=> “我的标签 2”应该被打印出来
解决问题的初始代码:
from Tkinter import * # Tkinter -> tkinter in Python 3
root = Tk()
def print_label():
print "Please, help me to print the label which has been clicked !"
def popup(event):
menu.post(event.x_root, event.y_root)
# create a popup menu
menu = Menu(root, tearoff=0)
menu.add_command(label="Display the label", command=print_label)
# create the 3 labels
label1_text=StringVar()
label2_text=StringVar()
label3_text=StringVar()
label1_text.set("my label 1")
label2_text.set("my label 2")
label3_text.set("my label 3")
label1=Label(root, textvariable=label1_text)
label2=Label(root, textvariable=label2_text)
label3=Label(root, textvariable=label3_text)
label1.pack()
label2.pack()
label3.pack()
# attach popup to frame
label1.bind("<Button-3>", popup)
label2.bind("<Button-3>", popup)
label3.bind("<Button-3>", popup)
root.mainloop()
1 个回答
3
为了尽量少改动现有的代码,你需要做三件事:
创建一个全局变量,用来保存当前选中的标签的引用。
在
popup
函数里,把这个变量设置为event.widget
,这样它就会指向当前选中的标签。在
print_label
函数里,通过访问这个标签的"text"
键来打印出它的文本。
下面是你程序的修正版本。我改动的地方在注释框里:
from Tkinter import * # Tkinter -> tkinter in Python 3
root = Tk()
#############################################################
selected = None # This is the variable mentioned in step 1
def print_label():
print selected["text"] # This is step 3
def popup(event):
global selected # Tell Python that selected is global
menu.post(event.x_root, event.y_root)
selected = event.widget # This is step 2
#############################################################
# create a popup menu
menu = Menu(root, tearoff=0)
menu.add_command(label="Display the label", command=print_label)
# create the 3 labels
label1_text=StringVar()
label2_text=StringVar()
label3_text=StringVar()
label1_text.set("my label 1")
label2_text.set("my label 2")
label3_text.set("my label 3")
label1=Label(root, textvariable=label1_text)
label2=Label(root, textvariable=label2_text)
label3=Label(root, textvariable=label3_text)
label1.pack()
label2.pack()
label3.pack()
# attach popup to frame
label1.bind("<Button-3>", popup)
label2.bind("<Button-3>", popup)
label3.bind("<Button-3>", popup)
root.mainloop()