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 :

Boutons, Menus, et Signaux


Sujet :

GTK+ avec Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 3
    Par défaut Boutons, Menus, et Signaux
    Bonjour à tous,
    Je suis un débutant en Python et presque autant en GTK (j'en ai fais en C il y a déjà quelques années).
    Bref je souhaiterais créer une interface en PyGTK mais je me retrouve confronté à plusieurs problèmes.
    Je souhaite créer une interface comme ceci:
    Une carré de quatre boutons de ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    |-----------|---------|
    |           |         |
    |    1      |    2    |
    |-----------|---------|
    |           |         |
    |    3      |    4    |
    -----------------------
    J'espère que ce malheureux schéma aidera à comprendre.
    Je veux ensuite faire apparaitre un menu lorsque l'on clique sur les boutons.
    En m'aidant et m'inspirant des exemples et tutoriaux trouvés sur ce site, j'ai réussi à créer ce début d'interface.
    Bref pour revenir à mon menu, celui-ci doit permettre de fusionner le bouton cliqué avec celui de droite, de gauche, du dessus et du dessous. Bon pour l'instant celui de droite uniquement sera déjà trés bien.
    Et c'est là que les soucis commencent, je ne sais pas comment récupérer le bouton sur lequel j'ai cliqué. Je n'ai que dans ma fonction qui éxécute l'action du menu: le widget (menu) et la chaine associé (texte du menu, "fusionner à droite" par exemple).
    Ma question est donc comment en cliquant sur un bouton, faire apparaitre un menu permettant de modifier ce bouton. Par exemple, si je cliquer sur le bouton 1 de mon schéma, que je séléctionne "fusionner à droite", je devrais me retrouver avec quelque chose ressemblant à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    |-----------|---------|
    |           1         |
    |                     |
    |-----------|---------|
    |           |         |
    |    3      |    4    |
    -----------------------
    Merci d'avance.
    PS: Je peux poster mon code actuel si cela intéresse quelqu'un. (uniquement python + gtk).

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

    Voilà un bout de code qui devrait t'aider :
    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
    import pygtk
    pygtk.require('2.0')
    import gtk
     
    class Tableau(gtk.Table):
     
        def __init__(self, x, y):
            gtk.Table.__init__(self, x, y)
            for i in range(x):
                for j in range(y):
                    b = gtk.Button(label="(%d,%d)" % (i,j))
                    b.connect_object('event', self.ev_button_clicked, b)
                    self.attach(b, i, i+1, j, j+1)
     
        def ev_button_clicked(self, button, event):
            if event.type == gtk.gdk.BUTTON_PRESS:
                if event.button == 1:
                    item1 = gtk.MenuItem("Fusionner a droite")
                    item2 = gtk.MenuItem("Fusionner en bas")
                    item1.connect('activate', lambda m: self.fusionner(m, button, "droite"))
                    item2.connect('activate', lambda m: self.fusionner(m, button, "bas"))
                    menu = gtk.Menu()
                    menu.append(item1)
                    menu.append(item2)
                    menu.show_all()
                    menu.popup(None, None, None, event.button, event.time)
                    return True
            return False
     
        def fusionner(self, menu, button, direction):
            c = self.coords(button)
            print c, direction
            if direction == "droite":
                c[1] += 1
            if direction == "bas":
                c[3] += 1
            if c[1] > self.get_property('n-columns') or c[3] > self.get_property('n-rows'):
                return
            for w in self.get_children():
                cc = self.coords(w)
                if max(cc[0], c[0]) < min(cc[1], c[1]) and max(cc[2], c[2]) < min(cc[3], c[3]):
                    if w is not button:
                        w.destroy()
            self.child_set_property(button, 'left-attach',   c[0])
            self.child_set_property(button, 'right-attach',  c[1])
            self.child_set_property(button, 'top-attach',    c[2])
            self.child_set_property(button, 'bottom-attach', c[3])
            return
     
        def coords(self, button):
            c = self.child_get(button, 'left-attach', 'right-attach', 'top-attach', 'bottom-attach')
            return list(c)
     
    #------------------------------------------------------------------------------
     
    if __name__ == '__main__':
        win = gtk.Window()
        win.connect('destroy', lambda w: gtk.main_quit())
        t = Tableau(7, 5)
        win.add(t)
        win.show_all()
        gtk.main()
    Pour récupérer un référence sur le bouton, il faut le spécifier comme paramètre supplémentaire dans le callback. C'est ce que je fais avec la fonction "lambda".

    Si tu as des questions, n'hésite surtout pas !


    -

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 3
    Par défaut
    Bonjour,
    Effectivement, en reprenant votre code cela fonctionne beaucoup mieux! Je débute complétement le python et se mettre au pygtk directement était un peu audacieux de ma part. Mais je progresse, lentement mais surement =)

    Je voudrais maintenant sauvegarder la position des boutons, pour pouvoir par la suite ré-ouvrir la fenêtre sans avoir à la reconfigurer. J'ai lu pas mal de choses sur les méthode de "marshalling" ou de "sérialisation" d'objets mais cela ne semble pas fonctionner avec les objects gtk.

    Dans l'idéal sauvegarder mon objet gtk.Table aurait été parfait.

    S'il n'est pas possible de sauvegarder l'objet tel quel, je pense écrire les coordonées des boutons, ainsi que leurs tailles dans un fichier de configuration.
    Comment procéderiez vous ?
    Merci d'avance pour votre aide.

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

    Ta question ne concerne plus vraiment pyGTK ; je te conseille donc d'ouvrir un nouveau sujet dans la rubrique "général python", où tu aura plus de chances de trouver quelqu'un qui s'y connaît en marshalling


    -

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/05/2007, 20h06
  2. les signaux : click droit sur bouton (entre autre)
    Par Michel_57 dans le forum GTK+ avec Python
    Réponses: 5
    Dernier message: 19/04/2007, 08h28
  3. grande marge devant les boutons de mes Menus+Css
    Par paradeofphp dans le forum Mise en page CSS
    Réponses: 7
    Dernier message: 12/09/2006, 13h49
  4. Remplacer des boutons par des menus déroulants?
    Par drthodt dans le forum Access
    Réponses: 3
    Dernier message: 20/09/2005, 17h37
  5. Ajout de bouton de commandes dans la barre de menus
    Par vanessaf22 dans le forum IHM
    Réponses: 9
    Dernier message: 21/07/2003, 11h38

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