如何使用默认绑定行为作为方法?

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>。这将触发与序列相关的所有回调(无论它们是否与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>')

以上是关于如何使用默认绑定行为作为方法?的主要内容,如果未能解决你的问题,请参考以下文章

事件事件流

js经常用到的代码片段

从意图活动访问片段方法

如何使用视图绑定从片段更改父活动中的视图[重复]

有没有更聪明的方法将布局绑定到片段?

如何通过代码设置片段标签?