2010-06-17 4 views
1

Si je définis le format de la première colonne dans un ListCtrl pour aligner le centre (ou aligner à droite) rien ne se passe. Cela fonctionne pour les autres colonnes.Impossible de formater la première colonne dans ListCtrl de WxPython

Cela ne se produit que sur Windows - Je l'ai testé sous Linux et cela fonctionne très bien. Est-ce que quelqu'un sait s'il existe une solution de rechange ou autre?

Voici un exemple basé sur le code trouvé à http://zetcode.com/wxpython/

import wx 
import sys 

packages = [('jessica alba', 'pomona', '1981'), ('sigourney weaver', 'new york', '1949'), 
    ('angelina jolie', 'los angeles', '1975'), ('natalie portman', 'jerusalem', '1981'), 
    ('rachel weiss', 'london', '1971'), ('scarlett johansson', 'new york', '1984')] 

class Actresses(wx.Frame): 
    def __init__(self, parent, id, title): 
     wx.Frame.__init__(self, parent, id, title, size=(380, 230)) 

     hbox = wx.BoxSizer(wx.HORIZONTAL) 
     panel = wx.Panel(self, -1) 

     self.list = wx.ListCtrl(panel, -1, style=wx.LC_REPORT) 
     self.list.InsertColumn(0, 'name', wx.LIST_FORMAT_CENTRE,width=140) 
     self.list.InsertColumn(1, 'place', wx.LIST_FORMAT_CENTRE,width=130) 
     self.list.InsertColumn(2, 'year', wx.LIST_FORMAT_CENTRE, 90) 

     for i in packages: 
      index = self.list.InsertStringItem(sys.maxint, i[0]) 
      self.list.SetStringItem(index, 1, i[1]) 
      self.list.SetStringItem(index, 2, i[2]) 

     hbox.Add(self.list, 1, wx.EXPAND) 
     panel.SetSizer(hbox) 

     self.Centre() 
     self.Show(True) 

app = wx.App() 
Actresses(None, -1, 'actresses') 
app.MainLoop() 
+0

Je remarque le même comportement dans votre exemple et dans mon application. Peut-être que c'est une limitation de la plate-forme Windows - voyez si vous pouvez trouver d'autres programmes avec une liste avec une première colonne alignée? –

Répondre

1

J'ai trouvé que cela fonctionne (remarquez que je commence à insérer les colonnes à 1 au lieu de 0):

self.list = wx.ListCtrl(panel, -1, style=wx.LC_REPORT) 
    self.list.InsertColumn(1, 'name', wx.LIST_FORMAT_CENTRE,width=140) 
    self.list.InsertColumn(2, 'place', wx.LIST_FORMAT_CENTRE,width=130) 
    self.list.InsertColumn(3, 'year', wx.LIST_FORMAT_CENTRE, 90) 

ne suis pas sûr pourquoi cela fonctionne mais c'est le cas. J'espère que cela n'aura aucune répercussion.

Merci à robots.jpg pour avoir inspiré l'idée.

0

Windows traite certainement la première colonne différemment. Une solution consiste à créer une colonne vide 0 et cacher:

class Actresses(wx.Frame): 
    def __init__(self, parent, id, title): 
     wx.Frame.__init__(self, parent, id, title, size=(380, 230)) 
     #... 

     self.list = wx.ListCtrl(panel, -1, style=wx.LC_REPORT) 
     self.list.InsertColumn(0, '', width=0) 
     self.list.InsertColumn(1, 'name', wx.LIST_FORMAT_CENTRE,width=140) 
     self.list.InsertColumn(2, 'place', wx.LIST_FORMAT_CENTRE,width=130) 
     self.list.InsertColumn(3, 'year', wx.LIST_FORMAT_CENTRE, width=90) 

     for i in packages: 
      index = self.list.InsertStringItem(sys.maxint, '') 
      self.list.SetStringItem(index, 1, i[0]) 
      self.list.SetStringItem(index, 2, i[1]) 
      self.list.SetStringItem(index, 3, i[2]) 

     # catch resize event 
     self.list.Bind(wx.EVT_LIST_COL_BEGIN_DRAG, self.OnColDrag) 
     #... 

    def OnColDrag(self, evt): 
     if evt.m_col == 0: 
      evt.Veto() 

Je ne peux pas penser à des principaux effets secondaires de le faire, mais laissez-moi savoir si je me trompe. Je suppose que GetItemText() ou toute autre chose qui suppose qu'il y a des données utiles dans la première colonne ne serait plus utile.

Edition - code ajouté pour empêcher le redimensionnement colonne 0.

+0

C'est une bonne idée, et cela fonctionne; Cependant, l'utilisateur peut redimensionner la colonne cachée. Je pense que ce sera un problème. Votre réponse m'a donné une idée - que se passe-t-il si j'ajoute une colonne fictive et que je la supprime après l'ajout des autres colonnes? –

+0

Pour résoudre ce problème, vous pouvez attraper l'événement de déplacement de la colonne et mettre son veto s'il est sur la colonne 0 (ajoutera ceci à ma réponse). Votre solution gagne pour la simplicité, cependant. Je n'avais pas réalisé que vous pouviez ignorer l'index 0 comme ça, tout en accédant toujours à la première colonne en tant que 0 à partir de fonctions comme SetStringItem. Je veux savoir comment cela fonctionne maintenant. –

Questions connexes