créer des événements personnalisés pour des widgets Tkinter personnalisés
2 réponses
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).
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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 *
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+-'])"
On Fri, 04 Jul 2008 11:17:15 +0200, TP <Tribulations@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 *
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 *