J'écris une application graphique avec tkinter et j'ai différentes classes qui représentent différentes pages de mon application. J'essaie d'appeler une variable d'une classe à une autre, j'ai donc utilisé la fonction repr () pour mieux comprendre comment appeler cet objet d'une classe à l'autre.

J'ai appelé print(repr(listbox))

ma zone de liste se trouve dans une classe nommée SelectionPage et est définie comme listbox = tk.Listbox(self)

la représentation imprimée comme <tkinter.Listbox object .!selectionpage.!listbox>

Je suis nouveau sur python et je suis confus quant à la signification de ces points d'exclamation. Est-ce même un bon moyen de déboguer ?? Désolé s'il s'agit d'une question en double, je suis vraiment confus et je n'ai pas pu trouver la réponse ailleurs

3
coding_guy69 14 janv. 2020 à 22:17

1 réponse

Meilleure réponse

Que signifient les points d'exclamation dans la représentation d'un objet

Ils ne veulent rien dire. Les développeurs de Tkinter ont simplement choisi de donner à tous leurs noms de widgets internes générés automatiquement un principal point d'exclamation.

Tkinter n'est qu'un wrapper python autour d'un interpréteur tcl / tk. Dans tcl / tk, un widget est représenté comme une hiérarchie de widgets. Par exemple, le widget racine est .. Un cadre à la racine peut être nommé .frame. Une zone de liste dans ce cadre peut être nommée .frame.lb. Tcl est très large dans ce qu'il acceptera - essentiellement, un nom de widget peut être n'importe quel caractère autre que "." l'utilisation d'un point d'exclamation est donc légale, bien que rare dans le monde tcl / tk.

Lorsque vous créez un widget Tkinter en instanciant l'une de ses classes, tkinter doit créer un nom de widget valide à transmettre à l'interpréteur tcl afin de créer le widget réel. Dans les anciennes versions de Tkinter, il utilisait des numéros uniques (par exemple: '.4368693152.4368765368'). En python3, tkinter a choisi d'utiliser des noms plus conviviaux préfixés par un point d'exclamation.

Pour autant que je sache, le point d'exclamation n'a pas de signification particulière, bien que je suppose qu'il pourrait être utile pour déterminer si un nom de widget a été créé par tkinter ou par d'autres moyens.

J'essaie d'appeler une variable d'une classe à une autre, j'ai donc utilisé la fonction repr () pour mieux comprendre comment appeler cet objet d'une classe à l'autre.

Il existe presque certainement de meilleures façons de le faire que d'utiliser le nom interne du widget. Cependant, si vous connaissez le nom interne du widget (par exemple: ".!selectionpage.!listbox") et insistez pour le faire de cette façon, vous pouvez convertir le nom de chaîne en l'instance de widget tkinter avec la méthode de widget universel 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

Soit dit en passant, vous pouvez donner un nom aux widgets si vous n'aimez pas le nom généré automatiquement. Cela fonctionne pour tous les widgets à l'exception du widget racine.

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"
1
Bryan Oakley 14 janv. 2020 à 20:07