首页 > 解决方案 > 感叹号在对象的表示中是什么意思

问题描述

我正在用 tkinter 编写一个 GUI 应用程序,我有不同的类来代表我的应用程序的不同页面。我试图从一个类调用一个变量到另一个类,所以我使用 repr() 函数来深入了解如何将该对象从一个类调用到另一个类。

我打了电话print(repr(listbox))

我的列表框在一个名为的类中SelectionPage,并定义为listbox = tk.Listbox(self)

表示打印为<tkinter.Listbox object .!selectionpage.!listbox>

我是 python 新手,我对这些感叹号的含义感到困惑。这甚至是调试的好方法吗?抱歉,如果这是一个重复的问题,我真的很困惑,我在其他地方找不到答案

标签: pythonpython-3.xtkinter

解决方案


感叹号在对象的表示中是什么意思

他们没有任何意义。Tkinter 开发人员只是选择给他们所有自动生成的内部小部件名称一个领先的感叹号。

Tkinter 只是一个围绕 tcl/tk 解释器的 python 包装器。在 tcl/tk 中,小部件被表示为小部件的层次结构。例如,根小部件是.. 根中的框架可能被命名为.frame. 该框架中的列表框可能被命名为.frame.lb. Tcl 接受的内容非常广泛——本质上,小部件名称可以是“.”以外的任何字符。因此使用感叹号是合法的,尽管在 tcl/tk 世界中并不常见。

当您通过实例化其中一个类来创建 Tkinter 小部件时,tkinter 必须创建一个有效的小部件名称以传递给 tcl 解释器以创建实际的小部件。在旧版本的 Tkinter 中,它使用唯一的数字(例如:)'.4368693152.4368765368'。在 python3 中,tkinter 选择使用以感叹号为前缀的更人性化的名称。

据我所知,感叹号没有特殊含义,尽管我认为它可能有助于确定小部件名称是由 tkinter 还是通过其他方式创建的。

我试图从一个类调用一个变量到另一个类,所以我使用 repr() 函数来深入了解如何将该对象从一个类调用到另一个类。

几乎可以肯定有比使用小部件的内部名称更好的方法。但是,如果您知道小部件的内部名称(例如:)".!selectionpage.!listbox"并坚持这样做,则可以使用通用小部件方法将字符串名称转换为 tkinter 小部件实例nametowidget

import tkinter as tk

root = tk.Tk()
frame = tk.Frame(root)
listbox = tk.Listbox(frame)

listbox_name = str(listbox)
lb = root.nametowidget(listbox_name)

assert lb is listbox

顺便说一句,如果您不喜欢自动生成的名称,您可以为小部件命名。这适用于除根小部件之外的所有小部件。

import tkinter as tk

root = tk.Tk()
frame = tk.Frame(root, name="my_frame")
listbox = tk.Listbox(frame, name="my_listbox")

assert str(listbox) == ".my_frame.my_listbox"

推荐阅读