是否可以将鼠标事件绑定到笔记本的选项卡?

Örl*_*log 0 python events tabs tkinter

我正在使用tkinter.
当我右键单击一个选项卡时,我需要关闭它。
但我找不到处理任何事件的方法。所以我希望有人可以帮助我。我只需要一个例子,所以如果你需要什么(代码等)问我。

图片演示

fur*_*ras 8

您可以bind()事件<Button-3>(右键),即可notebook使用功能,这将接近选择tab

 nb = ttk.Notebook(root)
 nb.bind('<Button-3>', on_click)  
Run Code Online (Sandbox Code Playgroud)

问题是如何识别点击,tab因为 tkinter 只发送x, y.

Tcl/Tk具有indentity tab x yx,转换y为 的功能tab index。但tkinter没有它。你必须调用Tcl命令:

 clicked_tab = nb.tk.call(nb._w, "identify", "tab", x, y)
Run Code Online (Sandbox Code Playgroud)

现在您可以使用此索引关闭选项卡。

(你可以indentifyttk.py文件中看到类似的命令)


简单的工作示例

import tkinter as tk
from tkinter import ttk

# --- functions ---

def on_click(event):
    print('widget:', event.widget)
    print('x:', event.x)
    print('y:', event.y)

    #selected = nb.identify(event.x, event.y)
    #print('selected:', selected) # it's not usefull

    clicked_tab = nb.tk.call(nb._w, "identify", "tab", event.x, event.y)
    print('clicked tab:', clicked_tab)

    active_tab = nb.index(nb.select())
    print(' active tab:', active_tab)

    if clicked_tab == active_tab:
        nb.forget(clicked_tab)

# --- main ---

root = tk.Tk()

# create notebook
nb = ttk.Notebook(root)
nb.pack(fill='both')

# bind function to notebook
nb.bind('<Button-3>', on_click)    

# add some tabs
for char in "ABCDEF":
    nb.add(tk.Label(nb, text=(char*15)), text=char*3)

root.mainloop()
Run Code Online (Sandbox Code Playgroud)

如果您删除,if clicked_tab == active_tab:那么您可以关闭每个tab,而不仅仅是活动的。