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 :

Scrollbar et bug d'affichage


Sujet :

wxPython

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 6
    Par défaut Scrollbar et bug d'affichage
    Salut,

    J'ai placé dans ma frame un bloc contenant divers widgets dont la hauteur n'est pas fixe, ce pourquoi j'utilise une scrollbar. L'effet recherché est comparable aux <iframe> HTML.

    Pour obtenir ce résultat, j'ai utilisé ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.centre = wxScrolledWindow(self.frame, -1, style=wxSUNKEN_BORDER, pos=(10,10), size=(750,400))
    self.centre.SetBackgroundColour("WHITE")
    1er problème: Malgré les paramètres pos et size, la wxScrolledWindow occupe tout l'espace de la frame alors que celle-ci a pour dimension 800x600. Chose étrange, l'ajout d'un wxPanel règle ce problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.masque = wxPanel(self.frame,-1,size=wxSize(800,600))
    2eme problème: Lorsque j'utilise la scrollbar pour voir le bas du bloc, pas de problèmes, mais quand je remonte il y a un gros bug d'affichage: les labels se superposent.

    Ca n'a rien à voir mais: comment supprimer un widget , ou au moins le masquer ?

  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
    La wx.Frame est normalement utilisée comme fenêtre principale. Son comportement peut différer selon l'OS, mais en général, sa zone cliente ne doit pas être utilisée directement pour le placement de contrôles, car la tendance d'un objet placé dans une wx.Frame est de remplir l'espace disponible, qu'elles que soient les propriétés de taille ou de position qu'on lui ait donné.

    C'est pourquoi j'y place généralement un wx.Panel qui sert de conteneur pour mes contrôles.

    Pour ce qui concerne la wx.ScrolledWindow et le comportement des contrôles qui y sont placés, il faudrait que tu me montres ton code. Mais saches que si tu n'utilises pas les sizers pour placer tes contrôles, tu aura bien de la peine à scroller correctement ta fenêtre.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 6
    Par défaut
    Ok donc le premier problème est reglé.

    Concernant le second problème, j'ai essayé d'utiliser les sizers mais sans résultats.
    Voici mon code raccourci:

    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
     
    class MyApp(wxApp):
        def OnInit(self):
              self.frame = wxFrame(NULL, -1, "Titre",size=(800,600))
              self.masque = wxPanel(self.frame,-1,size=(800,600))
              self.centre = wxScrolledWindow(self.masque, -1, style=wxSUNKEN_BORDER, pos=(10,10), size=(750,400))
              self.liste = wxBoxSizer(wxVERTICAL)
              self.updatecont()
              ........
      def updatecont(self):
            for d in self.doublons:
                blocdoublon = wxBoxSizer(wxHORIZONTAL)             
                for k in range(0,2):        
                    blocdossier = wxBoxSizer(wxVERTICAL)
                    blocdossier.Add(wxStaticText(self.centre, -1, "nom dossier"), -1, wxEXPAND)
                    blocdossier.Add(wxStaticText(self.centre, -1, "date"), -1, wxEXPAND)
     
                    blocdoublon.Add(blocdossier,-1,wxEXPAND)
     
                self.liste.Add(blocdoublon,-1,wxEXPAND)    
     
            self.centre.SetScrollbars(0, 1, 0, len(self.doublons)*50)
    Le résultat voulu c'est une liste de blocdoublons dans un wxScrolledWindow. Chaque blocdoublon est composé de deux blocdossiers alignés horizontalement qui contiennent deux labels.

    Le résultat obtenu c'est tous les labels superposés en haut à gauche de la wxScrolledWindow.

  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
    Il te manque :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.masque.SetSizer(self.liste)
    pour lier ton sizer à ton wx.Panel

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 6
    Par défaut
    Merci.
    Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.centre.SetSizer(self.liste)
    ça marche, mais j'ai toujours ce bug d'affichage quand je remonte avec la scrollbar (certains labels se superposent). Je suis sous MAC OS X.

    Ce qui peut paraitre étrange, c'est que je suis obligé de mettre le SetSizer avant le remplissage du Sizer, c.a.d avant self.updatecont(), sinon j'obtiens le même résultat que sans le SetSizer.

  6. #6
    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
    Je me suis permis de mettre de l'ordre dans ton code, de façon à séparer la construction de la Frame par rapport à son lancement dans la classe wx.App, en construisant une classe dérivée de wx.Frame dédiée à cela, et en faisant de ta fonction updatecont une méthode de la classe wx.Frame.

    Ceci dit, pour faire une fenêtre de contrôles scrollable, mieux vaut utiliser la classe scrolledPanel située dans les addon de wx, sous lib.

    C'est ce que j'ai fait, et que j'ai testé avec ton code remanié.

    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
    #! /usr/bin/env python
    #-*- coding: utf-8 -*-
     
    import wx
    import wx.lib.scrolledpanel as scrolled
     
    class MaFrame(wx.Frame):
    	def __init__(self, titre):
    		wx.Frame.__init__(self, None, -1, title = titre)
    		masque = wx.Panel(self, -1, size = (800, 600))
    		self.centre = scrolled.ScrolledPanel(masque, -1, style = wx.SUNKEN_BORDER, pos = (10, 10), size = (750, 400))
    		self.liste = wx.BoxSizer(wx.VERTICAL)
    		self.doublons = [0, 1, 2, 3, 4, 5]
    		self.UpdateCont()
    		self.centre.SetSizer(self.liste)
    		self.centre.SetAutoLayout(1)
    		self.centre.SetupScrolling()
    		self.Fit()
     
    	def UpdateCont(self):
    		for d in self.doublons:
    			blocdoublon = wx.BoxSizer(wx.HORIZONTAL)             
    			for k in range(2):
    				blocdossier = wx.BoxSizer(wx.VERTICAL)
    				blocdossier.Add(wx.StaticText(self.centre, -1, "nom dossier"), 0, wx.EXPAND|wx.ALL, 10)
    				blocdossier.Add(wx.StaticText(self.centre, -1, "date"), 0, wx.EXPAND|wx.ALL, 10)
     
    				blocdoublon.Add(blocdossier,0,wx.ALIGN_CENTRE)
     
    			self.liste.Add(blocdoublon,0,wx.EXPAND)    
     
    		#self.centre.SetScrollbars(0, 1, 0, len(self.doublons)*50)
     
    class MyApp(wx.App):
    	def OnInit(self):
    		frame = MaFrame("Titre")
    		frame.Show(True)
    		self.SetTopWindow(frame)
    		return True
     
    app = MyApp()
    app.MainLoop()

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

Discussions similaires

  1. [CSS 3] Bug d'affichage Safari / Overflow:hidden & scrollbar personnalisée
    Par fakear dans le forum Mise en page CSS
    Réponses: 0
    Dernier message: 06/02/2015, 01h33
  2. [W3C] [IE] bug d'affichage
    Par sidero dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 18/05/2005, 15h45
  3. [AWT] Bug d'affichage
    Par deathwing dans le forum Composants
    Réponses: 3
    Dernier message: 17/05/2004, 17h39
  4. [TP]TP7/XP : bug d'affichage
    Par art dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 17/04/2004, 22h20

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