python - 感叹号在对象的表示中是什么意思
问题描述
我正在用 tkinter 编写一个 GUI 应用程序,我有不同的类来代表我的应用程序的不同页面。我试图从一个类调用一个变量到另一个类,所以我使用 repr() 函数来深入了解如何将该对象从一个类调用到另一个类。
我打了电话print(repr(listbox))
我的列表框在一个名为的类中SelectionPage
,并定义为listbox = tk.Listbox(self)
表示打印为<tkinter.Listbox object .!selectionpage.!listbox>
我是 python 新手,我对这些感叹号的含义感到困惑。这甚至是调试的好方法吗?抱歉,如果这是一个重复的问题,我真的很困惑,我在其他地方找不到答案
解决方案
感叹号在对象的表示中是什么意思
他们没有任何意义。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"
推荐阅读
- python - 尝试安装 azureml-interpret 时出现多个错误
- python - 约束函数的全局最小化算法
- javascript - 文件未作为文件名下载,而是以角度的 file_key 形式下载
- python - 如何从主列表中删除重复的列表[python]
- python - 如何从 Python 脚本在 IDLE 中打开 Python 脚本
- html - 跨度作为按钮 Safari 问题
- python - 如何使用日期时间对象保存和加载二维数组?
- flutter - Flutter Web 发布请求
- javascript - 如何决定在异步方法的 async.parallel 数组中包含哪些方法以及拒绝哪些方法
- python - 如何在 FastAPI 中自动将请求添加到基于类的视图中的所有路径操作