如何处理tkinter.菜单tearofcommand?

2024-09-30 22:23:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个用tearoff=1创建的级联tkinter.Menu。 向tearofcommand传递两个参数:

  • 菜单窗口的名称(父窗口的窗口ID?),它是一个类似“#!menu.#!menu#!menu3”的字符串,以及
  • 撕下菜单窗口的名称(新撕下菜单根窗口的窗口ID),类似于“.tearof1”的字符串

我能用这些信息做什么? 下面是我想做的:默认情况下,撕下的菜单被放置在屏幕位置(x=0,y=0),但我想将它放置在另一个(x,y)位置

我怎样才能做到这一点

尝试按建议使用“nametowidget”的示例代码:

import tkinter as tk

class App:
    def __init__(self, root):
        menubar = tk.Menu(root)
        menuA = tk.Menu(menubar, tearoff=0)
        menuB = tk.Menu(menubar, tearoff=0)
        menuC = tk.Menu(menubar, tearoff=1, tearoffcommand=self.onTearoff)
        menuC.add_command(label="Menu Row1")
        menuC.add_command(label="Menu Row2")
        menuC.add_command(label="Menu Row3")
        menubar.add_cascade(label="MenuA", menu=menuA)
        menubar.add_cascade(label="MenuB", menu=menuB)
        menubar.add_cascade(label="MenuC", menu=menuC)
        self.menubar = menubar
        root.config(menu=menubar)
        root.geometry("300x200")

    def onTearoff(self, wParent, wMenu):
        print("onTearoff(%s, %s)" % (wParent, wMenu)) # wMenu = ".tearoff1"
        w = root.nametowidget(wMenu) # KeyError: 'tearoff1'
        w.geometry("+50+50")

if __name__ == "__main__":
    root = tk.Tk()
    app = App(root)
    root.mainloop()

Tags: selfadd菜单rootlabelcommandtkcascade