2014-04-17 40 views
1

,所以我不想在這裏粘貼任何代碼,我有幾類(如果可能的話:P)wxPython中刷新的網格,面板

問題: 我創建它創建了一個框架類,並且這個框架包含一個面板。 在另一個課程中,我存儲了所有的設置。

在面板上有幾個尺寸大小和其他屬性,它有一個網格。 此網格是從x軸上的序列1和y軸上的序列y構建​​而成的。爲了創建我的面板,我將代碼分成了幾部分(如buildLeft()buildRight()buildTopRight()等),這些部分鏈接到buildFrame()方法中的主sizer。

我的網格是在這個類的buildTopRight()部分中創建的。它通過從設置對象中檢索sequence1和sequence2的值來創建網格,並相應地創建該序列長度的網格。完成此操作後,網格將綁定到topRight部分的sizer。

我也有一個下拉列表(wx.Choice)。如果我從這個列表中選擇另一個選項,我想從我的序列1和序列2中刪除一個項目。 執行此操作的代碼已經工作,並且我的設置對象中的數據也相應地發生了變化。

但是,我無法重新加載矩陣,因爲如果我再次調用buildTopRight()方法,矩陣將被重新創建並剪裁到屏幕的頂端,同時保留舊矩陣。

請幫忙。

根據要求,這是構建我的面板的代碼:

# import modules 
import wx 
import wx.grid 
import matrixSettings as ms 

# Panel class 
class ResultatenPanel(wx.Panel): 
def __init__(self, parent, id): 
    wx.Panel.__init__(self, parent, id, style=wx.BORDER_SUNKEN) 

    # link settings object 
    self.matSet = self.GetGrandParent().ms 

    # build the main sizers 
    self.sizerMain = wx.BoxSizer(wx.HORIZONTAL) 
    self.sizerMenu = wx.BoxSizer(wx.VERTICAL) 
    self.sizerRight = wx.BoxSizer(wx.VERTICAL) 
    self.sizerTopRight = wx.BoxSizer(wx.HORIZONTAL) 
    self.sizerBotRight = wx.BoxSizer(wx.HORIZONTAL) 

    # make individual parts 
    self.buildMenu() 
    self.buildTopRight() 
    self.buildBotRight() 
    self.buildRight() 

    # build total frame 
    self.buildFrame() 

建立正確的代碼(包括頂部和底部右位):

def buildRight(self): 
    self.sizerRight.Add(self.sizerTopRight, 5) 
    self.sizerRight.Add(self.sizerBotRight, 2) 

的代碼來構建幀:

def buildFrame(self): 
    self.sizerMain.Add(self.sizerMenu, 1) 
    self.sizerMain.Add(self.sizerRight, 5, wx.EXPAND) 
    self.SetSizer(self.sizerMain) 

top top code:

def buildTopRight(self): 
    self.grid = wx.grid.Grid(self) 

    print "buildTopRight called" 
    if self.matSet.getAlgoritme() == "Needleman-Wunsch": 
     self.matSet.setSeq1("-" + self.matSet.getSeq1()) 
     self.matSet.setSeq2("-" + self.matSet.getSeq2()) 

    # set grid 
    self.grid.CreateGrid(len(self.matSet.getSeq2()), len(self.matSet.getSeq1())) 
    self.grid.SetRowLabelSize(25) 
    self.grid.DisableDragColSize() 
    self.grid.DisableDragRowSize() 

    # set the grid proportions accurately 
    for x in range(0, len(self.matSet.getSeq1())): 
     # set the grid proportions accurately 
     for y in range(0, len(self.matSet.getSeq2())): 
      self.grid.SetRowSize(y, 25) 
      self.grid.SetRowLabelValue(y, self.matSet.getSeq2()[y].upper()) 

      self.grid.SetCellValue(y, x, "0") 
      self.grid.SetReadOnly(y, x, True) 

     self.grid.SetColSize(x, 25) 
     self.grid.SetColLabelValue(x, self.matSet.getSeq1()[x].upper()) 

新增:

self.sizerTopRight.Clear()  
    self.sizerTopRight.Add(self.grid, 1) 

    self.Update() 
    self.Layout() 
+0

有沒有辦法在這裏診斷您的問題沒有看到函數體爲您構建*在非常最低的方法。 –

+0

你在self.sizerTopRight中添加什麼東西? – triggertoast

+0

對不起,我忘記了從buildTopRight方法中添加一些代碼。使用這段代碼,網格似乎工作(以某種方式)。網格已更新,但如果創建了新的更小的網格,則舊網格不會被刪除。它簡單地繪製在舊的一個上,這意味着如果您從網格中移除一個項目並使用刷新按鈕,新的(較小的)網格將放置在舊的網格之上,並排列一個「舊」行和列。我仍然試圖刪除此列。 – MrFronk

回答

1

我知道這是一個不太友善的內存解決方案。 你應該隱藏當前電網和創建一個新的:

self.sizerTopRight.Hide(self.grid) 
self.sizerTopRight.Add(self.new_grid, 1) 
self.sizerTopRight.Show(self.new_grid) 
self.Layout() 
+0

那麼如何以這種方式創建網格和new_grid?我已經有一個網格對象,並通過此代碼繼續在buildTopRight方法中重新創建一個:「self.grid = wx.grid。網格(個體經營)」 – MrFronk

+0

我已經添加了 嘗試: self.sizerTopRight.Hide(self.grid) 不同的是: 打印‘沒有電網建設尚’ 的程序和添加的。新增和.Show方法就像你建議的那樣,現在完美運行,謝謝! – MrFronk