如何通过单击将焦点设置到小部件(不是条目)上?

时间:2018-10-22 13:31:45

标签: python python-3.x events tkinter

之所以需要这样做,是因为我无需使用条目就可以更改标签的文本。我想改用事件。

我已经尝试过了:

import tkinter as tk

root = tk.Tk()
root.bind("<Button-1>", lambda _: root.focus())

l = tk.Label(root, width=50, height=50, bg="white")
l.bind("<Button-1>", lambda _: l.focus())
l.bind("1", lambda _: l.config(bg="yellow"))
l.bind("2", lambda _: l.config(bg="white"))
l.pack()

root.mainloop()

运行程序时,我希望能够通过以下方式将标签l的颜色更改为黄色:单击它(我认为这会设置焦点),然后按1并进行更改按2返回至白色;前提是我没有在标签外单击,而是将焦点设置到根小部件(其中键1和2没有绑定到任何回调)。

我知道您可以将键绑定到回调(已对其进行测试),并且我也知道可以将焦点设置为非条目的小部件(也已对其进行测试),但这似乎不起作用

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

问题是按钮单击具有两个绑定:一个在标签窗口小部件本身上,一个在根窗口上。由于事件的处理方式,根窗口上的绑定将在标签上的事件之后触发。这意味着您对标签绑定设置的任何焦点都将与根窗口上的绑定撤消。

一种解决方案是更改单击的绑定,将焦点设置为单击的对象。这样,您无需在标签小部件上为单击设置绑定。

hammer.js

另一种解决方案是修改标签上的绑定,以防止根窗口上的绑定触发。您可以通过从调用的函数中返回字符串root.bind("<Button-1>", lambda event: event.widget.focus_set()) 来实现。

"break"