Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

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

29 views
Skip to first unread message

TP

unread,
Jul 4, 2008, 5:17:15 AM7/4/08
to
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).

Eric Brunel

unread,
Jul 15, 2008, 5:38:50 AM7/15/08
to
On Fri, 04 Jul 2008 11:17:15 +0200, TP <Tribul...@Paralleles.invalid>
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=20, 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

unread,
Jul 15, 2008, 5:13:56 PM7/15/08
to
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.

0 new messages