【问题标题】:Update wxPython grid in real time实时更新 wxPython 网格
【发布时间】:2017-08-23 09:22:43
【问题描述】:

我正在从一个巨大的日志中提取数据,然后更新 wxPython 网格中的条目。使用我的代码,只有在操作完成后才能看到窗口,完成操作需要 5 分钟。有没有办法从 time = 0 本身更新和查看网格上的数据。 我试过了:

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

【问题讨论】:

    标签: python python-2.7 user-interface wxpython


    【解决方案1】:

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

    【讨论】:

    • 它似乎对我不起作用。在我的操作完成之前,它只显示空白框(可以通过您的代码更新看到)。只有在那之后它才会显示网格。
    • 您是说修改后的代码不起作用,或者我提供的代码在单独运行时不起作用?
    • 您修改的代码本身在我的系统上无法正常工作。
    • 可以具体说明发生了什么。这在 Linux wxpython '3.0.2.0 gtk2 (classic)' 上运行愉快 尝试注释掉 self.grid.MoveCursorDownBlock
    • wx.Yield() 自 4.0.0 版后已弃用:保留此功能仅是为了向后兼容。请在任何新代码中使用 wx.AppConsole.Yield 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    相关资源
    最近更新 更多