Pergunta

Se eu definir o formato da primeira coluna em um listctrl para alinhar o centro (ou alinhar à direita), nada acontece. Funciona para as outras colunas.

Isso só acontece no Windows - eu o testei no Linux e funciona bem. Alguém sabe se existe uma solução de trabalho ou outra solução?

Aqui está um exemplo baseado no código encontrado em 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()
Foi útil?

Solução

Descobri que isso funciona (observe que começo a inserir as colunas em 1 em vez 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)

Não sei por que isso funciona, mas funciona. Felizmente, não haverá repercussões por fazer isso.

Obrigado a robots.jpg por inspirar a ideia.

Outras dicas

O Windows definitivamente trata a primeira coluna de maneira diferente. Uma solução alternativa é criar uma coluna vazia 0 e ocultá -la:

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()

Não consigo pensar em nenhum grande efeito colateral de fazer isso, mas me avise se estou errado. Eu acho que getItemText () ou qualquer outra coisa que assume que há dados úteis na primeira coluna não seriam mais úteis.

EDIT - Código adicionado para evitar a redimensionamento da coluna 0.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top