如何使用默认的 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=0
、y=0
。这将触发与序列关联的所有回调(它们是否与 bind
、bind_class
或 bind_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>')
我正在尝试按需调用默认小部件行为。基于 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
:
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=0
、y=0
。这将触发与序列关联的所有回调(它们是否与 bind
、bind_class
或 bind_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>')