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 :

Auto size d'une listCtrl


Sujet :

wxPython

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 16
    Points : 16
    Points
    16
    Par défaut Auto size d'une listCtrl
    Bonjour
    je travaille actuellement sur un petit logiciel mais j'ai un probleme avec une ListCtrl. En effet, elle possede 3 colonnes dont la largeur est figée. Je voudrais que cette largeur prenne toute la page et non une taille fixe (liée au nom de chaque colonne). 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
    33
    34
    35
    36
    37
    38
    39
     
    #!/usr/bin/env python
    # -*- coding: latin-1 -*-
     
     
    import wx
     
    class MyFrame(wx.Frame):
    	def __init__(self, parent, id, title):
    		wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition)
    		self.SetIcon(wx.Icon('note.ico', wx.BITMAP_TYPE_ICO))
     
    		splitter = wx.SplitterWindow(self, -1)
    		panneau1 = wx.Panel(splitter, -1)
    		panneau1.SetBackgroundColour(wx.LIGHT_GREY)
    		vbox2 = wx.BoxSizer(wx.VERTICAL)
    		panneau2 = wx.Panel(splitter, -1,size=(-1,-1))
    		self.lc = wx.ListCtrl(panneau2, -1,  style=wx.LC_REPORT, size=(-1,-1))
     
    		self.lc.InsertColumn(0, 'Radio')
    		self.lc.InsertColumn(1, 'Genre')
    		self.lc.InsertColumn(2, 'Note')
     
    		vbox2.Add(self.lc, 1, wx.EXPAND | wx.ALL, 3)
    		panneau2.SetSizer(vbox2)
     
    		splitter.SplitVertically(panneau1, panneau2)
     
     
     
    class MyApp(wx.App):
    	def OnInit(self):
    		frame = MyFrame(None, -1, "Lecteur Radio")
    		frame.Show(True)
    		self.SetTopWindow(frame)
    		return True 
     
    app = MyApp(0)
    app.MainLoop()

  2. #2
    Membre averti
    Avatar de Alain_72
    Inscrit en
    Août 2004
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 180
    Points : 342
    Points
    342
    Par défaut
    Tu peux gérer ça en utilisant la fonction wx.ListCtrl.SetColumnWidth(column, width) dans un événement wx.EVT_PAINT de ta classe MyFrame.

    Je te l'ai fait en exemple ci-dessous...

    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
    #!/usr/bin/env python
    # -*- coding: latin-1 -*-
     
     
    import wx
     
    class MyFrame(wx.Frame):
    	def __init__(self, parent, id, title):
    		wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition)
    		self.SetIcon(wx.Icon('note.ico', wx.BITMAP_TYPE_ICO))
     
    		splitter = wx.SplitterWindow(self, -1)
    		panneau1 = wx.Panel(splitter, -1)
    		panneau1.SetBackgroundColour(wx.LIGHT_GREY)
    		vbox2 = wx.BoxSizer(wx.VERTICAL)
    		panneau2 = wx.Panel(splitter, -1,size=(-1,-1))
    		self.lc = wx.ListCtrl(panneau2, -1,  style=wx.LC_REPORT, size=(-1,-1))
     
    		self.lc.InsertColumn(0, 'Radio')
    		self.lc.InsertColumn(1, 'Genre')
    		self.lc.InsertColumn(2, 'Note')
     
    		vbox2.Add(self.lc, 1, wx.EXPAND | wx.ALL, 3)
    		panneau2.SetSizer(vbox2)
     
    		splitter.SplitVertically(panneau1, panneau2)
     
    		self.Bind(wx.EVT_PAINT, self.OnPaint)
     
    	def OnPaint(self, evt):
    		larg, haut = self.lc.GetSize()
    		for i in range(3):
    			self.lc.SetColumnWidth(i, larg/3)
    		evt.Skip()
     
    class MyApp(wx.App):
    	def OnInit(self):
    		frame = MyFrame(None, -1, "Lecteur Radio")
    		frame.Show(True)
    		self.SetTopWindow(frame)
    		return True 
     
    app = MyApp(0)
    app.MainLoop()
    Je ne traite pas les problèmes techniques par MP...
    Les forums sont là pour ça...

    Les contributions du bipede

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Merci ca marche nickel

    Mais maintenant j'ai un autre probleme. Je voudrais ajouter des images dans une ListCtrl. J'ai regarder dans les exemples donnés mais j'arrive pas a le faire marcher. Voila le code que j'ai réalisé:
    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
    import  wx
    
    class Configuration(wx.Frame):
    	def __init__(self):
    		wx.Frame.__init__(self, parent = None, id = -1, title = u"Preference",style=wx.DEFAULT_FRAME_STYLE,size=(400,400))
    
    		bmp = wx.Image('bitmaps/image.bmp', wx.BITMAP_TYPE_BMP).ConvertToBitmap()
    		gif = wx.Image('bitmaps/image.gif', wx.BITMAP_TYPE_GIF).ConvertToBitmap()
    		png = wx.Image('bitmaps/image.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap()
    		jpg = wx.Image('bitmaps/image.jpg', wx.BITMAP_TYPE_JPEG).ConvertToBitmap()
    
    		self.list = wx.ListCtrl(self, -1, style=wx.LC_REPORT)
    		
    		self.list.il = wx.ImageList(16, 16)
    		self.list.idx1 = self.list.il.Add(bmp)
    		self.list.idx2 = self.list.il.Add(gif)
    		self.list.idx3 = self.list.il.Add(png)
    		self.list.idx4 = self.list.il.Add(jpg)
    		
    		print self.list.SetImageList(self.list.il, wx.IMAGE_LIST_NORMAL)
    		self.list.InsertImageItem(?, ?)
    		self.list.InsertColumn(0, "First")
    		self.list.InsertColumn(1, "Second")
    		self.list.InsertColumn(2, "Third")
    		self.list.SetColumnWidth(0, 175)
    		self.list.SetColumnWidth(1, 175)
    		self.list.SetColumnWidth(2, 175)
    		self.list.InsertStringItem(0, "ligne0 colonne0")
    		self.list.SetStringItem(0, 1,"ligne0 colonne1")
    		self.list.SetStringItem(0, 2,"ligne0 colonne2")
    		
    class Fenetre(wx.App):
    	def OnInit(self):
    		fen = Configuration()
    		fen.Show(True)
    		self.SetTopWindow(fen)
    		return True
    
    app = Fenetre()
    app.MainLoop()
    Pour ajouter du texte il n' a pas de probleme mais c'est plus délicat pour les images. J'ai donc crée un ImageListe qui contient bien les images voulues mais par contre impossible de les afficher. Je pense utiliser la fonction self.list.InsertImageItem().

  4. #4
    Membre averti
    Avatar de Alain_72
    Inscrit en
    Août 2004
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 180
    Points : 342
    Points
    342
    Par défaut
    Plusieurs observations :

    - La wx.ImageList associée à la wx.ListCtrl doit être de type wx.IMAGE_LIST_SMALL pour que ça fonctionne (ne me demande pas pourquoi, je n'en sais rien)
    - Pour associer la wx.ImageList à la wx.ListCtrl, tu dois utiliser la fonction wx.ListCtrl.SetImageList(), sinon ça ne fonctionne pas. Eviter les affectations de type "self.list.il" qui risquent de provoquer des problèmes.
    - Une image ne semble pouvoir être affichée que dans la première colonne de chaque ligne (je n'avais jamais utilisé les images dans les wx.ListCtrl jusqu'à présent).
    - Pour insérer une image et du texte dans la première colonne d'une liste, utiliser la fonction wx.ListCtrl.InsertImageStringItem(ligne, texte, index de l'image).

    Pour exemple, je te joins ton code modifié en conséquence.

    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
    import  wx
     
    class Configuration(wx.Frame):
    	def __init__(self):
    		wx.Frame.__init__(self, parent = None, id = -1, title = u"Preference",style=wx.DEFAULT_FRAME_STYLE,size=(400,400))
     
    		bmp = wx.Image('bitmaps/image.bmp', wx.BITMAP_TYPE_BMP).ConvertToBitmap()
    		gif = wx.Image('bitmaps/image.gif', wx.BITMAP_TYPE_GIF).ConvertToBitmap()
    		png = wx.Image('bitmaps/image.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap()
    		jpg = wx.Image('bitmaps/image.jpg', wx.BITMAP_TYPE_JPEG).ConvertToBitmap()
     
    		self.list = wx.ListCtrl(self, -1, style=wx.LC_REPORT)
     
    		self.il = wx.ImageList(16, 16)
    		self.idx1 = self.il.Add(bmp)
    		self.idx2 = self.il.Add(gif)
    		self.idx3 = self.il.Add(png)
    		self.idx4 = self.il.Add(jpg)
     
    		self.list.SetImageList(self.il, wx.IMAGE_LIST_SMALL)
    		self.list.InsertColumn(0, "First")
    		self.list.InsertColumn(1, "Second")
    		self.list.InsertColumn(2, "Third")
    		self.list.SetColumnWidth(0, 175)
    		self.list.SetColumnWidth(1, 175)
    		self.list.SetColumnWidth(2, 175)
    		self.list.InsertImageStringItem(0, "ligne0 colonne0", self.idx1)
    		self.list.SetStringItem(0, 1,"ligne0 colonne1")
    		self.list.SetStringItem(0, 2,"ligne0 colonne2")
    		self.list.InsertImageStringItem(1, "ligne1 colonne0", self.idx2)
    		self.list.SetStringItem(1, 1,"ligne1 colonne1")
    		self.list.SetStringItem(1, 2,"ligne1 colonne2")
    		self.list.InsertImageStringItem(2, "ligne2 colonne0", self.idx3)
    		self.list.SetStringItem(2, 1,"ligne2 colonne1")
    		self.list.SetStringItem(2, 2,"ligne2 colonne2")
    		self.list.InsertImageStringItem(3, "ligne3 colonne0", self.idx4)
    		self.list.SetStringItem(3, 1,"ligne3 colonne1")
    		self.list.SetStringItem(3, 2,"ligne3 colonne2")
     
    class Fenetre(wx.App):
    	def OnInit(self):
    		fen = Configuration()
    		fen.Show(True)
    		self.SetTopWindow(fen)
    		return True
     
    app = Fenetre()
    app.MainLoop()
    Je ne traite pas les problèmes techniques par MP...
    Les forums sont là pour ça...

    Les contributions du bipede

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Merci de tes explications. Ca marche tres bien.

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

Discussions similaires

  1. Auto-scroll d'une zone de texte multi ligne
    Par malek_dz77 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 30/11/2005, 13h09
  2. Réponses: 3
    Dernier message: 27/11/2005, 20h57
  3. 2 auto increment dans une meme table
    Par gesualda dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 12/10/2005, 09h31
  4. Separateur vertical dans une ListCtrl
    Par jul54 dans le forum MFC
    Réponses: 2
    Dernier message: 15/01/2004, 15h33
  5. Pb d'auto-incrément sur une table v7
    Par Nivux dans le forum Paradox
    Réponses: 9
    Dernier message: 26/12/2002, 12h05

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