gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:26:07 27 4
gpt4 key购买 nike

我知道 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),但我的尝试只显示两个菜单,但第一个菜单重叠,所以另一个不显示。

所以问题是,我如何做到这样,当单击鼠标中键时,它会打开第一个菜单,然后自动运行级联,就像它被单击一样?如果您不明白我所解释的内容,请随时提问。

最佳答案

So the question is, how do I make it so when middle-clicking, it opensthe first menu AND then automatically runs the cascade, as if it wasclicked?

考虑this answer by Bryan Oakley以及 Internet 上提供的文档,无法同时显示菜单和子菜单。 “这不是 Tkinter 菜单设计的工作方式。”

您必须在不使用小部件 tk.Menu 的情况下创建自定义菜单栏。


When I middle-click, I tried to make it so it displays both the menus(my_menu, my_menu2), but my attempt just displays both but with thefirst menu overlapping, so the other doesn't show.

它们不重叠。即使您使用一些整数为 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> 绑定(bind)),输出为:

Before my_menu popup

my_menu 在屏幕上可见。然后,当用户点击该菜单的焦点之外时,my_menu 消失,您将获得以下输出:

After my_menu popup
Before my_menu2 popup
After my_menu2 popup

子菜单出现在屏幕上,但由于点击退出,新的焦点在根上,子菜单不到一秒就消失了。

关于tkinter - 如何在 tkinter 菜单中自动打开子菜单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71833959/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com