2012-06-20 5 views
0

Помощь!wxListCtrl не отображается правильно

Я программист, не являющийся GUI, который пытается написать простую (!) Программу с использованием wxPython.

Я прочитал все, что я могу в Интернете, но мое общее отсутствие опыта графического интерфейса, по-видимому, заставляет меня не видеть проблему.

В двух словах, я хочу иметь окно с wxNotebook с несколькими вкладками. На каждой вкладке, конечно же, будут свои дочерние виджеты. Я предполагаю наличие либо wxListCtrl (как в моем коде), либо, возможно, элемент управления wxGrid, а также несколько кнопок.

Вот мой класс «EmployeesPanel». Когда я запускаю это, я вижу крошечный квадрат, который должен представлять список, но для жизни я не могу понять, как сделать его правильным. Конечно, возможно, что я ухожу с базы в некоторых других областях.

Любая помощь относительно того, что я делаю неправильно, с благодарностью.

Вот код:

import wx 
import sys 

employees = [('Earl Boffo', 'Software'), ('Mildred Plotka', 'Software'), ('Sugar Kane', 'QA')] 

classes = [('Python'), ('Java'), ('C#')] 

class EmployeesPanel(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 

     # create some sizers 
     mainSizer = wx.BoxSizer(wx.VERTICAL) 
     grid = wx.GridBagSizer(hgap=5, vgap=5) 

     #hSizer = wx.BoxSizer(wx.HORIZONTAL|wx.EXPAND) 
     hSizer = wx.BoxSizer(wx.HORIZONTAL) 

     panel = wx.Panel(self, -1) 

     self.list = wx.ListCtrl(panel, size=(100,100), style=wx.LC_REPORT) 

     self.list.InsertColumn(0, 'Name') 
     self.list.InsertColumn(1, 'Group') 

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

     # A button 
     self.button = wx.Button(self, label="Exit") 
     self.Bind(wx.EVT_BUTTON, self.OnClick,self.button) 
     self.list.Show(True) 

     # add the listctrl widget to the grid 
     grid.Add(self.list, pos=(0,0), flag=wx.EXPAND|wx.ALL) 

     # add the button to the grid 
     grid.Add(self.button, pos=(1,0)) 

     # add a spacer to the sizer 
     grid.Add((10, 40), pos=(1,1)) 

     # add grid to hSizer 
     hSizer.Add(grid, 0, wx.ALL, 5) 

     # add hSizer to main (v) sizer 
     mainSizer.Add(hSizer, 0, wx.ALL, 5) 
     self.SetSizerAndFit(mainSizer) 
     self.Show() 

    def EvtComboBox(self, event): 
     self.logger.AppendText('EvtComboBox: %s\n' % event.GetString()) 
    def OnClick(self,event): 
     sys.exit(3) 

app = wx.App(False) 
frame = wx.Frame(None, title="Training Tracker", size=(700,500)) 
nb = wx.Notebook(frame) 

nb.AddPage(EmployeesPanel(nb), "Employees") 
frame.Show() 
app.MainLoop() 
+0

Что произойдет, если добавить строку 'уверенность. Макет() 'после' self.SetSizerAndFit() '? Это, как правило, первое, что я стараюсь, когда проблема с wxPython. Это заставляет пересчитывать все величины. Кроме того, что, если вы только называете self.SetSizer() 'вместо' self.SetSizerAndFit() '? – acattle

+0

Спасибо за ответ. Ни один из них не изменил поведение вообще. Я могу попробовать тот же пример, но с помощью элемента управления Grid, чтобы увидеть, как он изменяется, если вообще. – mitchmcc

ответ

2

Добро пожаловать в WxPython! На самом деле это очень весело, когда вы получите это. Я почти никогда не использую сетчатые sizers, поскольку они просто боль для простых макетов, подобных этому. Если у вас есть сетка, подобная интерфейсу, и у вас нет элементов управления, которые будут растягиваться по ячейкам, тогда это здорово. В противном случае я почти всегда использую BoxSizers, вложенные друг в друга. Я немного упростил ваш код, чтобы показать два виджета. В настоящее время контроль списка растягивается горизонтально. Если вам нужно, чтобы он тоже был вертикально, измените пропорцию от 0 до 1 в секции sizer.Add.

import wx 
import sys 

employees = [('Earl Boffo', 'Software'), ('Mildred Plotka', 'Software'), ('Sugar Kane', 'QA')] 

classes = [('Python'), ('Java'), ('C#')] 

class EmployeesPanel(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 

     # create some sizers 
     mainSizer = wx.BoxSizer(wx.VERTICAL) 

     self.list = wx.ListCtrl(self, size=(100,100), style=wx.LC_REPORT) 

     self.list.InsertColumn(0, 'Name') 
     self.list.InsertColumn(1, 'Group') 

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

     # A button 
     self.button = wx.Button(self, label="Exit") 
     self.Bind(wx.EVT_BUTTON, self.OnClick,self.button) 

     mainSizer.Add(self.list, 0, wx.EXPAND|wx.ALL, 5) 
     mainSizer.Add(self.button, 0, wx.ALL, 5) 

     self.SetSizer(mainSizer) 
     self.Show() 

    def EvtComboBox(self, event): 
     self.logger.AppendText('EvtComboBox: %s\n' % event.GetString()) 
    def OnClick(self,event): 
     sys.exit(3) 

app = wx.App(False) 
frame = wx.Frame(None, title="Training Tracker", size=(700,500)) 
nb = wx.Notebook(frame) 

nb.AddPage(EmployeesPanel(nb), "Employees") 
frame.Show() 
app.MainLoop() 

Я также думаю, что эти статьи могут помочь вам:

+0

Ничего себе, спасибо, Майк! Я обязательно изучу этот код. Будучи программистом в основном встроенных систем, я не программировал много пользовательского интерфейса, так что это поможет совсем немного. Мне нравится идея быть независимой от платформы с Python! – mitchmcc

+0

Да, скалы wxPython! –

Смежные вопросы