如何获取焦点小部件的对象名称?

Joz*_*éry 2 tkinter python-3.x

非常类似于

print("focus object class:", window2.focus_get().__class__) 
Run Code Online (Sandbox Code Playgroud)

取自此处: Python get focusedentry name ,但我需要对象的确切名称。类似于: self.entrywidget_1

或者:

如果为真,要填充占位符做什么?

print(self.focus_get().__class__)
if self.focus_get().__class__ == "placeholder":
    print("I work")
Run Code Online (Sandbox Code Playgroud)

第一个打印返回 < class 'tkinter.Entry' >

Bry*_*ley 5

你不能。任何给定的对象都可以有多个名称。例如,给定以下代码,您希望获得哪个名称?

self.foo = tk.Button(...)
self.bar = self.foo
Run Code Online (Sandbox Code Playgroud)

您很少(如果有的话)需要小部件的名称。focus_get()您所需要的就是对小部件的引用(就像返回的那样)。这样你就可以插入数据、删除数据、销毁小部件、获取小部件内容等。

如果您确实需要一些可预测的唯一标识符(在同一函数必须适用于多个小部件的情况下),您可以为每个小部件提供一个作为符号名称的自定义属性。然后您可以在运行时获取该名称。例如:

e = tk.Entry(...)
e.name = "placeholder"
...
focused_widget = root.focus_get()
print (the name of the focused widget is %s" % focused_widget.name)
Run Code Online (Sandbox Code Playgroud)

同样,您可能永远不需要它。例如,如果您想删除焦点小部件中的文本,只需使用对该小部件的引用:

focused_widget.delete(0, "end")
Run Code Online (Sandbox Code Playgroud)

如果您真正需要的是检查聚焦的小部件是否是特定的小部件,只需进行直接比较:

...
self.placeholder = tk.Entry(...)
...
def whatever(self):
    focused_widget = root.focus_get()
    if focused_widget == self.placeholder:
        print("I work")
Run Code Online (Sandbox Code Playgroud)