是否可以将鼠标事件绑定到笔记本的选项卡上?
问题描述:
我使用从tkinter
笔记本。
我需要关闭时,我做就可以了右键单击一个标签。
但我不能找到一种方法来处理它的任何事件。 所以我希望有人能帮助我。 我只是需要一个例子,所以如果你需要任何东西(代码等)问我。是否可以将鼠标事件绑定到笔记本的选项卡上?
答
可以bind()
事件<Button-3>
(右按钮)notebook
与功能将关闭选定tab
。
nb = ttk.Notebook(root)
nb.bind('<Button-3>', on_click)
问题是认识点击如何tab
因为Tkinter的只发送x
,y
。
Tcl/Tk
具有功能indentity tab x y
将x
,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
,不仅活跃。
按照Python和TK TTK文档,'Notebook.forget'适用于任何“tab_id”,不只是一个选项卡索引。如果“名字的由Notebook.identify()返回'和'Notebook.select()'是tab_ids,因为他们必须为'Notebook.index'工作,它似乎是在'tk.call'和'NB。索引'调用是不需要的。真正?? –
@TerryJanReedy在我的电脑上'identify()'总是返回字符串'label'或'padding' - 但它不是标签ID或标签索引:/我在tk docs中找到了'indentify tab'。它返回标签索引,所以我需要'nb.index()'将标签ID('nb.select()')转换为标签索引,以将''clicked tab'与'active tab'进行比较。 – furas
我想知道这是否是故意的。该文件,如它是非常模糊的。我想到的是,我们可以继承一个像Notebook这样的widget并添加更多有用的tk.call包装。 –