2010-06-17 6 views
1

ListCtrl의 첫 번째 열의 형식을 가운데 맞춤 (또는 오른쪽 맞춤)으로 설정하면 아무 일도 발생하지 않습니다. 다른 열에도 적용됩니다.WxPython의 ListCtrl에서 첫 번째 열의 서식을 지정할 수 없습니다.

이 문제는 Windows에서만 발생합니다. Linux에서 테스트 한 결과 정상적으로 작동합니다. 워크 랩 또는 다른 솔루션이 있는지 아는 사람 있습니까? 여기

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

샘플 및 애플리케이션 모두에서 동일한 동작이 발생합니다. Windows 플랫폼의 한계 일 수도 있습니다. 정렬 된 첫 번째 열이있는 목록이있는 다른 프로그램을 찾을 수 있는지 확인하십시오. –

답변

1

열을 크기 조정 방지 코드 (I 1이 아니라 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) 

확실하지 왜이 작품을 ,하지만 그렇습니다. 다행히도,이 일에서 어떤 반향도 없을 것입니다.

아이디어를 고취 한 robots.jpg에게 감사드립니다.

0

Windows가 확실히 첫 번째 열을 다르게 취급에서 찾을 코드를 기반으로 한 예입니다. 내가이 일에서 어떤 중요한 부작용을 생각할 수 없다

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

하지만, 내가 틀렸다면 알려 : 한 가지 해결 방법은 빈 열 0을 만들고 그것을 숨기는 것입니다. 나는 GetItemText() 또는 첫 번째 열의 유용한 데이터가 더 이상 유용하지 않다고 가정하는 그 밖의 것으로 추측합니다.

편집 - 추가 나는이 작품 것으로 나타났습니다 0

+0

이것은 좋은 생각이며 작동합니다. 그러나 사용자는 숨겨진 열의 크기를 조정할 수 있습니다. 나는 이것이 문제가 될 것이라고 생각한다. 당신의 대답은 저에게 아이디어를주었습니다. 만약 더미 컬럼을 추가하고 다른 컬럼들이 추가 된 후에 그것을 삭제했다면 어떻게 될까요? –

+0

이를 해결하기 위해, 열 끌기 이벤트를 잡아서 열 0에 있으면 거부 할 수 있습니다 (내 대답에이를 추가합니다). 그러나 솔루션은 단순성을 위해 이깁니다. 나는 당신이 인덱스 0을 스킵 할 수 있다는 것을 깨닫지 못했다. 그러나 여전히 SetStringItem과 같은 함수에서 첫 번째 컬럼에 0을 여전히 액세스한다. 그게 지금 어떻게 작동하는지 알고 싶습니다. –

관련 문제