【问题标题】:How do you find a unique and constant ID of a widget?您如何找到小部件的唯一且恒定的 ID?
【发布时间】:2015-07-12 07:49:43
【问题描述】:

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

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

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

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

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

提前感谢您的任何指导,非常感谢:)

【问题讨论】:

  • repr(widget) 返回小部件的字符串表示形式。 id(widget) 基本上返回一个数字,表示对象在内存中的地址。请注意,id(widget) 在同一应用程序实例期间始终返回相同的数字。它可能会在应用程序的不同实例中为“相同”对象返回不同的数字。
  • 应用程序实例我的意思是当你运行你的应用程序时,这是一个实例,当你再次运行它时,这是另一个实例,等等。

标签: python user-interface python-3.x tkinter widget


【解决方案1】:

您无法获得一个唯一的、恒定的 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>

【讨论】:

  • 嗨,布莱恩,抱歉回复晚了。非常感谢您的回答,但在我的情况下,我需要将某种值附加到绑定到小部件的字典中。我明白这可能是不可能的,我可能需要给它一个这样的值,我尝试了你的建议,但即使是名称返回的值也会改变,当然除了名称。虽然这意味着我不会提前知道我需要切片以获得分配给小部件的名称的子字符串的长度。不过,再次感谢您的宝贵时间:)
【解决方案2】:

您可以创建具有 ID 的任何小部件的子类,例如:

class labelID(Label):
    def __init__(self,master):
        Label.__init__(self,master)
        self.id = 0

那么你可以在创建实例时分配一个编号:

my_label = LabelID(root)
my_label.id = 85

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 2019-12-06
    相关资源
    最近更新 更多