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 :

Existe-t-il un conteneur déplaçable et redimensionnable ?


Sujet :

GTK+ avec Python

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 4
    Par défaut Existe-t-il un conteneur déplaçable et redimensionnable ?
    Bonjour,

    Je débute en GTK avec Python, alors peut-être que j'essaye de faire quelque chose qui n'est pas possible avec ce toolkit. Je cherche à permettre aux utilisateurs de déplacer et redimensionner des objets dans l'interface, comme, par exemple, des post-it sur un panneau fixe.

    Ce genre de chose existe dans d'autres systèmes, comme par exemple les JInternalFrame de Swing en Java.

    J'ai beau chercher sur Google, je ne trouve rien d'approchant en GTK, ni même des posts d'autres personnes cherchant à faire la même chose. Suis-je hors sujet ou bien est-ce tellement facile que personne ne pose la question ?

    Merci
    Pascal

  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,

    À ma connaissance, il n'existe rien de spécifique pour faire cela. Tu risque de devoir tout programmer toi-même .

    Si tu veux simplement déplacer des widgets du genre Label, c'est assez simple :
    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
    # -*- coding:utf-8 -*-
     
    import pygtk
    pygtk.require('2.0')
    import gtk
     
    #------------------------------------------------------------------------------
     
    class TestMove(gtk.Fixed):
        """Zone avec étiquettes déplaçables."""
     
        def __init__(self):
            gtk.Fixed.__init__(self)
            self.set_size_request(300, 300)
            self.coords = None
            self.subwidgets = {}
            self.connect('button-release-event', self.on_button_release)
     
        def new_child(self, widget, x, y):
            eb = gtk.EventBox()
            eb.add(widget)
            eb.add_events(gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.BUTTON_PRESS_MASK)
            eb.connect('button-press-event', self.on_button_press)
            self.put(eb, x, y)
            self.subwidgets[eb] = (x, y)
            return
     
        def on_button_press(self, widget, event):
            if (event.type == gtk.gdk.BUTTON_PRESS) and (event.button == 1):
                #print event
                self.coords = (widget, event.x, event.y)
                self.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND1))
            return
     
        def on_button_release(self, widget, event):
            #print event
            if self.coords != None:
                w = self.coords[0]
                x0, y0 = self.subwidgets[w]
                xx = int(x0 - self.coords[1] + event.x)
                yy = int(y0 - self.coords[2] + event.y)
                self.move(w, xx, yy)
                self.subwidgets[w] = (xx, yy)
            self.window.set_cursor(None)
            self.coords = None
            return
     
    #------------------------------------------------------------------------------
     
    if __name__ == '__main__':
     
        win = gtk.Window()
        win.connect('destroy', gtk.main_quit)
     
        tm = TestMove()
        tm.new_child(gtk.Label("Hello !"), 200, 150)
        tm.new_child(gtk.Label("Salut !"), 150, 100)
        win.add(tm)
     
        win.show_all()
        gtk.main()
     
    #------------------------------------------------------------------------------
    Il faut juste penser à placer le Label dans une EventBox pour capter les clics de souris.

    Si tu veux déplacer/redimensionner des formes complexes, tu peux reprendre le même principe, avec des DrawingArea au lieu des Labels. Ensuite, suivant les coordonnées relatives self.coords[1:], tu peux décider dans la fonction on_button_release s'il faut déplacer ou redimensionner le widget.


    -

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 4
    Par défaut
    Merci pour l'exemple. En partant de là, je vais essayé de faire une fenêtre interne déplaçable et redimensionnable. Si le résultat est intéressant et satisfaisant, je le posterai ici.

  4. #4
    Membre chevronné
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Par défaut
    J'y pense seulement maintenant, mais tu as aussi la possibilité de faire des fenêtres sans bordures (voir ici). L'avantage, c'est que le déplacement/redimensionnement est automatiquement géré. Par contre, il faut trouver le moyen de les faire afficher toujours par-dessus la fenêtre principale, et de les empêcher d'en sortir.

    À toi de voir si tu veux explorer cette piste...


    -

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/04/2011, 19h08
  2. Réponses: 5
    Dernier message: 21/01/2010, 15h35
  3. Fenêtre déplaçable et redimensionnable
    Par Lamarios dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 01/11/2009, 12h27
  4. Réponses: 0
    Dernier message: 02/09/2009, 15h13
  5. Redimensionner JButton dans son conteneur
    Par chico_du_33 dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 09/12/2006, 18h40

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