IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec Python Discussion :

gestion d'un <enter> sur un gtk.Entry()


Sujet :

GTK+ avec Python

  1. #1
    Membre éprouvé Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Par défaut gestion d'un <enter> sur un gtk.Entry()
    Bonjour,
    Je cherche a prendre en compte un <enter> dans un champ de saisie a partir du code suivant qui ouvre une fenetre de dialogue simple avec un champ de saisie, un bouton OK et un bouton Cancel. J'ai des difficultes pour articuler la callback appelee par 'activate' par rapport a la fonction Run:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    class WinDialogPassword__:
        """
        Describe the Window which asks a password to continue
        """
        def __init__(self, title, parentWin):
            """
            Constructor of the class
            @param title: the title of the Window
            @type title:  str
            @param parentWin: Window which open this window
            @type parentWin:  widget
            """
            self.win = gtk.Dialog(title, parentWin,
                                  gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT)
     
            self.win.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_OK,
                                 gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
     
            self.entry = gtk.Entry()
            self.entry.connect("activate", self.WinDialogPasswordActivate, None)
            self.entry.set_visibility(False)
            self.win.vbox.pack_start(self.entry)
     
            self.win.show_all()
     
        def WinDialogPasswordRun(self,password):
            """
            Intercept user's action in the window
            @param password: password to check
            @type password:  str
            @return: True if the password is correct
            @rtype:  boolean
            """
            ret = False
            while True:
                	# Wait an action 
                	response = self.win.run()
     
                	if (response == gtk.RESPONSE_OK):
                    	if(self.entry.get_text() == password):
                        		ret = True
                        		break
                    	else:
                        		self.entry.set_text('')
                        		self.entry.grab_focus()
                	if (response == gtk.RESPONSE_CANCEL):
                    	ret = False
                    	break
     
            self.win.destroy()
            return ret
     
     
        def WinDialogPasswordActivate(self, entry, data=None):
            """
            Intercept user's action in the entry field
            @param entry: the entry that received the signal
            @type entry:  gtk.Widget
            @param data: optional
            @type:
            """
            ???????????????????
     
    Dans le main :
    winPassword = WinDialogPassword__("Password", self.main.MainGet_Win())
    ret = winPassword.WinDialogPasswordRun("password")
    L'instruction "response = self.win.run()" va mettre l'application en attente de la saisie, puis aller en séquence. Le <enter> va déclencher la callback "WinDialogPasswordActivate" et je ne sais pas ou revenir ni comment.

    Merci de votre aide

  2. #2
    Membre chevronné
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Par défaut
    Hello,

    Si tu veux simplement simuler un appui sur "OK" quand tu fais "enter", essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        def WinDialogPasswordActivate(self, entry, data=None):
            self.win.response(gtk.RESPONSE_OK)

  3. #3
    Membre éprouvé Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Par défaut
    oui, merci ça marche.
    L'idéal serait que sur <enter> on simule l'appui du bouton OK et donc que l'on voit l'appui du bouton. Comment puis je accèder au bouton à partir su self.win tel que je l'ai défini.
    Merci

  4. #4
    Membre chevronné
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Par défaut
    Oulà, te compliques pas la vie comme ça ! La philosophie de GTK, c'est de faire des interfaces fonctionnelles et simples : tu appuies sur <enter>, l'action s'exécute, et c'est déjà suffisant.

    Si tu tiens vraiment à faire un effet visuel du bouton qui s'appuie, c'est possible mais c'est généralement une mauvaise idée de faire des interfaces qui en font trop (mauvaises perfs, difficultés à comprendre et à maintenir le code, ...).

    Un exemple de comment tu pourrais faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # récupère le bouton
    button_ok = self.win.get_widget_for_response(gtk.RESPONSE_OK)
    # simule visuellement un appui
    button_ok.set_state(gtk.STATE_ACTIVE)
    # exécute l'action après 500 ms
    gobject.timeout_add(500, lambda *data: self.win.response(gtk.RESPONSE_OK))
    (pas testé, mais le principe est là)

    -

  5. #5
    Membre éprouvé Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Par défaut
    Merci beaucoup, c'est ce que je voulais, par contre je ne comprends pas pourquoi un timeout. C'est justement parce que mon traitement suivant le OK prends quelques secondes que l'appui (simulé) du bouton OK indique à l'utilisateur que le <enter> est bien actif.
    Merci

  6. #6
    Membre chevronné
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Par défaut
    Normalement, l'interface ne se rafraichit que lorsque tu retournes dans gtk.main(), d'où la tempo de 500 ms qui indique au prog d'afficher le bouton enfoncé, puis de fermer la fenêtre de dialogue après un court instant.

    Est-ce que ça marche chez toi si tu enlèves le timeout et que tu fermes la fenêtre à la fin du traitement ? (sauf si tu fais du multithread, tu ne devrais pas voir le bouton s'enfoncer)

    -

  7. #7
    Membre éprouvé Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Par défaut
    Bonjour
    En effet je ne vois pas le bouton s'enfoncer, la fenêtre se ferme avant. Avec le time out c'est parfait. Merci de cette précision.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Api pour la gestion du port série et JRE sur un ancêtre
    Par Orian dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 29/01/2007, 18h22
  2. Gestion de la touche Enter sur les webforms
    Par ag007 dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 15/11/2006, 15h46
  3. [VBA-E]Gestion de la touche "enter"
    Par zest dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 17/04/2006, 21h05
  4. gestion d'un magasin de disque sur access
    Par fad dans le forum Access
    Réponses: 2
    Dernier message: 04/04/2006, 22h50
  5. Réponses: 15
    Dernier message: 23/02/2006, 15h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo