我有一个简单的例子,Entry和三个独立的框架。
from tkinter import *
top = Tk()
Entry(top, width="20").pack()
Frame(top, width=200, height=200, bg='blue').pack()
Frame(top, width=200, height=200, bg='green').pack()
Frame(top, width=200, height=200, bg='yellow').pack()
# Some extra widgets
Label(top, width=20, text='Label text').pack()
Button(top, width=20, text='Button text').pack()
top.mainloop()
一旦我开始在Entry中写作,键盘光标就会停留在那里,即使我用鼠标按蓝色,绿色或黄色框架也是如此。当鼠标按下另一个小部件时,如何停止在Entry中写入?在这个例子中只有三个小部件,除了Entry。但是假设有很多小部件。
答案 0 :(得分:5)
默认情况下,Frames
不会使用键盘焦点。但是,如果要在单击时给予键盘焦点,可以通过将focus_set
方法绑定到鼠标单击事件来实现:
from tkinter import *
top = Tk()
Entry(top, width="20").pack()
b = Frame(top, width=200, height=200, bg='blue')
g = Frame(top, width=200, height=200, bg='green')
y = Frame(top, width=200, height=200, bg='yellow')
b.pack()
g.pack()
y.pack()
b.bind("<1>", lambda event: b.focus_set())
g.bind("<1>", lambda event: g.focus_set())
y.bind("<1>", lambda event: y.focus_set())
top.mainloop()
请注意,要执行此操作,您需要保留对小部件的引用,就像我上面使用变量b
,g
和y
一样。
这是另一种解决方案,通过创建一个能够以键盘为焦点的Frame
子类来实现:
from tkinter import *
class FocusFrame(Frame):
def __init__(self, *args, **kwargs):
Frame.__init__(self, *args, **kwargs)
self.bind("<1>", lambda event: self.focus_set())
top = Tk()
Entry(top, width="20").pack()
FocusFrame(top, width=200, height=200, bg='blue').pack()
FocusFrame(top, width=200, height=200, bg='green').pack()
FocusFrame(top, width=200, height=200, bg='yellow').pack()
top.mainloop()
第三个选项是仅使用bind_all
使每个小部件在单击时获得键盘焦点(或者如果您只想使用某些类型的小部件来执行此操作,则可以使用bind_class
。) / p>
只需添加以下行:
top.bind_all("<1>", lambda event:event.widget.focus_set())