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

时间:2016-11-27 11:01:49

标签: python events tkinter tabs

我正在使用tkinter中的笔记本 当我正确点击它时,我需要关闭一个标签 但我找不到办法处理任何事件。 所以我希望有人可以帮助我。 我只需要一个例子,所以如果你需要任何东西(代码等),请问我。

Demonstration by picture

1 个答案:

答案 0 :(得分:3)

您可bind()事件<Button-3>(右键)到notebook,其功能将关闭所选的tab

 nb = ttk.Notebook(root)
 nb.bind('<Button-3>', on_click)  

问题是如何识别点击的tab,因为tkinter仅发送xy

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

 clicked_tab = nb.tk.call(nb._w, "identify", "tab", x, y)

现在您可以使用此索引关闭标签。

(您可以在indentify文件中看到类似的命令ttk.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()

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