Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

créer des événements personnalisés pour des widgets Tkinter personnalisés

2 réponses
Avatar
TP
Bonjour à tous,

J'ai créé une classe widget Tkinter de type "Scale" customizé (avec
possibilité d'échelle logarithmique, "entry" associée, et encore d'autres
options).

Pour communiquer avec le reste de l'interface graphique, je pensais à un
envoi d'événement de type "value_modified", qui serait traité par les
éléments de l'interface qui en ont besoin. Le problème est que je ne vois
pas comment créer un événement pour mon widget personnalisé, ni la
méthode "bind" associée.

J'ai donc cherché à comprendre comment marchent les événements dans Tkinter:
pas simple. J'ai regardé dans Tkinter.py. La classe de base est "Misc",
dont dérive "BaseWidget", puis "Widget" (qui dérive aussi
de "Pack", "Place", "Grid"), puis "Scale". La méthode bind est dans la
classe de base "Misc". Elle utilise "_bind". Mais ce n'est pas simple à
comprendre.

Que me conseillez-vous?

Par ailleurs, connaissez-vous des sites donnant des conseils sur
l'architecture à donner aux interfaces graphiques, particulièrement en
Python/Tk.

Merci

Julien
--
TP (Tribulations Parallèles)

"Allez, Monsieur, allez, et la foi vous viendra." (D'Alembert).

2 réponses

Avatar
Eric Brunel
On Fri, 04 Jul 2008 11:17:15 +0200, TP
wrote:

Bonjour à tous,

J'ai créé une classe widget Tkinter de type "Scale" customizé (avec
possibilité d'échelle logarithmique, "entry" associée, et encore d'autres
options).

Pour communiquer avec le reste de l'interface graphique, je pensais à un
envoi d'événement de type "value_modified", qui serait traité par les
éléments de l'interface qui en ont besoin. Le problème est que je ne vois
pas comment créer un événement pour mon widget personnalisé, ni la
méthode "bind" associée.

J'ai donc cherché à comprendre comment marchent les événements dans
Tkinter:
pas simple. J'ai regardé dans Tkinter.py. La classe de base est "Misc",
dont dérive "BaseWidget", puis "Widget" (qui dérive aussi
de "Pack", "Place", "Grid"), puis "Scale". La méthode bind est dans la
classe de base "Misc". Elle utilise "_bind". Mais ce n'est pas simple à
comprendre.



Le module Tkinter n'est que la partie émergée de l'iceberg. Le traitement
effectif est presque toujours réalisé par l'interpréteur tcl/tk
sous-jacent. Je ne saurais trop te conseiller d'apprendre un minimum ce
langage, ce qui simplifie énormément la compréhension de ce qui se passe
dans les applications Tkinter. De plus, cela permet d'utiliser directement
la documentation tcl/tk, qui est toujours plus à jour et complète que
toutes les documentations Tkinter que j'ai pu voir. La documentation
tcl/tk est ici: http://www.tcl.tk/man

Concernant ta question, il n'y a en fait rien à "définir". Les événements
en tk sont de simples chaînes de caractères, repérables uniquement parce
qu'ils sont de la forme "<...>". Pour un événement personnalisé, c'est
pareil: c'est une chaîne. Sauf que cette fois, il faut doubler les <>.
Donc pour ce que tu veux faire, tu peux "créer" simplement un événement
"<<value_modified>>" et ça marchera. Les "bindings" se font comme
d'habitude: widget.bind('<<value_modified>>', action). Pour la génération
de l'événement, la méthode à utiliser est event_generate.

Exemple:
----------------------------------------------------
from Tkinter import *

root = Tk()

def gen_event():
root.event_generate('<<value_modified>>')

Button(root, text='Go!', command=gen_event).pack()

lbl = Label(root, width , text='No event received')
lbl.pack()
counter = 0
def recv_event(event):
global counter
counter += 1
lbl.configure(text='%s event(s) received' % counter)

root.bind('<<value_modified>>', recv_event)

root.mainloop()
----------------------------------------------------

Par ailleurs, connaissez-vous des sites donnant des conseils sur
l'architecture à donner aux interfaces graphiques, particulièrement en
Python/Tk.



Recherche MVC sur Google; ça devrait déjà te donner une idée de comment
architecturer correctement une appli graphique.

HTH
--
python -c "print ''.join([chr(154 - ord(c)) for c in
'U(17zX(%,5.zmz5(17l8(%,5.Z*(93-965$l7+-'])"
Avatar
TP
Eric Brunel wrote:

Concernant ta question, il n'y a en fait rien à "définir". Les événements



Merci beaucoup pour ta réponse, qui va m'être beaucoup utile.

Julien

--
TP (Tribulations Parallèles)

"Allez, Monsieur, allez, et la foi vous viendra." (D'Alembert).