如何解读Tkinter中self.master.focus_get()返回的.!application类路径值
Tkinter焦点相关方法使用说明
输出值含义
你看到的打印结果是Tkinter内部的控件树路径标识,规则如下:
- 单独的
.代表根窗口(即你创建的Tk()实例),是所有控件的顶层父节点,无任何控件获得焦点时就会返回这个值 - 层级路径用
.分隔父子关系,比如.!application.!canvas.!text15的含义是:- 根窗口下的
!application控件(一般是你自定义的Application类实例) - 下一级的
!canvas控件(Canvas实例) - 下一级的
!text15控件(第15个自动生成的Text类实例)
出现这个输出说明你点击画布后,焦点仍然停留在之前点击的Text控件上——因为Canvas控件默认不会主动抢占焦点,所以焦点没有发生转移,才会出现你说的“留存了文本变量相关内容”的现象。
- 根窗口下的
focus()与focus_get()的区别
两个方法功能完全不同,不要混淆:
focus_get():是查询方法,返回当前持有焦点的控件实例,直接print该实例时,Tkinter会默认输出它的内部路径字符串,就是你看到的带点的结果focus()(也可写为focus_set()):是操作方法,作用是将焦点设置到调用该方法的控件上,没有返回值,直接print会得到None,不能用来查询当前焦点。
打印控件绑定对象的常用操作
如果不想只看默认的路径字符串,可以用以下方法获取控件的可识别信息:
- 自定义控件标识:创建控件时传入
name参数,比如text = Text(parent, name='user_input_text'),之后调用focus_get().winfo_name()即可拿到你自定义的名称 - 查看控件类型:调用
type(focus_get())可直接获得控件的类,比如输出<class 'tkinter.Text'> - 查看父控件:
focus_get().master可直接拿到父控件的实例,focus_get().winfo_parent()可拿到父控件的路径字符串 - 解决焦点留存问题:在Canvas的点击事件绑定逻辑中加入
self.canvas.focus_set(),点击画布时就会主动把焦点转移到画布上,不会再停留在Text控件。
内容的提问来源于stack exchange,提问作者koalatree
相关产品推荐
相关产品推荐

