如何使用默认的 bindtag 行为作为方法?

How to use default bindtag behavior as methods?

我正在尝试按需调用默认小部件行为。基于 this answer 我对 bindtags 和 taglists 有所了解。

举例来说,我有两个按钮,我希望在其标签列表中具有第一个按钮的特定项目的绑定标签行为,每当我左键单击右键时:

import tkinter as tk

root = tk.Tk()

first_btn = tk.Button(root, text="1st")
second_btn = tk.Button(root, text="2nd")

second_btn.bind("<Button-1>", "expect the bindtag operation here")

first_btn.pack()
second_btn.pack()

root.mainloop()

我没有为 first_btn 指定 command=...,因为我需要使用我的 second_btn 绑定来实现按钮按下的效果。


或者作为另一个例子,我想让 second_btn 调用 first_btn:

的所有(最好是我选择的)bindtag 回调
import tkinter as tk

root = tk.Tk()

first_btn = tk.Button(root, text="1st")
second_btn = tk.Button(root, text="2nd", command="first_btn bindtag callbacks")

first_btn.pack()
second_btn.pack()

root.mainloop()

或者,附加到绑定标签的操作的引用名称(如果有)是什么?

要调用绑定到给定序列的回调(例如<Button-1>),您可以widget.event_generate(<sequence>, **kwargs)。例如,对于 <Button-1> 事件,可选的关键字参数可以是 x=0y=0。这将触发与序列关联的所有回调(它们是否与 bindbind_classbind_all 绑定无关紧要)。

在下面的示例中,当单击第二个按钮时,它会降低第一个按钮,就好像它也被单击一样:

import tkinter as tk

root = tk.Tk()

first_btn = tk.Button(root, text="1st")
second_btn = tk.Button(root, text="2nd", command=lambda: first_btn.event_generate('<Button-1>'))

first_btn.pack()
second_btn.pack()

root.mainloop()

但是,当从命令行以交互方式进行测试时,生成键盘事件通常不起作用,因为小部件没有键盘焦点。因此,使用以下代码,当单击按钮时,View 菜单将打开,就好像我们已经完成了 Alt+v:

import tkinter as tk

root = tk.Tk()
menubar = tk.Menu(root)
viewMenu = tk.Menu(menubar, tearoff=0)
viewMenu.add_command(label="Item 1")
viewMenu.add_command(label="Item 2")
menubar.add_cascade(menu=viewMenu, label="View", underline=0)
root.config(menu=menubar)
tk.Button(root, text='Test', command=lambda: root.event_generate('<Alt-v>')).pack()
root.mainloop()

但是当我从 IPython QtConsole 执行 root.event_generate('<Alt-v>') 时,没有任何反应。解决方法是在生成事件之前强制键盘焦点:

root.focus_force()
root.event_generate('<Alt-v>')