Hello Abdel et tous,

Merci pour cette page. Elle a répondu tout à fait à mon interrogation. Je n'ai pas encore appliqué sur mon code, mais le code du programme me laisse bon espoir. Après ça, faudra quand même que je me trouve du temps pour prendre en main la circulation dans la doc Wx, parce que les attributs des différents objets, ne s'inventent pas...


Bonne soirée,
J.-F.



Le 14/05/2017 11:59, Abdel a écrit :
Coucou JF,

Généralement, une wx.Frame est utilisée pour servir de conteneur, elle
peut inclure une barre de menu, 1 ou plusieurs panels comportant à
leurs tours différents
Widget, etc.

Le wx.Dialog est plus orienté dialogue comme son nom l'indique.

Dans mon usage personnel, je n'utilise des wx.Dialog que si j'ai à
faire à des commandes de formulaires, comme des case à cocher, des
boutons, bouton-radios, etc...

Je préfère disposer ces widgets dans une wx.Dialog plutôt qu'une
wx.Frame...

Sinon, pour la définition d'un handler unique pour tous tes boutons,
bien sûr que c'est possible !

Voici une page qui décrit la chose, in English :

https://www.blog.pythonlibrary.org/2011/09/20/wxpython-binding-multiple-widgets-to-the-same-handler/


En gros, ce sera :

buttons = [self.button1, self.button2]
for button in buttons:
    self.tonHandlerUnique(button)

Je n'ai pas eu le temps de le mettre en pratique pour ton exemple,
mais tu peux essayer si tu veux.

Voila, merci à toi.

Bien amicalement,
*Abdel.


Le 13/05/2017 à 18:10, Jean-François Colas a écrit :
Hello Abdel,

Cool, je n'imaginais pas qu'on puisse traiter un dialogue comme une
frame: quelles peuvent être alors les avantages d'une frame du coup,
en tout cas pour une utilisation courante?

Est-ce que selon toi ou vous autres, il serait possible de rendre
plus générale la méthode parcourir1 de sorte qu'elle puisse être
associée à deux boutons différents, que je puisse savoir lequel a
provoqué l'appel de cette procédure pour agir en conséquence? Vu que
c'est quasi le même code à l'exception de quelques 2 à laplace de 1
lol?

Bon je reverrai tout ça un peu plus en détail lorsque j'aurai du
braille sous les doigts...

Bonne soirée,
J.-F.


Le 12/05/2017 23:31, Abdel a écrit :
Coucou JF,

Tu as fait du beau boulot, et j'ai de bonnes nouvelles pour toi, en
matière de simplification du code.

Comme tu l'as bien compris, il est vrai que l'on ne peut avoir une
navigation tabulaire dans une wxFrame, que si l'on insère nos widgets
dans un panel, ou que l'on utilise le style wx.TAB_TRAVERSAL dans notre
Frame.

C'est vrai pour la wx.Frame, mais pas pour la wx.Dialog !

Dans une wx.Dialog, la navigation tabulaire est déja comprise par
défaut.

Donc, c'est un premier avantage.

Second avantage pour la wx.Dialog, c'est qu'elle nous épargne le
fait de
devoir se casser la tête à associer des événements pour la touche
escape, le fait de disposer d'un bouton annuler avec sa méthode
appropriée suffit pour que la wx.Dialog associe la fermeture à la
touche
escape, où que l'on soit dans celle-ci.

Donc, encore pas mal de ligne en moins...

Je te joins en PJ, ton code avec ta wx.Frame transformée en wx.Dialog,
dis-moi ce que tu en penses.

Ne rigole pas pour le nom de la classe principale, MonPtitDialog, lol !

Voila, merci pour ta passion pour le Python et le wxPython, je suis un
passionné également.

Bien amicalement,
Abdel.


Le 12/05/2017 à 21:20, Jean-François Colas a écrit :
Hello tous,

Oui, après tout, pourquoi pas vous faire part de mon petit
amusement... Pas par sagesse, oh non lol.

J'avais trois objectifs avec ce petit truc en PJ. L'un étant de
construire une petite interface pour sélectionner deux fichiers, dont
les noms à terme sont voués à être envoyés à un comparateur en ligne
de commande. Ceci à des fins d'entraînement, car j'ai déjà bricolé un
truc comme ça en AutoHotKey.

2ème objectif: avoir un programme dans lequel je puisse suivre le
cheminement de la démarche de construction d'un programme, et ceci en
me basant sur le modèle d'un super petit article de SebSauvage,
Construire une interface graphique pas à pas en Python avec Tkinter et
wxPython. D'où les numéros de 1. à 8. qui parsèment mon code.

3... tester quelques classes, en fait j'ai deux trois différentes
versions, celle-ci utilise un Panel, d'où le nom, je voulais trouver
les conditions qui me permettent de pouvoir compter sur un parcours de
tabulation.

Pour le reste... Tel quel, mon voeu concernant Echap est à peu près
exaucé, à part le fait que cet engin de script provoque un bip lorsque
j'appuie sur Echap, c'est peut-être dû à la manière employée pour
sortir du programme...

Sinon, je serais assez d'accord pour n'avoir qu'une seule procédure
pour parcourir, au lieu de parcourir1 et parcourir2, mais je ne sais
comment déterminer alors le bouton qui aura provoqué l'arrivé dans
cette méthode-là.

Et dernière question: aurait-on pu mettre ces différents contrôles
dans une classe wx.Dialog?

A priori, dans ce code, au stade où il en est, je comprends... à peu
près tout je crois.

A votre sagacité et à vos commentaires, tout ceci parfaitement
optionnel bien sûr!

Bonne soirée,
J.-F.


Le 12/05/2017 16:16, Abdel a écrit :
Coucou Yannick, JF et tous,

JF, pour mieux pouvoir te venir en aide, il serait peut-être plus
sage de nous communiquer le code complet de ton essai, cela nous
permettrait de mieux pouvoir mettre le doigt sur le point qui pose
problème.

Est-ce que ta classe est une wx.Dialog, ou wx.Frame.

Si c'est une wx.Dialog, Yannick a parfaitement raison, la touche
escape n'a pas besoin d'être assignée à un événement, puisqu'elle
déclenche automatiquement la fermeture du dialogue.

Cependant, si ta classe est une wx.Frame, il faut associer un
événement wx.EVT_KEY_DOWN à chacun de tes widgets.

Par exemple,sous la forme suivante :

for item in [self.button1, self.checkbox1, self.button2, ect.]:
item.Bind(wx.EVT_KEY_DOWN, selfTaMethodeDeFermeture)


Dans ce cas de figure bien précis, puisque escape n'est pas une
touche associée à la frappe d'un caractère, on n'utilise pas
l'événement wx.EVT_CHAR, il ne faut garder cet événement wx.EVT_CHAR
qu'à l'intérieur de ta ou tes wx.TextCtrl.

Voila, merci à toi.

Bien amicalement,
Abdel.


Le 12/05/2017 à 15:45, yannick a écrit :
salut JF, pour l'instant j'ai 2 proposition :

1 copié collé de mon petit cahier :(boite de dialogue )

remarque ^...
en utilisant la valeur wx.ID_CANCEL,on a:
1.inutil de donner un nom au bouton annuler,
2. inutil de lui assigner un rôle, car son rôle lui sera assigner
par défaut (fermeture de la fenêtre.

2.pour ajouter une touche de raccouci de mémoire tu peux utiliser

RegisterHotKey


Le 12/05/2017 à 15:31, jfco...@free.fr a écrit :
Hello Yannick et tous,

En fait, au départ, c'est bien à la fenêtre que j'aivoulu associer
mes événements, mais je n'obtiens un quelconque résultat qu'à
partir du moment où je l'associe par exemple à l'une des zones
d'édition contenues dans ma fenêtre.

Si j'écris:

self.textEntry1.Bind(wx.EVT_CHAR, self.OnChar)

quand le focus est dans textEntry1, si je frappe du texte, ma
fonction OnChar fait bien ce que je lui demande (en l'occurrence,
pour l'instant, d'aficher un dialogue avec le code du caractère).

Si je tabule, il ne se passe plus rien lors de la frappe d'un
carctère.

Si j'écris:

self.Bind(wx.EVT_CHAR, self.OnChar)

mon OnChar ne réagit plus jamais à la frappe d'un caractère,y
compris dans textEntry1.

Question annexe: est-il possible d'attribuer un raccourci clavier à
un bouton, autrement que par le "et comercial"? Toujours dans ma
problématique de faire correspondre la touche Echap au bouton
Annuler qui se trouve dans ma boîte de dialogue?

Merci,
J.-F.



Le 2017-05-11 16:16, yannick a écrit :
salut JF,il faudrait l'associer à la fenêtre ....

de m mémoire si il s'agit d'une boite de dialogue, c'est
automatique


Le 11/05/2017 à 16:08, jfco...@free.fr a écrit :
Re Abdel et tous,

Pour compléter un tout petit peu: par exemple, je vois dans la
page de doc que tu m'indiques, que ces événements ne sont envoyés
qu'à une zone ayant le focus. OK. Donc j'ai une appli avec
différents contrôles, l'un d'entre eux ayant toujours le focus.
Cela signifie-t-il que, si je souhaitais par exemple que, oùque
je sois, la touche Echap provoque la sortie de l'applicaiton, il
me faille associer un événement par exemple EV_KEY_DOWNà chacun
des sous-contrôles? Mais si mon appli avait 50 contrôles...
J'espérais trouver un moyen un peu plus général pour implémenter
ma petite touche Echap... Ou n'impote quelle autre touche qui
pourrait être attribuée à une fonctionnalité la plus globale,
sans pour autant correspondre à un élément de menu... Enfin bon,
tout ça, c'est toujours dans une optique d'exploration...

J.-F.




Le 2017-05-11 00:26, Abdel a écrit :
Coucou JF,

En fait, le module wx est bien capable d'intercepter les
touches du
clavier.

Au même titre que les événements liés aux clics sur les boutons
"WX.EVT_BUTTON", ainsi que ceux des autres widgets que l'on peut
créer avec wx, il existe des événements associés à
l'interception
des touches du clavier.

* wx.EVT_KEY_DOWN, pour gérer l'appui sur les touches;
* wx.EVT_KEY_UP, pour gérer le relachement des touches;
* wx.EVT_CHAR, pour gérer l'appui sur les touches associées à
des
lettres.

Ces événements sont très bien documentés ici:

https://wxpython.org/docs/api/wx.KeyEvent-class.html

Il existe un module complémentaire pour NVDA qui montre bien
comment
utiliser l'événement wx.EVT_KEY_DOWN, je t'invite à consulter
son
code, voici sa page de description :

https://addons.nvda-project.org/addons/virtualRevision.en.html

Dans la méthode de ta classe servant à intercepter la touche
pressée, ce sera le second paramètre, "evt", ou "event", qui
s'occupera de gérer l'événement de cette dite touche :

key = evt.GetKeyCode()

Le retour de la méthode GetKeyCode () devra être comparé à des
constantes figurant dans le module wx, toutes commançant par
wx.WXK_....

Par exemple, pour la touche échappe, c'est wx.WXK_ESCAPE,
pour F1
wx.WXK_F1, etc...

Voila, j'espère que ça t'aidera un petit peu.

J'ai fais une petite erreur dans ma réponse à David, le code
HTML de
la liste des items de Wamp Server a été postée comme tel, milles
excuses...

Bien amicalement,
Abdel.
Le 10/05/2017 à 16:53, jfco...@free.fr a écrit :

Hello la ML,

Est-ce qu'il vous paraît possible, avec WxPython, d'associer
des
actions à des touches du clavier, par exemple F1, ou Ctrl+K, ou
même Echap? Je n'ai rien vu de tel dans les quelques
exemples de
sources WX que j'ai, mais j'ai forcément fait des recherches un
peu
ciblées et j'ai pu passerà côté...

Par ailleurs, ou peut-être même en conjonction, j'aimerais par
exemple que l'appui sur Echap me permette de sortir d'un script
WxPython... ça ne me paraît pas évident.

Merci,
J.-F.

Progliste :
Pour se d�sinscrire de la liste :
mailto:progliste-requ...@ml.free.fr?subject=unsubscribe

Pour voir les archives de la liste :
http://www.mail-archive.com/progliste@ml.free.fr/

Je vous rappelle que les pi�ces jointe sont activ�s leur taille
est limit� � 2 MO
Pour acc�der aux fichiers de la liste
http://outils.archive-host.com/partage.php?id=2Qar9Hy6ftzr
Ou en utilisant la nouvelle page de partage :
http://outils-n.archive-host.com/partage-fm0m7b947vglikp9Efpso94gt

Pour y ajouter des fichiers demandez-moi le ou sur la liste
ou en
priv�, je vous r�pondrez en priv�.
Progliste :
Pour se d�sinscrire de la liste :
mailto:progliste-requ...@ml.free.fr?subject=unsubscribe

Pour voir les archives de la liste :
http://www.mail-archive.com/progliste@ml.free.fr/

Je vous rappelle que les pi�ces jointe sont activ�s leur taille
est limit� � 2 MO
Pour acc�der aux fichiers de la liste
http://outils.archive-host.com/partage.php?id=2Qar9Hy6ftzr
Ou en utilisant la nouvelle page de partage :
http://outils-n.archive-host.com/partage-fm0m7b947vglikp9Efpso94gt

Pour y ajouter des fichiers demandez-moi le ou sur la liste ou en
priv�, je vous r�pondrez en priv�.




Progliste :
Pour se d�sinscrire de la liste : m
ilto:progliste-requ...@ml.free.fr?subject=unsubscribe

Pour voir les archives de la liste :
http://www.mail-archive.com/progliste@ml.free.fr/

Je vous rappelle que les pi�ces jointe sont activ�s leur taille
est limit� � 2 MO

Pour acc�der aux fichiers de la liste
http://outils.archive-host.com/partage.php?id=2Qar9Hy6ftzr
Ou en utilisant la nouvelle page de partage :
http://outils-n.archive-host.com/partage-fm0m7b947vglikp9Efpso94gt
Pour y ajouter des fichiers demandez-moi le ou sur la liste ou en
priv�, je vous r�pondrez en priv�.
Progliste :
Pour se d�sinscrire de la liste :
mailto:progliste-requ...@ml.free.fr?subject=unsubscribe

Pour voir les archives de la liste :
http://www.mail-archive.com/progliste@ml.free.fr/

Je vous rappelle que les pi�ces jointe sont activ�sleur taille est
limit� � 2 MO
Pour acc�der aux fichiers de la liste
http://outils.archive-host.com/partage.php?id=2Qar9Hy6ftzr
Ou en utilisant la nouvelle page de partage :
http://outils-n.archive-host.com/partage-fm0m7b947vglikp9Efpso94gt
Pour y ajouter des fichiers demandez-moi le ou sur la liste ou en
priv�, je vous r�pondrez en priv�.




Progliste :
Pour se d�sinscrire de la liste :
mailto:progliste-requ...@ml.free.fr?subject=unsubscribe

Pour voir les archives de la liste :
http://www.mail-archive.com/progliste@ml.free.fr/

Je vous rappelle que les pi�ces jointe sont activ�s leur taille est
limit� � 2 MO
Pour acc�der aux fichiers de la liste
http://outils.archive-host.com/partage.php?id=2Qar9Hy6ftzr
Ou en utilisant la nouvelle page de partage :
http://outils-n.archive-host.com/partage-fm0m7b947vglikp9Efpso94gt
Pour y ajouter des fichiers demandez-moi le ou sur la liste ou en
priv�, je vous r�pondrez en priv�.




Progliste :
Pour se d�sinscrire de la liste :
mailto:progliste-requ...@ml.free.fr?subject=unsubscribe

Pour voir les archives de la liste :
http://www.mail-archive.com/progliste@ml.free.fr/

Je vous rappelle que les pi�ces jointe sont activ�s leur taille est
limit� � 2 MO
Pour acc�der aux fichiers de la liste
http://outils.archive-host.com/partage.php?id=2Qar9Hy6ftzr
Ou en utilisant la nouvelle page de partage :
http://outils-n.archive-host.com/partage-fm0m7b947vglikp9Efpso94gt
Pour y ajouter des fichiers demandez-moi le ou sur la liste ou en
priv�, je vous r�pondrez en priv�.





wxEssaiJF_dialog.py


# -*- coding: utf-8 -*-
# On tente de recréer une application en WXPython

# 1. Importation:
try:
    import wx
except ImportError:
    print "WxPython n'est pas disponible ici..."
    exit()

# 2. Création d'une classe principale de type wx.Dialog:
class MonPtitDialog(wx.Dialog):
    # 3. Constructeur de cette classe principale:
    def __init__(self, parent, id, title):
        # l'init doit appeler celui du parent
        wx.Dialog.__init__(self, parent, id, title)
        # 4. Garder une référence du parent:
        self.parent = parent
        # 5. Initialiser l'interface graphique:
        self.initialize()

    def initialize(self):
        # 8. Ajouter un gestionnaire de layout
        # (C'est à partir de là qu'une app se spécialise):
        # Pour pouvoir tabuler, plus besoin de panel, car le
wx.Dialog offre par défaut une navigation tabulaire.
        # On définit les contrôles, apparentés au dialog, puisque
l'on a désactivé le panel.
        self.static1 = wx.StaticText(self, -1, "&Premier fichier: ")
        self.textEntry1 = wx.TextCtrl(self, -1, size=(250,-1))
        self.bouton1 = wx.Button(self, -1, label="Sélectionner&1")
        self.static2 = wx.StaticText(self, -1, u"&Deuxième fichier: ")
        self.textEntry2 = wx.TextCtrl(self, -1)
        self.bouton2 = wx.Button(self, -1, label=u"Sélectionner&2")
        self.boutonComparer = wx.Button(self, size=(200,-1),
label="Comparer")
        self.boutonAnnuler = wx.Button(self, wx.ID_CANCEL,
size=(200,-1), label="&Annuler")
        # Création d'un layout
        self.sizer0 = wx.BoxSizer(wx.VERTICAL)
        # création de deux sizers pour placer les contrôles
        self.sizer1 = wx.GridBagSizer()
        self.sizer2 = wx.BoxSizer(wx.HORIZONTAL)  # Pour boutons
Comparer et Annuler
        # Ajout des contrôles aux deux sizers
        self.sizer1.Add(self.static1,(0,0),(1,1),wx.EXPAND)
        self.sizer1.Add(self.textEntry1,(0,1),(1,1),wx.EXPAND)
        self.sizer1.Add(self.bouton1, (0,2))
        self.sizer1.Add(self.static2,(1,0),(1,1),wx.EXPAND)
        self.sizer1.Add(self.textEntry2,(1,1),(1,1),wx.EXPAND)
        self.sizer1.Add(self.bouton2, (1,2))
        self.sizer2.Add(self.boutonComparer, 0, wx.ALIGN_CENTER)
        self.sizer2.Add(self.boutonAnnuler,  0, wx.ALIGN_CENTER)
        # Ajout des deux sizers au sizer principal
        self.sizer0.Add(self.sizer1, 10, wx.ALIGN_TOP)
        self.sizer0.Add(self.sizer2, 3, wx.ALIGN_BOTTOM)
        # Assignation d'événements
        self.Bind(wx.EVT_BUTTON, self.OnParcourir1, self.bouton1)
        self.Bind(wx.EVT_BUTTON, self.OnParcourir2, self.bouton2)
        self.Bind(wx.EVT_BUTTON, self.OnExit, self.boutonAnnuler)

        # Activation du sizzer principal (ne pas le faire pour les
deux autres)
        self.SetSizer(self.sizer0)
        self.sizer0.Fit(self)
        self.textEntry2.SetFocus()   # petite fantaisie pour le fun
        # definition de la taille minimale du dialogue.
        self.SetMinSize((250, 150))
        # Affichage
        self.Show(True)
        self.Centre()

    def OnExit(self, evt):
        self.Destroy ()

    def OnParcourir1(self, evt):
        dialogue = wx.FileDialog(self, message="Choisir fichier 1")
        if dialogue.ShowModal() == wx.ID_OK:
            self.textEntry1.SetValue (dialogue.GetPath())
            self.textEntry1.SetFocus()
        dialogue.Destroy()

    def OnParcourir2(self, evt):
        dialogue = wx.FileDialog(self, message="Choisir fichier 2")
        if dialogue.ShowModal() == wx.ID_OK:
            self.textEntry2.SetValue (dialogue.GetPath())
            self.textEntry2.SetFocus()
        dialogue.Destroy()

# 6. Création du main
def principal():
    app = wx.App(redirect=False)
    frame = MonPtitDialog(None, -1, "Ma ptite tentative")
    # 7. Boucler:
    app.MainLoop()

# Principal:
if __name__ == "__main__":
    principal()
Progliste :
Pour se d�sinscrire de la liste :
mailto:progliste-requ...@ml.free.fr?subject=unsubscribe

Pour voir les archives de la liste :
http://www.mail-archive.com/progliste@ml.free.fr/

Je vous rappelle que les pi�ces jointe sont activ�s leurtaille est
limit� � 2 MO
Pour acc�der aux fichiers de la liste
http://outils.archive-host.com/partage.php?id=2Qar9Hy6ftzr
Ou en utilisant la nouvelle page de partage :
http://outils-n.archive-host.com/partage-fm0m7b947vglikp9Efpso94gt
Pour y ajouter des fichiers demandez-moi le ou sur la liste ou en
priv�, je vous r�pondrez en priv�.




Progliste :
Pour se d�sinscrire de la liste :
mailto:progliste-requ...@ml.free.fr?subject=unsubscribe

Pour voir les archives de la liste :
http://www.mail-archive.com/progliste@ml.free.fr/

Je vous rappelle que les pi�ces jointe sont activ�s leur taille est
limit� � 2 MO
Pour acc�der aux fichiers de la liste
http://outils.archive-host.com/partage.php?id=2Qar9Hy6ftzr
Ou en utilisant la nouvelle page de partage :
http://outils-n.archive-host.com/partage-fm0m7b947vglikp9Efpso94gt
Pour y ajouter des fichiers demandez-moi le ou sur la liste ou en
priv�, je vous r�pondrez en priv�.



Progliste :
Pour se d�sinscrire de la liste : 
mailto:progliste-requ...@ml.free.fr?subject=unsubscribe

Pour voir les archives de la liste :
http://www.mail-archive.com/progliste@ml.free.fr/       

Je vous rappelle que les pièces jointe sont activés leur taille est limité à 2 MO
Pour acc�der aux fichiers de la liste
http://outils.archive-host.com/partage.php?id=2Qar9Hy6ftzr
Ou en utilisant la nouvelle page de partage :
http://outils-n.archive-host.com/partage-fm0m7b947vglikp9Efpso94gt
Pour y ajouter des fichiers demandez-moi le ou sur la liste ou en priv�, je 
vous r�pondrez en priv�.
        
        

Répondre à