焦点问题

时间:2018-08-15 22:06:15

标签: python-3.x tkinter

我正在尝试将焦点返回到第一个条目。如果将焦点移至下一个条目或按钮,然后单击按钮,则焦点将返回到第一个条目。当我尝试使用Tab键执行相同的操作时,focus_set方法失败。我尝试了许多不同的方法,但结果始终是相同的。有人知道为什么吗?可能会向我展示如何正确执行呢?预先感谢。

这是我到目前为止得到的:

from tkinter import *
w = Tk()

def focus():
    box1.focus_set()

def check(event):
    if str(event.widget) == '.!entry2':
        print('focus back to box1')
        focus()

box1 = Entry(w, width=15)
box2 = Entry(w, width=15)
box1.focus_set()
box2.bind('<Tab>', check)
box1.pack()
box2.pack()

btn = Button(w, text='Box 1 Focus', command=focus)
btn.pack()
w.mainloop()

1 个答案:

答案 0 :(得分:1)

如果我运行您的代码,str(event.widget)类似于".36580648",而不是".!entry2"。您可以给小部件一个自定义名称,例如

box2 = Entry(w, width=15, name='second')

然后您可以检查if str(event.widget) == '.second'
另外,您可以只检查if event.widget == box2:,这样更容易且不易出错。

如果执行这些操作之一,则会看到'focus back to box1'已打印,但是焦点仍然转移到了按钮上而不是标签上。这是因为您的自定义事件是在<Tab>的默认事件之前触发的,该默认事件是将焦点移至下一个窗口小部件。您可以通过在函数中返回'break'来停止默认事件处理。

完整的示例将变为:

from tkinter import *
w = Tk()

def focus():
    box1.focus_set()

def check(event):
    if event.widget == box2:
        print('focus back to box1')
        focus()
        return 'break'

box1 = Entry(w, width=15)
box2 = Entry(w, width=15)
box1.focus_set()
box2.bind('<Tab>', check)
box1.pack()
box2.pack()

btn = Button(w, text='Box 1 Focus', command=focus)
btn.pack()
w.mainloop()