2017-08-23 179 views
0

巨大なログからデータを抽出して、wxPythonグリッドのエントリを更新しています。私は操作が完了した後にしかウィンドウを見ることができないコードを使用して、操作を完了するために5分かかります。時刻= 0からグリッド上のデータを更新して見る方法はありますか? 私が試した:wxPythonグリッドをリアルタイムで更新する

import wx 
import wx.grid as gridlib 
class MyForm(wx.Frame): 
    def __init__(self): 
     ## 
     # constructor to create the basic frame 
     wx.Frame.__init__(self, None, wx.ID_ANY, "Tool") 

     # Add a panel so it looks the correct on all platforms 
     panel = wx.Panel(self, wx.ID_ANY) 
     self.grid = gridlib.Grid(panel) 
     rows = 4 
     column = 600000 
     self.grid.CreateGrid(column, rows) 
     self.count = 0 
     # change a couple column labels 
     self.grid.SetColLabelValue(0, "Timestamp") 
     self.grid.SetColLabelValue(1, "CMD") 
     self.grid.SetColLabelValue(2, "Address") 
     self.grid.SetColLabelValue(3, "Data") 

     # Few More operations to calculate CMD,Timestamp field 


     for i in range(10**5): 
      self.count += 1 
      self.grid.SetCellValue(self.count,1,'CMD4') 
      self.grid.SetCellValue(self.count,0,str(self.count)) 
      self.grid.SetCellValue(self.count, 2, "Extracted Address") 
      self.grid.SetCellValue(self.count, 3, "Extracted Data") 
     # change the row labels 

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

if __name__ == "__main__": 
    app = wx.App() 
    frame = MyForm() 
    frame.Show() 
    app.MainLoop() 

答えて

0

を使用wx.Yield()ハンドコントロールに戻ってメインループに。
ここでは、divmodを使用して1000回ごとの繰り返しを取得し、wx.Yieldを呼び出します。
また、MoveCursorDownBlockを使用して更新グリッドを視覚的に追跡することもできます。
プログラムの実行が遅くなるため、これを削除または修正することをお勧めします。

import wx 
import wx.grid as gridlib 
class MyForm(wx.Frame): 
    def __init__(self): 
     ## 
     # constructor to create the basic frame 
     wx.Frame.__init__(self, None, wx.ID_ANY, "Tool") 

     # Add a panel so it looks the correct on all platforms 
     panel = wx.Panel(self, wx.ID_ANY) 
     self.grid = gridlib.Grid(panel) 
     rows = 4 
     column = 100001 
     self.grid.CreateGrid(column, rows) 
     self.count = 0 
     # change a couple column labels 
     self.grid.SetColLabelValue(0, "Timestamp") 
     self.grid.SetColLabelValue(1, "CMD") 
     self.grid.SetColLabelValue(2, "Address") 
     self.grid.SetColLabelValue(3, "Data") 

     # Few More operations to calculate CMD,Timestamp field 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(self.grid, 1, wx.EXPAND, 5) 
     panel.SetSizer(sizer) 
     self.Show() 
     for i in range(10**5): 
      self.count += 1 
      self.grid.SetCellValue(self.count,1,'CMD4') 
      self.grid.SetCellValue(self.count,0,str(self.count)) 
      self.grid.SetCellValue(self.count, 2, "Extracted Address") 
      self.grid.SetCellValue(self.count, 3, "Extracted Data") 
      quo,rem = divmod(self.count,1000) 
      if rem == 0: 
       self.grid.MoveCursorDownBlock(expandSelection=False) 
       wx.Yield() 

if __name__ == "__main__": 
    app = wx.App() 
    frame = MyForm() 
    app.MainLoop() 
+0

私はうまく動作しないようです。私の操作が完了するまで、それは空白のフレームのみを表示します(あなたのコード更新で見ることができます)。それ以降はグリッドを表示します。 – NGB

+0

修正コードが動作しない、または自分で実行したときに私が提供したコードが機能しないと言っていますか? –

+0

修正したコード自体は、自分のシステム上で期待通りに機能しません。 – NGB

関連する問題