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

Le
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).
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Eric Brunel
Le #16328951
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 " 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+-'])"
TP
Le #16335401
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).
Publicité
Poster une réponse
Anonyme