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 :

Comment connecter une fonction à un bouton


Sujet :

GTK+ avec Python

  1. #1
    Membre confirmé Avatar de figarojuju
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Par défaut [Résolu] Comment connecter une fonction à un bouton
    Bonjour,
    je m'amuse (on fait comme on peut ) à faire un petit programme qui permettra de renommer mes fichiers.
    J'ai fait mon interface graphique via pygtk. Maintenant, je souhaite connecter des fonctions aux boutons...et je ne trouve pas la bonne syntaxe.

    Mon code est:
    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
    67
    68
    69
    70
    71
    72
     
    #!/usr/bin/python
    # coding: utf8
     
    import os, glob, os.path
    import pygtk
    pygtk.require('2.0')
    import gtk
     
    class Renommage:
        def evnmt_delete(self, widget, evenement, donnees=None):
            return False
     
        def destroy(self, widget, donnees=None):
            gtk.main_quit()
     
        def __init__(self):
            self.fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL)
            self.fenetre.set_title("Renommer vos fichiers!")
            self.fenetre.connect("delete_event", self.evnmt_delete)
            self.fenetre.connect("destroy", self.destroy)
     
            B_v = gtk.VBox(False,0)
            self.fenetre.add(B_v)
            B_v.show()
     
            B_h1 = gtk.HBox(False, 0)
                B_v.pack_start(B_h1, False, False, 0)
                B_h1.show()
     
            labelExt = gtk.Label("Extension des fichiers: ")
            B_h1.pack_start(labelExt, False, False, 0)
     
     
            extension = gtk.Entry(max=5)
            B_h1.pack_start(extension, False, False, 15)
            extension.show()
     
            labelRempla = gtk.Label("Texte de remplacement: ")
            B_h1.pack_start(labelRempla, False, False, 15)
     
            remplacement = gtk.Entry(max=0)
            B_h1.pack_start(remplacement, True, True, 0)
            extension.show()
     
            B_h2 = gtk.HBox(False, 0)
                B_v.pack_start(B_h2, False, False, 0)
                B_h2.show()
     
            labelt = gtk.Label("Renommer l'ensemble des fichiers du répertoire avec l'extension: ")
            B_h2.pack_start(labelt, False, False, 0)
     
            bouton = gtk.Button(label="Renommer")
            B_h2.pack_end(bouton, False, False, 0)
            bouton.connect("clicked", self.procede)
     
     
     
     
                self.fenetre.show_all()
     
        def procede():
            repertoire=os.getcwd()
            courant=os.listdir(repertoire)
            print courant
     
        def boucle(self):
            gtk.main()
     
    if __name__ == "__main__":
        renommons=Renommage()
        renommons.boucle()
    Le problème se trouve au niveau de ma fonction procede...Il me dit que j'ai trop d'arguments:
    TypeError: procede() takes no arguments (2 given)
    Je suis débutant, auriez-vous un conseil, s'il vous plait?
    Merci et bonne journée.

  2. #2
    Membre confirmé Avatar de figarojuju
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Par défaut élément de réponse
    je viens de trouver qu'il suffisait que je mette ma fonction comme ceci;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def procede(widget,callback_data):
            repertoire=os.getcwd()
            courant=os.listdir(repertoire)
            print courant
    mais j'ai du mal à comprendre cette notation...
    Si quelqu'un a une explication!
    En effet, ma fonction procede ne prend aucun argument, alors pourquoi lui mettre widget et callback_data?

    A bientôt!

  3. #3
    Membre confirmé Avatar de figarojuju
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Par défaut Du nouveau
    En fait, j'espère ne pas trop pourrir ce post avec mes multiples auto réponses...
    Comme je ne comprends pas bien la syntaxe avec les callbacks, mon programme bug...
    Mon programme est le même que précédemment sauf:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    bouton = gtk.Button(label="Renommer")
            B_h2.pack_end(bouton, False, False, 0)
            bouton.connect("clicked", self.procede,extension)
     
                self.fenetre.show_all()
     
        def procede(widget,callback_data):
            a = extension.get_text()
            print a
    et l'interpréteur me répond:
    TypeError: procede() takes exactly 2 arguments (3 given)
    Qu'en pensez-vous?
    A bientôt

  4. #4
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Les callback sont des fonctions de rappels appelées par GTK lorsqu'un évènement précis se produit, c'est GTK qui l'appel et donc lui passe les arguments qu'il veux, ici il passe le widget qui à envoyé le signal.

    Tu peux ajouter une liste de paramètre ensuite que tu récupère dans le même ordre dans ta fonction callback. Plus d'info : gobject.GObject.connect.

    Citation Envoyé par figarojuju Voir le message
    En fait, j'espère ne pas trop pourrir ce post avec mes multiples auto réponses...
    Comme je ne comprends pas bien la syntaxe avec les callbacks, mon programme bug...
    Mon programme est le même que précédemment sauf:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    bouton = gtk.Button(label="Renommer")
            B_h2.pack_end(bouton, False, False, 0)
            bouton.connect("clicked", self.procede,extension)
     
                self.fenetre.show_all()
     
        def procede(widget,callback_data):
            a = extension.get_text()
            print a
    et l'interpréteur me répond:

    Qu'en pensez-vous?
    A bientôt
    Tu as oublier le paramètre self :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        def procede(self, sender, extension):

  5. #5
    Membre confirmé Avatar de figarojuju
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Par défaut merci du conseil
    Je viens de finir mon petit programme:
    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    #!/usr/bin/python
    # coding: utf8
     
    import os, glob, os.path
    import pygtk
    pygtk.require('2.0')
    import gtk
     
    class Renommage:
        def evnmt_delete(self, widget, evenement, donnees=None):
            return False
     
        def destroy(self, widget, donnees=None):
            gtk.main_quit()
     
        def __init__(self):
            self.fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL)
            self.fenetre.set_title("Renommer vos fichiers!")
            self.fenetre.connect("delete_event", self.evnmt_delete)
            self.fenetre.connect("destroy", self.destroy)
     
            B_v = gtk.VBox(False,0)
            self.fenetre.add(B_v)
            B_v.show()
     
            B_h1 = gtk.HBox(False, 0)
                B_v.pack_start(B_h1, False, False, 0)
                B_h1.show()
     
            labelExt = gtk.Label("Extension des fichiers: ")
            B_h1.pack_start(labelExt, False, False, 0)
     
     
            extension = gtk.Entry(max=5)
            B_h1.pack_start(extension, False, False, 15)
            extension.show()
     
            labelRempla = gtk.Label("Texte de remplacement: ")
            B_h1.pack_start(labelRempla, False, False, 15)
     
            remplacement = gtk.Entry(max=0)
            B_h1.pack_start(remplacement, True, True, 0)
            extension.show()
     
            B_h2 = gtk.HBox(False, 0)
                B_v.pack_start(B_h2, False, False, 0)
                B_h2.show()
     
            labelt = gtk.Label("Renommer l'ensemble des fichiers du répertoire avec l'extension: ")
            B_h2.pack_start(labelt, False, False, 0)
     
            bouton = gtk.Button(label="Renommer")
            B_h2.pack_end(bouton, False, False, 0)
            bouton.connect("clicked", self.procede,extension,remplacement)
            bouton.connect("clicked", self.destroy)
     
                self.fenetre.show_all()
     
        def procede(self,widget,extension,remplacement):
            format = extension.get_text()
            nom = remplacement.get_text()
            malist=glob.glob('*'+format)
            i=0
     
            for temp in malist:
                os.rename(temp,nom+str(i)+'.'+format)
                i=i+1
     
     
        def boucle(self):
            gtk.main()
     
    if __name__ == "__main__":
        renommons=Renommage()
        renommons.boucle()
    C'est juste pour m'amuser mais si quelqu'un a des remarques constructives, je suis complètement preneur!!

    Bonne journée

  6. #6
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par figarojuju Voir le message
    si quelqu'un a des remarques constructives, je suis complètement preneur!!
    Oui ça me parait absurde d'utiliser un langage orienté objet et de ne pas en tirer partie :
    • La classe principale devrait hériter de gtk.Window,
    • extension et remplacement devraient être des attributs de ta classe.

Discussions similaires

  1. Réponses: 24
    Dernier message: 26/05/2006, 15h08
  2. Comment lancer une fonction
    Par Elois dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 21/04/2004, 19h10
  3. [VB6] Comment faire une fonction qui renvoie 2 résultats
    Par tazarine dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 15/01/2004, 00h13
  4. Comment chronométrer une fonction
    Par 323 dans le forum Pascal
    Réponses: 3
    Dernier message: 19/03/2003, 20h24

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