Это метод привязки меню к метке с StringVar
, я использовал его в прошлом для похожих вариантов выбора.
import tkinter as tk
def Click(e, var):
def E(var):
var.set("Excellent")
def VG(var):
var.set("Very Good")
def G(var):
var.set("Good")
def P(var):
var.set("Poor")
e.widget.focus()
nclst=[(' Excellent', lambda var = var: E(var)),
(' Very Good', lambda var = var: VG(var)),
(' Good', lambda var = var: G(var)),
(' Poor', lambda var = var: P(var)),]
my_menu = tk.Menu(None, tearoff=0, takefocus=0)
for (txt, cmd) in nclst:
my_menu.add_command(label=txt, command=cmd)
my_menu.tk_popup(e.x_root+40, e.y_root+10,entry="0")
root = tk.Tk()
root.geometry('200x200')
l_var = tk.StringVar()
lab = tk.Label(root, textvariable = l_var, width = 10)
l_var.set("Excellent")
lab.bind('<Button-1>', lambda e, var = l_var: Click(e, var))
lab.pack()
root.mainloop()
Вы можете создать горизонтальное меню, используя Toplevel, например:
import tkinter as tk
def Click(e, var):
def E(m, var):
var.set("Excellent")
m.destroy()
def VG(m, var):
var.set("Very Good")
m.destroy()
def G(m, var):
var.set("Good")
m.destroy()
def P(m, var):
var.set("Poor")
m.destroy()
e.widget.focus()
my_menu = tk.Toplevel()
nclst=[(' Excellent', lambda e, m = my_menu, var = var: E(m, var)),
(' Very Good', lambda e, m = my_menu, var = var: VG(m, var)),
(' Good', lambda e, m = my_menu, var = var: G(m, var)),
(' Poor', lambda e, m = my_menu, var = var: P(m, var)),]
my_menu.overrideredirect(1) # Removes border
def_bg = my_menu.cget("bg") # Store default background color
for (txt, cmd) in nclst:
my_lab = tk.Label(my_menu, text = txt)
my_lab.pack(side = 'left')
my_lab.bind('<Enter>', lambda e: e.widget.config(bg = 'SystemHighlight', fg = 'white'))
my_lab.bind('<Leave>', lambda e: e.widget.config(bg = def_bg, fg = 'black'))
my_lab.bind('<Button-1>', cmd)
my_menu.update_idletasks()
my_menu.grab_set()
w = my_menu.winfo_width()
h = my_menu.winfo_height()
my_menu.geometry("%dx%d+%d+%d" % (w, h,e.x_root, e.y_root+10))
root = tk.Tk()
root.geometry('200x200')
l_var = tk.StringVar()
lab = tk.Label(root, textvariable = l_var, width = 10)
l_var.set("Excellent")
lab.bind('<Button-1>', lambda e, var = l_var: Click(e, var))
lab.pack()
root.mainloop()