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

问题描述:

我使用从tkinter笔记本。
我需要关闭时,我做就可以了右键单击一个标签。
但我不能找到一种方法来处理它的任何事件。 所以我希望有人能帮助我。 我只是需要一个例子,所以如果你需要任何东西(代码等)问我。是否可以将鼠标事件绑定到笔记本的选项卡上?

Demonstration by picture

可以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) 

,现在你可以使用这个指标来关闭标签。

(你可以看到类似的命令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() 

如果删除if clicked_tab == active_tab:那么你可以关闭所有的tab,不仅活跃。

+0

按照Python和TK TTK文档,'Notebook.forget'适用于任何“tab_id”,不只是一个选项卡索引。如果“名字的由Notebook.identify()返回'和'Notebook.select()'是tab_ids,因为他们必须为'Notebook.index'工作,它似乎是在'tk.call'和'NB。索引'调用是不需要的。真正?? –

+0

@TerryJanReedy在我的电脑上'identify()'总是返回字符串'label'或'padding' - 但它不是标签ID或标签索引:/我在tk docs中找到了'indentify tab'。它返回标签索引,所以我需要'nb.index()'将标签ID('nb.select()')转换为标签索引,以将''clicked tab'与'active tab'进行比较。 – furas

+0

我想知道这是否是故意的。该文件,如它是非常模糊的。我想到的是,我们可以继承一个像Notebook这样的widget并添加更多有用的tk.call包装。 –