python-3.x - 焦点问题
问题描述
我正在尝试将焦点返回到第一个条目。如果您将焦点移动到下一个条目或按钮并单击按钮,焦点将返回到第一个条目。当我尝试使用 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()
解决方案
如果我运行您的代码,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()
推荐阅读
- c# - Web API C#中没有数据只显示括号
- excel - 使用 VBA 将数据透视表与切片器连接
- c++ - 多个 DLL 之间的 C++ 共享接口
- sql - 如何在 Oracle 中比较选定的查询结果?
- wordpress - 4 页中的 2 个 WordPress 站点,请求是从 HTTP 发送的。如何将它从 HTTP 更改为 HTTPS?
- c# - C#中使用Webclient获取页面资源
- java - 当关闭挂钩或终结器未完成时会发生什么?
- apache-spark - monotonically_increasing_id 大于数据框中的总记录
- html - 如何在 Angular 8 中自定义选择框?
- java - 调用最终类的静态方法时如何PowerMockito.doNothing?