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

wxPython Discussion :

Déplacement d'une fenêtre sans bordure


Sujet :

wxPython

  1. #1
    Nouveau membre du Club Avatar de Saintux
    Homme Profil pro
    Chercheur ( de travail )
    Inscrit en
    Janvier 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur ( de travail )
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 39
    Points : 34
    Points
    34
    Par défaut Déplacement d'une fenêtre sans bordure
    Bonjours à tous,

    J'ai actuellement un problème pour déplacer une fenêtre sans bordure.

    Une première idée était de la faire suivre le curseur de façon artisanal (changement des coordonnés de la fenêtre vers ceux du curseur) mais elle ne me convient pas (je recherche la simplicité )

    Malheureusement aucune seconde idée ne m'est venu , c'est pourquoi j'en fais appel à votre grand savoir :

    - Y a t-il une fonction frame.MoveToCursor (faut pas rêver )
    - Autre (Oui je sais pas trop comment m'y prendre )

    Pour ceux qui connaissent la mandriva il me faudrai la même chose que quand on maintient Alt et clic sur la fenêtre pour la bouger n'importe où...dur dur

    Bref, n'ayant pas l'habitude de faire des interfaces graphiques je suis un peu pommé, merci pour votre aide (même si c'est pour dire 'impossible remet la bordure' )

    Ma frame :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Frame=wx.Frame.__init__(self, None, -1, "Jolie frame", pos = wx.DefaultPosition, size = (600, 300), style = wx.BORDER_NONE )

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Points : 290
    Points
    290
    Par défaut
    Bonjour,

    Voila une question intéressante, qui je dois dire m'a donné du fil à retordre.
    J'ai essayé de refaire le comportement du Alt Clic que tu mentionnes.
    J'ai pensé d'abord utilisé l'événement EVT_MOTION, mais un problème survient lorsque l'on bouge la souris rapidement et que le curseur sort de la fenêtre car l'événement n'est plus appelé. C'est pourquoi j'ai utilisé un Timer.

    Voici le principe:
    Lorsque l'on clique sur la fenêtre avec la touche ALT enfoncé (onLeftDown), on récupère les coordonné du clique (self.posClick), pour pouvoir laissé le curseur toujours au même endroit sur la fenêtre lorsqu'on la déplace, et on lance le Timer qui appelle la méthode onTick tout 50ms (tu peux bien sur mettre se que tu veux, suivant la fluidité voulu).
    dans la méthode onTick on récupère la position de souris sur l'écran (pos), puis il suffit de soustraire pos et self.posClick pour récupérer la nouvelle position de la fenêtre puis bouget la fenêtre à cette nouvelle position.
    Lorsqu'on relâche le bouton de la souris onLeftUp, on arrête le Timer.

    Voici le code:

    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
     
    import wx
     
    class MyFrame(wx.Frame):
        def __init__(self):
            wx.Frame.__init__(self, None, -1, "Jolie frame", pos = wx.DefaultPosition, size = (600, 300), style = wx.BORDER_NONE)
            self.timer = wx.Timer(self, -1)
            self.Bind(wx.EVT_LEFT_DOWN, self.onLeftDown)
            self.Bind(wx.EVT_LEFT_UP, self.onLeftUp)
            self.Bind(wx.EVT_TIMER, self.onTick, self.timer)
            print self.GetWindowBorderSize()
            self.posClick = None
     
        def onLeftDown(self, e):
            if wx.GetKeyState(wx.WXK_ALT):
                self.posClick = e.GetPosition()
                self.timer.Start(milliseconds=50, oneShot=False)
     
        def onLeftUp(self, e):
            if self.timer.IsRunning():
                self.timer.Stop()
     
        def onTick(self, e):
            pos = wx.GetMousePosition()
            newPos = pos-self.posClick
            self.Move(newPos)
     
     
    app = wx.PySimpleApp()
    frame = MyFrame()
    frame.Show()
    app.MainLoop()

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    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
     
    # -*- coding: utf-8 -*-
     
    import wx
     
    class FancyFrame(wx.Frame):
        def __init__(self):
            style = ( wx.CLIP_CHILDREN | wx.STAY_ON_TOP | wx.FRAME_NO_TASKBAR |
                      wx.NO_BORDER | wx.FRAME_SHAPED  )
            wx.Frame.__init__(self, None, title='Fancy', style = style)
            self.SetSize( (300, 120) )
            self.SetPosition( (400,300) )
            self.SetTransparent( 220 )
     
            self.Bind(wx.EVT_KEY_UP, self.OnKeyDown)
            self.Bind(wx.EVT_MOTION, self.OnMouse)
     
            self.Show(True)
     
        def OnKeyDown(self, event):
            """quit if user press q or Esc"""
            if event.GetKeyCode() == 27 or event.GetKeyCode() == ord('Q'): #27 is Esc
                self.Close(force=True)
            else:
                event.Skip()
     
        def OnMouse(self, event):
            """implement dragging"""
            if not event.Dragging():
                self._dragPos = None
                return
            self.CaptureMouse()
            if not self._dragPos:
                self._dragPos = event.GetPosition()
            else:
                pos = event.GetPosition()
                displacement = self._dragPos - pos
                self.SetPosition( self.GetPosition() - displacement )
     
    app = wx.App()
    f = FancyFrame()
    app.MainLoop()
    D'après http://hasenj.wordpress.com/2009/04/...w-in-wxpython/

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Points : 290
    Points
    290
    Par défaut
    Oui, c'est beaucoup mieux. Je ne connaissais pas wxCaptureMouse. C'est exactement ce dont on a besoin ici.
    Il y a juste à remplacer le else par elif wx.GetKeyState(wx.WXK_ALT): pour avoir bouger la fenêtre lorsque la touche ALT est enfoncer.

  5. #5
    Nouveau membre du Club Avatar de Saintux
    Homme Profil pro
    Chercheur ( de travail )
    Inscrit en
    Janvier 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur ( de travail )
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    C'est bon ça fonctionne, merci pour vos réponses.

    Voici le code que j'utilise :
    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
    class I_G_MAJ(wx.Frame):
        """Interface graphique de la mise à jour."""
        def __init__(self):
            global label_fdl, barre_dl
            Frame=wx.Frame.__init__(self, None, -1, "PAF", pos = wx.DefaultPosition, size = (600, 320), style = wx.NO_BORDER )
        self.Bind(wx.EVT_MOTION, self.OnMouse)
     
        def OnMouse(self, event):
            """implement dragging"""
            if not event.Dragging():
                self._dragPos = None
                return
    #        self.CaptureMouse() j'enlève sinon je ne peux pas utiliser les autres Widgets
    # Et ça fonctionne très bien sans :D
            if not self._dragPos:
                self._dragPos = event.GetPosition()
            elif wx.GetKeyState(wx.WXK_CONTROL):                #Je préfère utiliser contrôle sinon ça peut interférer avec la fonction de mon linux
                pos = event.GetPosition()
                displacement = self._dragPos - pos
                self.SetPosition( self.GetPosition() - displacement )

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

Discussions similaires

  1. xcb : créer une fenêtre sans bordure
    Par echantillon dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 17/03/2011, 23h39
  2. Déplacer, réduire, fermer une fenêtre sans bordure
    Par Stefounette dans le forum JavaFX
    Réponses: 6
    Dernier message: 15/04/2010, 19h34
  3. Déplacement d'une Form sans bordure ?
    Par arnofly dans le forum Windows Forms
    Réponses: 5
    Dernier message: 03/06/2009, 01h11
  4. [TForm] Problème lors du déplacement d'une fenêtre sans barre de titre
    Par Benjamin GAGNEUX dans le forum Composants VCL
    Réponses: 3
    Dernier message: 14/10/2004, 17h10
  5. Déplacement d'une fenêtre[débutante]
    Par monia dans le forum MFC
    Réponses: 4
    Dernier message: 27/05/2004, 12h38

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