在 Tkinter 中单击按钮时弹出菜单

Popup Menu on Button Click in Tkinter

我的代码有一个小问题。 我的界面上需要一个弹出菜单,它不是在按下鼠标右键时弹出,而是在单击按钮(tkinter 小部件)时弹出。

例如:http://effbot.org/zone/tkinter-popup-menu.htm

但是,我想在与按钮相同的坐标处创建弹出菜单,而不是事件坐标。

self.popup_menu.tk_popup(x_button, y_button, 0)

问题是,当我移动我的界面 window 或滚动滚动条(我的界面中有一个)并再次单击按钮时,弹出菜单创建的位置不在按钮是。似乎 .tk_popup 只采用 window 坐标而不是 canvas 坐标。

有人知道解决方案吗?

编辑: 这是一个例子:

from Tkinter import *

root = Tk()

popup = Menu(root, tearoff=0)
popup.add_command(label="Main Product")
popup.add_command(label="Side Product")

def popupm(x, y):
     try:
           popup.tk_popup(x, y, 0)
     finally:
           popup.grab_release()

x = 10
y = 15
bt = Button(root, text='Menu', command= lambda: popupm(x , y))
bt.place(x = 10, y = 15)

root.mainloop()

您好!

按钮有几个方法可以满足您的需求:.winfo_rootx() 和 .winfo_rooty() 这是一个工作示例:

from Tkinter import *

root = Tk()

popup = Menu(root, tearoff=0)
popup.add_command(label="Main Product")
popup.add_command(label="Side Product")

def popupm(bt):
     try:         
        x = bt.winfo_rootx()
        y = bt.winfo_rooty()
        popup.tk_popup(x, y, 0)
     finally:
           popup.grab_release()

bt = Button(root, text='Menu')
bt.configure(command = lambda: popupm(bt))
bt.place(x = 10, y = 15)

root.mainloop()

我在 python3 中测试了它,如果它不能转换为 2,抱歉。 如果您有任何问题或需要帮助调整一下,请告诉我们。