2013-07-03 7 views
1

У меня возникли проблемы с обновлением сетки wx после ее создания на Python. Я следую шагам, расположенным здесь: http://wiki.wxpython.org/wxGrid , но по какой-то причине сетка отображается неправильно. Строки продолжают добавляться и добавляться, несмотря на то, что данные растут или сжимаются.Изменение размера сетки при изменении данных сетки

Вот код. Нажатие кнопки обновления повторно инициализирует данные, которые должна отображать сетка. Ошибка (я думаю) в функции refreshGrid, но я не могу понять, что ее вызывает!

import wx 
from wxPython.wx import * 
from wxPython.grid import * 
import wx.grid 
import wx.grid as gridlib 
from wx.grid import Grid 
import os 
import sys 

class MyForm(wx.Frame): 

    def __init__(self): 
     self.refreshMyData() 

     #- Initialize the window: 
     wx.Frame.__init__(self, None, wx.ID_ANY, "Grid with Popup Menu", size=(1100,300)) 

     # Add a panel so it looks correct on all platforms 
     self.panel = wx.Panel(self, wx.ID_ANY) 

     num_of_columns = 3 
     self.grid = gridlib.Grid(self.panel) 
     self.grid.CreateGrid(len(self.myDataList), num_of_columns) 

     # change a couple column labels 
     self.grid.SetColLabelValue(0, "Name") 
     self.grid.SetColLabelValue(1, "Tag") 
     self.grid.SetColLabelValue(2, "ID") 

     self.refreshGrid() 

     toolbar = self.CreateToolBar() 

     qtool = toolbar.AddLabelTool(wx.ID_ANY, 'Refresh', wx.Bitmap(os.path.join(os.path.dirname(__file__), 'refresh.png'))) 
     toolbar.AddSeparator() 
     self.Bind(wx.EVT_TOOL, self.refreshButton, qtool) 

     toolbar.Realize() 
     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(self.grid, 1, wx.EXPAND, num_of_columns) 
     self.panel.SetSizer(sizer) 

    def refreshMyData(self): 
     print '------------refreshing my data' 
     import random 
     self.myDataList = [] 
     for i in range(random.randrange(10)): 
      self.myDataList.append({'Name':str(i), 'Tag':str(i), 'ID':str(i)}) 

    def refreshButton(self, event): 
     self.refreshMyData() 
     self.refreshGrid() 

    def refreshGrid(self): 
     print '\n\n\n------------refresh grid' 
     #- Clear the grid: 
     self.grid.ClearGrid() 
     print 'Number of current rows: ' + str(self.grid.GetNumberRows()) 
     print 'Size of myDataList: ', len(self.myDataList) 
     self.grid.BeginBatch() 
     current, new, delmsg, addmsg = (len(self.myDataList), self.grid.GetNumberRows(), wxGRIDTABLE_NOTIFY_ROWS_DELETED, wxGRIDTABLE_NOTIFY_ROWS_APPENDED) 
     if new < current: 
       print 'deleting rows:', current-new 
       msg = wx.grid.GridTableMessage(
         self.grid.GetTable(), 
         delmsg, 
         new, # position 
         current-new, 
       ) 
       self.grid.ProcessTableMessage(msg) 
     elif new > current: 
       print 'adding rows: ', new-current 
       msg = wx.grid.GridTableMessage(
         self.grid.GetTable(), 
         addmsg, 
         new-current 
       ) 
       self.grid.ProcessTableMessage(msg) 

     msg = wx.grid.GridTableMessage(self.grid.GetTable(), wxGRIDTABLE_REQUEST_VIEW_GET_VALUES) 
     self.grid.ProcessTableMessage(msg) 
     self.grid.EndBatch() 

     print 'Number of current rows after data refresh and grid update: ' + str(self.grid.GetNumberRows()) 

     #- Populate the grid with new data: 
     for i in range(len(self.myDataList)): 
      self.grid.SetCellValue(i, 0, self.myDataList[i]['Name']) 
      self.grid.SetCellValue(i, 1, self.myDataList[i]['Tag']) 
      self.grid.SetCellValue(i, 2, self.myDataList[i]['ID']) 

# Run the program 
if __name__ == "__main__": 
    app = wx.PySimpleApp() 
    frame = MyForm().Show() 
    app.MainLoop() 

ответ

3

Dang. Я понял. Вот решение:

def refreshGrid(self): 
    print '\n\n\n------------refresh grid' 
    #- Clear the grid: 
    self.grid.ClearGrid() 
    print 'Number of current rows: ' + str(self.grid.GetNumberRows()) 
    print 'Size of myDataList: ', len(self.myDataList) 

    current, new = (self.grid.GetNumberRows(), len(self.myDataList)) 

    if new < current: 
     #- Delete rows: 
     self.grid.DeleteRows(0, current-new, True) 

    if new > current: 
     #- append rows: 
     self.grid.AppendRows(new-current) 


    #- Populate the grid with new data: 
    print 'Num of rows has been modified to:', self.grid.GetSize() 
    for i in range(len(self.myDataList)): 
     self.grid.SetCellValue(i, 0, self.myDataList[i]['Name']) 
     self.grid.SetCellValue(i, 1, self.myDataList[i]['Tag']) 
     self.grid.SetCellValue(i, 2, self.myDataList[i]['ID']) 
+1

Отличная работа! Я удивлен, что нет более простого способа сделать это. – User

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