关于python:如何找到小部件的唯一且常量ID?

How do you find a unique and constant ID of a widget?

注意,按小部件,这不包括画布项(不是小部件)。

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

然而,对于小部件本身,似乎没有这样的方法来获取ID。我尝试过widget.getint()widget.getvar()等。我也尝试过repr(widget)id(widget),但这两个值在重新打开时都会发生变化,我认为创建了新的小部件,其中变量只是引用了新创建的小部件,而不是即使它有相同的属性,也不会被破坏。

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

所以基本上,我可以得到任何给定的小部件的唯一值,但是没有一个是常量。顺便说一下,这可以是任何值,因为我将把它转换成一个字符串,将它附加到dict,并将coords分配给所述str以引用特定的小部件。

感谢您的指导,非常感谢:)


您无法获得唯一的常量ID,但可以为小部件提供唯一的常量ID。

在发动机罩下,tkinter使用tk。在tk中,每个小部件都有一个名称,并以点表示法表示的层次结构存在。在tk中,创建小部件时必须定义一个名称;这是tkinter为您做的事情。当您看到一个小部件名如".1234567890.0987654F321"时,这意味着父部件的内部名称为".1234567890",小部件名为"0987654321"。

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

例如:

1
2
3
4
5
6
7
8
9
10
>>> 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>