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 :

Changer le parent d'un composant


Sujet :

wxPython

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 46
    Par défaut Changer le parent d'un composant
    Bonjour,

    Lorsque je clique sur un composant de mon application (un bouton ou n'importe quoi, là n'est pas la soucis) j'aimerais que celui-ci change de position dans l'application. Pour le moment je réalise cela en le Detach() d'un sizer et en le Prepend() sur le sizer de destination.
    Cela marche parfaitement du moment qu'une certaine hiérarchie est respectée:

    • frame
      • sizer1
        • composant a bouger
      • sizer2


    MAIS!

    si jamais j'utilise deux panels gérés par les deux sizers sus-cités, ce qui est je pense le cas des applications normalement... on a rarement des applications sans panel... cela ne marche pas, car je dois créer mon "composant à bouger" en fournissant le panel1 comme parent, et lorsque je le Detach et Prepend il reste dans le panel1, détaché de son sizer d'origine mais pas ataché à celui de destination...

    • frame
      • Panel1 - sizer1
        • composant a bouger
      • Panel2 - sizer2


    Une solution serait donc de casser le système de parenté en changeant le parent de mon composant, mais cela me gène... peut-être parce qu'on change pas un parent comme cela tout simplement! et wx ne propose aucune méthode permettant de faire cela.
    Alors je me pose des questions sur le bien fondé de cette méthode et s'il n'y a pas plus logique/facile comme méthode existante...

    Merci pour vos conseils!

  2. #2
    Membre expérimenté
    Avatar de Alain_72
    Inscrit en
    Août 2004
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 180
    Par défaut
    Effectivement, tu ne peux pas changer le parent d'un contrôle. Tu dois passer par sa destruction.

    Un petit exemple par l'utilisation de la méthode wx.Sizer.Clear() avec True en paramètre pour forcer la destruction des enfants du sizer...

    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
    #! /usr/bin/env python
    #-*- coding: utf-8 -*-
     
    import wx
     
    class MyFrame(wx.Frame):
        def __init__(self):
            wx.Frame.__init__(self, None, -1, title = "Switch button")
            self.panel = wx.Panel(self, -1)
            self.position = 0
            self.bouton = None
            sizerPanel = wx.BoxSizer(wx.HORIZONTAL)
            self.panelGauche = wx.Panel(self.panel, -1)
            self.panelGauche.SetBackgroundColour(wx.BLUE)
            self.panelDroit = wx.Panel(self.panel, -1)
            self.panelDroit.SetBackgroundColour(wx.RED)
            self.szGauche = wx.BoxSizer(wx.VERTICAL)
            self.panelGauche.SetSizer(self.szGauche)
            self.szDroit = wx.BoxSizer(wx.VERTICAL)
            self.panelDroit.SetSizer(self.szDroit)
            sizerPanel.Add(self.panelGauche, 1, wx.EXPAND)
            sizerPanel.Add(self.panelDroit, 1, wx.EXPAND)
            self.panel.SetSizer(sizerPanel)
            self.Basculer()
            self.panel.Fit()
            self.Fit()
     
        def Basculer(self, event=None):
            if self.position == 0:
                self.szDroit.Clear(True)
                titre = "Basculer -->"
                self.bouton = wx.Button(self.panelGauche, -1, titre)
                self.szGauche.AddStretchSpacer()
                self.szGauche.Add(self.bouton, 0, wx.ALIGN_CENTER|wx.ALL, 20)
                self.szGauche.AddStretchSpacer()
                self.panelGauche.Layout()
                self.position = 1
            else:
                self.szGauche.Clear(True)
                titre = "<-- Basculer"
                self.bouton = wx.Button(self.panelDroit, -1, titre)
                self.szDroit.AddStretchSpacer()
                self.szDroit.Add(self.bouton, 0, wx.ALIGN_CENTER|wx.ALL, 20)
                self.szDroit.AddStretchSpacer()
                self.panelDroit.Layout()
                self.position = 0
            self.Bind(wx.EVT_BUTTON, self.Basculer, self.bouton)
     
    class MyApp(wx.App):
        def OnInit(self):
            f = MyFrame()
            f.Show(True)
            self.SetTopWindow(f)
            return True
     
    app = MyApp()
    app.MainLoop()

  3. #3
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 46
    Par défaut
    Oui mais mon composant en question étant un wx.media entrain de lire une vidéo, je ne peux pas me permettre de le détruire... :-( Il faut que je revois mon architecture alors si je ne peux pas faire ce que je veux... haaa.... *sigh*

  4. #4
    Membre expérimenté
    Avatar de Alain_72
    Inscrit en
    Août 2004
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 180
    Par défaut
    Ne pleure pas...
    Il y a une autre solution, c'est de déplacer le contrôle avec son conteneur...

    Ci-dessous mon précédent exemple, mais cette fois-ci je ne supprime pas le bouton, j'intervertis les panels conteneurs dans leur sizer...

    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
    #! /usr/bin/env python
    #-*- coding: utf-8 -*-
     
    import wx
     
    class MyFrame(wx.Frame):
        def __init__(self):
            wx.Frame.__init__(self, None, -1, title = "Switch button")
            self.panel = wx.Panel(self, -1)
            self.bouton = None
            self.sizerPanel = wx.BoxSizer(wx.HORIZONTAL)
            self.panelGauche = wx.Panel(self.panel, -1)
            self.panelGauche.SetBackgroundColour(wx.BLUE)
            self.panelDroit = wx.Panel(self.panel, -1)
            self.panelDroit.SetBackgroundColour(wx.RED)
            self.szGauche = wx.BoxSizer(wx.VERTICAL)
            self.panelGauche.SetSizer(self.szGauche)
            self.szDroit = wx.BoxSizer(wx.VERTICAL)
            self.panelDroit.SetSizer(self.szDroit)
            self.sizerPanel.Add(self.panelGauche, 1, wx.EXPAND)
            self.sizerPanel.Add(self.panelDroit, 1, wx.EXPAND)
            self.panel.SetSizer(self.sizerPanel)
            titre = "Basculer -->"
            self.bouton = wx.Button(self.panelGauche, -1, titre)
            self.szGauche.AddStretchSpacer()
            self.szGauche.Add(self.bouton, 0, wx.ALIGN_CENTER|wx.ALL, 20)
            self.szGauche.AddStretchSpacer()
            self.panelGauche.Layout()
            self.position = 0
            self.panel.Fit()
            self.Fit()
     
            self.Bind(wx.EVT_BUTTON, self.Basculer, self.bouton)
     
        def Basculer(self, event):
            if self.position == 0:
                self.sizerPanel.Remove(self.panelGauche)
                self.sizerPanel.Remove(self.panelDroit)
                self.bouton.SetLabel("<-- Basculer")
                self.sizerPanel.Add(self.panelDroit, 1, wx.EXPAND)
                self.sizerPanel.Add(self.panelGauche, 1, wx.EXPAND)
                self.sizerPanel.Layout()
                self.position = 1
            else:
                self.sizerPanel.Remove(self.panelDroit)
                self.sizerPanel.Remove(self.panelGauche)
                self.bouton.SetLabel("Basculer -->")
                self.sizerPanel.Add(self.panelGauche, 1, wx.EXPAND)
                self.sizerPanel.Add(self.panelDroit, 1, wx.EXPAND)
                self.sizerPanel.Layout()
                self.position = 0
            self.Refresh()
     
    class MyApp(wx.App):
        def OnInit(self):
            f = MyFrame()
            f.Show(True)
            self.SetTopWindow(f)
            return True
     
    app = MyApp()
    app.MainLoop()

  5. #5
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 46
    Par défaut
    Dans la doc c'est marqué qu'un remove sur un sizer détruit le composant remové, dans mon cas avec des vidéos je pense que j'ai meilleur temps de faire ainsi, merci pour ton idée je vais voir ce que ca donne :-)

Discussions similaires

  1. Changer l'icône d'un composant crée
    Par tomkiki dans le forum Composants VCL
    Réponses: 5
    Dernier message: 28/01/2007, 17h01
  2. [Treeview] Changer le parent d'un Node
    Par Aloneghost dans le forum Delphi
    Réponses: 2
    Dernier message: 07/01/2007, 06h25
  3. parent/owner et composants créés dynamiquement
    Par OutOfRange dans le forum Delphi
    Réponses: 2
    Dernier message: 26/09/2006, 15h46
  4. Réponses: 2
    Dernier message: 09/08/2005, 08h51
  5. Parent d'un composant
    Par AF_STjohn dans le forum C++Builder
    Réponses: 6
    Dernier message: 06/05/2005, 17h35

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