您如何找到小部件的唯一且恒定的 ID?

use*_*512 4 python user-interface tkinter widget python-3.x

请注意,通过小部件,这不包括画布项目(不是小部件)。

我的目标是构建两个类:一个生成画布小部件的项目,另一个生成小部件本身。这是为了确保我可以在窗口中移动东西并在重新打开时将其保留在那里。我已经为画布项目做到了这一点。你看,画布小部件实际上返回一个实际的 ID,它对于受尊重的项目保持不变,因此我可以引用它,它是坐标。

但是,对于小部件本身,似乎没有这种获取 ID 的方法。我试过widget.getint(),widget.getvar()等。 我也试过 repr(widget)and id(widget),但是这两个值在重新打开时都会发生变化,我认为创建了新的小部件,其中变量仅指新创建的小部件与刚刚销毁的小部件相比,即使它具有相同的属性。

我还尝试将所述小部件放在父窗口中,如窗口或框架,但这些小部件本身不会为其各自的子小部件分配任何唯一值。

所以基本上,我可以获得任何给定小部件的唯一值,但没有一个是恒定的。顺便说一下,这可以是任何值,因为我只是将它转换为字符串,将其附加到字典,并将坐标分配给所述 str 以引用特定的小部件。

预先感谢您的任何指导,非常感谢:)

Bry*_*ley 9

您无法获得唯一的、固定的 ID,但您可以小部件提供唯一的、固定的 ID。

在幕后,tkinter 使用 tk。在 tk 中,每个小部件都有一个名称,并存在于通过点符号表示的层次结构中。在 tk 中,您必须在创建小部件时定义一个名称;这是 tkinter 为您做的事情。当您看到像“.1234567890.0987654f321”这样的小部件名称时,这意味着父级的内部名称为“.1234567890”,而小部件的名称为“0987654321”。

您可以通过在创建小部件时使用name参数指定名称来覆盖自动生成的名称。然后您可以使用str来获取名称。

例如:

>>> import Tkinter as tk
>>> root = tk.Tk()
>>> f = tk.Frame(root, name="foo")
>>> b1 = tk.Button(f, name="b1")
>>> str(b1)
'.foo.b1'
>>> root.nametowidget(".foo.b1")
<Tkinter.Button instance at 0x100795488>
>>> b1
<Tkinter.Button instance at 0x100795488>
Run Code Online (Sandbox Code Playgroud)