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 :

Sizers créés par un évènement : possible ?


Sujet :

wxPython

  1. #1
    Membre éprouvé
    Inscrit en
    Octobre 2006
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 92
    Par défaut Sizers créés par un évènement : possible ?
    Bonjour,

    Je suis grand débutant en Python et m’essaye pour le moment à WxPython pour mes GUI, avec IDLE, et construction de l’interface à la mano (j’apprend mieux comme ça !). L’appli doit tourner sous Linux et sous Windows.

    Mon problème : les sizers… si je crée mes sizers et que j’y attache les contrôles lors de la méthode __init__ de ma frame principale, aucun problème sous Linux comme sous Win.

    Mais ce que je voudrais, c’est que mes sizers soient créés lors d’un événement. Et là, savapadutou... Sous linux, ma frame s’affiche au poil, puis les sizers font exactement ce que je désire lorsque je redimensionne ma feuille. Mais le même code sous Windows ne donne pas le même résultat : tout ce qui est lié à un sizer s’affiche dans l’angle supérieur gauche de ma frame et est tronqué sous forme d’un petit carré : mais si j’essaie de redimensionner ma frame, hop ! Comme par magie, tous les contrôles s’affichent correctement et sont redimensionnés convenablement par les sizers.

    Heu... Au secours ?

    Ma version de Windows est Windows 2000. J’utilise WxPython 2.6.

  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
    Tu devrais mettre ton code en ligne de façon à ce qu'on puisse voir ce qui cloche...
    En attendant, ce phénomène se produit souvent quand le traitement de ton évènement stoppe le processus d'affichage de ta fenêtre. Pour éviter cela il suffit souvent d'ajouter la méthode Skip() en fin de traitement dans ta procédure d'évènement, pour le libérer et le laisser continuer son travail.

    La méthode Skip() doit être appliquée à l'évènement sous la forme event.Skip() où event est le nom du paramètre de ta procédure.

  3. #3
    Membre éprouvé
    Inscrit en
    Octobre 2006
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 92
    Par défaut
    Bonsoir et merci de vous pencher sur mes soucis... j'avais bien trouvé la méthode Skip(), qui est documentée dans votre tuto et c'est du coup un des premiers trucs que j'ai essayé. Mais hélas...

    Je joins le code à mon message.

    Ce qui me disturbe, c'est que j'ai le problème que sous win ?!
    Fichiers attachés Fichiers attachés

  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
    Effectivement il peut exister quelques différences de comportement des widgets selon la plateforme.

    Sous win, un wx.Panel posé sur une wx.Frame ne se cale pas immédiatement dans la zone cliente, alors que sous linux oui.

    J'ai donc modifié ta procédure en donnant à ton wx.Panel la taille de la zone cliente de la Frame, puis comme il existe un second petit bug sous win, j'ai donné explicitement la position 0 vertical à ton wx.Panel, à défaut de quoi, il aurait chevauché ton wx.ToolBar, alors qu'un wx.ToolBar est sensé ne pas faire partie de la zone cliente (rien n'est parfait).

    Enfin, j'ai mis en commentaire la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.SetToolBar(BarOutil)
    car elle est inutile lorsqu'on utilise la fonction pour créer l'instance. En effet dans ce cas cette instance est automatiquement liée à la wx.Frame.

    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/env python
    # -*- coding: iso-8859-15 -*-
     
    import wx
     
    class PanneauOpsPVClass(wx.Panel):
        def __init__(self, parent):
            wx.Panel.__init__(self, parent, -1)   
            Ops = wx.RadioBox(self, -1, u"Ops", choices=[u"Agrément"], majorDimension=4, style=wx.RA_SPECIFY_ROWS)
            SizerPanneauOpsPV = wx.BoxSizer(wx.VERTICAL)
            SizerPanneauOpsPV.Add(Ops, 0, wx.EXPAND) 
            self.SetSizer(SizerPanneauOpsPV)
     
    class FenMainClass(wx.Frame):
        def __init__(self):
            wx.Frame.__init__(self, None, -1)
     
            self.MenuMain = wx.MenuBar()
            self.SetMenuBar(self.MenuMain)
            self.MenuProjet = wx.Menu()
     
            self.MenuMain.Append(self.MenuProjet, "&Projet")
     
            self.MenuNewProjet = wx.Menu()
            self.MenuContrat = self.MenuNewProjet.Append(-1, "&Contrat")
            self.MenuConstitution = self.MenuNewProjet.Append(-1, u"&Société")
            self.MenuPV = self.MenuNewProjet.Append(-1, u"&PV")
            self.Bind(wx.EVT_MENU, self.OnMenuPV, self.MenuPV) 
            self.MenuProjet.AppendMenu(-1, "&Nouveau projet", self.MenuNewProjet)
     
            BarOutil = self.CreateToolBar(-1, wx.TB_3DBUTTONS)
            ToolNewPV= BarOutil.AddSimpleTool(-1, wx.Bitmap("NewPV.bmp",  wx.BITMAP_TYPE_BMP), shortHelpString = u"PV")        
            BarOutil.Realize()
            #self.SetToolBar(BarOutil)
     
            self.BarEtatMain = self.CreateStatusBar(1, 0)
            self.BarEtatMain.SetStatusWidths([-1])
            self.BarEtatMain_fields = ["Std"]
            for i in range(len(self.BarEtatMain_fields)):
                self.BarEtatMain.SetStatusText(self.BarEtatMain_fields[i], i)
     
            self.SetTitle("JuriActes")
            self.SetSize((672, 448))
            self.Centre()
     
        def OnMenuPV(self, evt):
     
            self.PanneauMaj = wx.Panel(self)
            ListeGauche = wx.ListCtrl(self.PanneauMaj, -1, size=(125, 150), style=wx.LC_ICON|wx.SUNKEN_BORDER)
            SizerGche = wx.BoxSizer(wx.HORIZONTAL)
            SizerGche.Add(ListeGauche, 0, wx.EXPAND|wx.TOP|wx.LEFT|wx.BOTTOM, 10)
     
            PanneauOpsPV = PanneauOpsPVClass(self.PanneauMaj)
     
            SizerDroit = wx.BoxSizer(wx.VERTICAL)    
            SizerGche.Add(SizerDroit, 1, wx.EXPAND|wx.ALL, 10)
            SizerDroit.Add(PanneauOpsPV, 1, wx.EXPAND)
     
            self.PanneauMaj.SetSizer(SizerGche)
            self.PanneauMaj.SetSize(self.GetClientSize())
            self.PanneauMaj.SetPosition((-1, 0))
            evt.Skip()
     
    class MonApp(wx.App):
        def OnInit(self):
            FenMain = FenMainClass()
            FenMain.Show(True)
            self.SetTopWindow(FenMain)
            return True
     
    app = MonApp()
    app.MainLoop()

  5. #5
    Membre éprouvé
    Inscrit en
    Octobre 2006
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 92
    Par défaut
    Bonjour,

    Alors là, mille mercis... Je ne me doutais pas de ce truc-là, c'est vraiment indispensable à savoir si on veut faire du multi-OS.

    Au passage, je crois que je comprend mieux les réactions de Glade, que j'ai essayé au début, sous Linux qui est mon OS au quotidien. En effet, la version fournie avec ma distro - Mandriva 2006 - affichait chaque slot d'un sizer en phase de construction "à la windows" : petit carré en haut à gauche ; mais en prévisualisation (normal je suis sous nux), l'affichage était correct !

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

Discussions similaires

  1. valeur par défaut aléatoire - possible ?
    Par MikeAden dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 11/05/2007, 14h17
  2. Réponses: 2
    Dernier message: 05/07/2006, 11h07
  3. [CSS] copie des styles par défaut html...possible?
    Par luta dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 27/10/2005, 08h50
  4. [Tomcat]Droit d'accès aux fichiers créés par une servlet
    Par loulouleboss dans le forum Tomcat et TomEE
    Réponses: 7
    Dernier message: 15/07/2004, 14h32

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