如何使用默认绑定行为作为方法?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用默认绑定行为作为方法?相关的知识,希望对你有一定的参考价值。
我试图按需调用默认的小部件行为。基于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()
我还没有为command=...
指定first_btn
,因为我需要具有按钮按钮的效果,例如我的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()
或者,附加到bindtags的操作的引用名称(如果有的话)是什么?
要调用绑定到给定序列的回调(例如<Button-1>
),您可以执行widget.event_generate(<sequence>, **kwargs)
。例如,对于x=0
事件,可选的关键字参数可以是y=0
,<Button-1>
。这将触发与序列相关的所有回调(无论它们是否与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>')
以上是关于如何使用默认绑定行为作为方法?的主要内容,如果未能解决你的问题,请参考以下文章