如何在tkinter菜单中自动打开子菜单?

3

我知道menu.tk_popup()可以用于在特定坐标处打开上下文菜单,但不知道如何在其中打开子菜单,如果有意义的话。这是我编写的代码:

import tkinter as tk

root = tk.Tk()
root.geometry("500x400")

def contextMenu(e, openCascade=False):
    my_menu2 = tk.Menu(root, tearoff=False)
    my_menu2.add_command(label="command2")
    my_menu = tk.Menu(root, tearoff=False)
    my_menu.add_cascade(label="cascade1", menu=my_menu2)
    my_menu.add_command(label="command1")
    my_menu.tk_popup(e.x_root, e.y_root)
    if openCascade:
        my_menu2.tk_popup(e.x_root, e.y_root) #doesn't work

root.bind("<Button-3>", contextMenu)
root.bind("<Button-2>", lambda e: contextMenu(e=e, openCascade=True))

root.mainloop()

该代码基本上创建了一个窗口,右键单击它(< Button-3> bind),将显示第一个菜单(my_menu),其中包括一个级联菜单(cascade1)。手动运行级联菜单即可显示子菜单(my_menu2),如下图所示。 enter image description here 问题不在于右键单击,而是中间点击(< Button-2> bind)无法按照我想要的方式工作。当我中间点击时,我尝试让它显示这两个菜单(my_menu、my_menu2),但我的尝试只显示了两个菜单,但是第一个菜单重叠在前面,所以其他菜单无法显示。
所以问题是,如何使中间点击打开第一个菜单然后自动运行级联菜单,就像点击一样?如果您不理解我解释的,请不要犹豫,随时问我。
1个回答

3
所以问题是,如何在中键单击时打开第一个菜单,并自动运行级联,就像被点击一样? 考虑到Bryan Oakley的这个答案和互联网上可用的文档,没有办法让菜单和子菜单同时可见,“这不是Tkinter菜单设计的工作方式”。 您将需要创建一个自定义菜单栏,而不使用小部件tk.Menu
当我中键单击时,我尝试让它显示两个菜单(my_menu,my_menu2),但我的尝试只显示两者但第一个菜单重叠,因此不显示其他内容。 它们没有重叠。 即使您使用一些整数添加一些x-y值的间隙,仍然无法看到第二个菜单。 原因是使用tk_popuppost会使菜单在屏幕上出现,但程序的焦点会转移到用户的鼠标和键盘。 因此,除非用户从该菜单的焦点中单击,否则程序不会执行函数的下一行(您正在调用tk_popup以获取子菜单)。 在这里,您可以看到我的意思:
    .
    .
    .
    my_menu.add_command(label="command1")
    
    print("Before my_menu popup")
    my_menu.tk_popup(e.x_root, e.y_root)
    print("After my_menu popup")
    if openCascade:
        print("Before my_menu2 popup")
        my_menu2.tk_popup(e.x_root+30, e.y_root+50) #added some gap to show they are not overlapping
        print("After my_menu2 popup")

root.bind("<Button-3>", contextMenu)
root.bind("<Button-2>", lambda e: contextMenu(e,True))

root.mainloop()

因此,当您进行中键点击(<Button-2>绑定)时,输出结果如下:

Before my_menu popup

my_menu 出现在屏幕上。 当用户点击菜单外的区域时,my_menu 将消失,输出如下:

After my_menu popup
Before my_menu2 popup
After my_menu2 popup

子菜单出现在屏幕上,但由于点击了其他地方,焦点转移到了根菜单上,子菜单在不到一秒的时间内消失。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接