Что означают восклицательные знаки в представлении объекта - PullRequest
3 голосов
/ 14 января 2020

Я пишу приложение GUI с помощью tkinter, и у меня есть разные классы, которые представляют разные страницы моего приложения. Я пытаюсь вызвать переменную из одного класса в другой, поэтому я использовал функцию repr (), чтобы получить представление о том, как вызывать этот объект из одного класса в другой.

Я вызвал print(repr(listbox))

мой список находится в классе с именем SelectionPage и определен как listbox = tk.Listbox(self)

представление, напечатанное как <tkinter.Listbox object .!selectionpage.!listbox>

Я новичок в python и Я не понимаю, что означают эти восклицательные знаки. Это даже хороший способ отладки ?? Извините, если это повторяющийся вопрос, я действительно запутался и не смог найти ответ в другом месте

1 Ответ

1 голос
/ 14 января 2020

Что означают восклицательные знаки при представлении объекта

Они ничего не значат. Разработчики 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...