Что означают восклицательные знаки при представлении объекта
Они ничего не значат. Разработчики Tkinter просто решили дать всем своим автоматически сгенерированным именам внутренних виджетов лидирующий восклицательный знак.
Tkinter - просто оболочка python вокруг интерпретатора tcl / tk. В tcl / tk виджет представлен в виде иерархии виджетов. Например, виджет root равен .
. Кадр в root может называться .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
Кстати, вы можете дать виджетам имя, если вам не нравится автоматически сгенерированное имя. Это работает для всех виджетов, кроме виджета root.
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"