【问题标题】:wxPython: Refresh a Frame with Updated TablewxPython:使用更新的表刷新框架
【发布时间】:2016-10-18 17:24:35
【问题描述】:

我正在使用 pyodbc 制作一个用于查看我的 SQL 数据库中的表信息的 GUI,目前我的代码会终止框架并使用更新的信息重新生成它。以下是执行搜索时的示例:

def nctDialog(self):
    global nct, frame, table
    dlg = wx.TextEntryDialog(
            self, 'Enter NCT # here:',
            'NCT Search', 'NCT #')

    if dlg.ShowModal() == wx.ID_OK:
        nct = ""
        if(str(dlg.GetValue()) != ""):
            nct =  int(dlg.GetValue())
        frame.Destroy()
        frame = TestFrame(None, sys.stdout)
        frame.Show(True)

    dlg.Destroy()

它可以工作,但看到窗口重新出现在屏幕上的新位置让我有点恼火。我真正想要实现的是在不杀死框架的情况下更新表格信息。

有没有办法在 wxPython 中更新框架中的表格而不杀死和重新制作框架?

TestFrame 主要是无趣的,它设置框架并调用 CustTableGrid(),我将在之后展示...

class TestFrame(wx.Frame):
    def __init__(self, parent, log):
    ....
        grid = CustTableGrid(p, log)
    ....

CustTableGrid() 创建一个网格并调用:

class CustTableGrid(gridlib.Grid):
    def __init__(self, parent, log):
        gridlib.Grid.__init__(self, parent, -1)
    table = CustomDataTable(log)
    ....

自定义数据表:

class CustomDataTable(gridlib.PyGridTableBase):


    def __init__(self, log):
        global nct, toDate, fromDate, isn
        gridlib.PyGridTableBase.__init__(self)
        self.log = log

        self.colLabels = [ 'Model', 'ISN', 'NCT', 'FW', 'Date', 'WWN']

        self.dataTypes = [ gridlib.GRID_VALUE_STRING,gridlib.GRID_VALUE_STRING,gridlib.GRID_VALUE_STRING,gridlib.GRID_VALUE_STRING,gridlib.GRID_VALUE_STRING,gridlib.GRID_VALUE_STRING,gridlib.GRID_VALUE_STRING,gridlib.GRID_VALUE_STRING]



        self.data = []


        cursor.execute("select ISN, WWN, Date, FW, Model, NCT, isCurrent, Date from [General Drive Info] order by [General Drive Info].Date desc")
        rows = cursor.fetchall()

        count = 0


        if(fromDate != None and toDate != None):
            ...

【问题讨论】:

  • 你能告诉我们TestFrame吗?
  • 所以 TestFrame 像其他 3 个函数一样调用,我厌倦了解释新编辑中发生了什么,如果信息还不够,请告诉我。

标签: python user-interface wxpython refresh


【解决方案1】:

代替:

frame.Destroy()
frame = TestFrame(None, sys.stdout)
frame.Show(True)

我说:

    table.data[:] = []            #clear all prior data in the table
    table.nctCall()               #puts in the new data/performs nct query
    grid.ForceRefresh()           #forces refresh of the grid with new table

nctCall() 是类对象 CustomDataTable 的定义,它将对象内的数据修改为所需的值,然后 ForceRefresh() 网格对象强制它显示更改。

【讨论】:

    【解决方案2】:

    首先,我不得不说using globals 是generally frowned upon。

    话虽如此,如果不完全重组您的程序,我将不得不对您的全局变量做出一些假设。

    而不是:

    frame.Destroy()
    frame = TestFrame(None, sys.stdout)
    frame.Show(True)
    

    假设CustTableGrid 类中的table 和TestFrame 中的grid 都是全局的(或者你将它们设为实例成员并从更高的地方获取对它们的引用),你应该能够做类似的事情:

    首先,更新CustomDataTable中的数据

    接下来,使用这些行代替 Frame 替换行:

    msg = wx.grid.GridTableMessage(table, wx.grid.GRIDTABLE_REQUEST_VIEW_GET_VALUES)
    grid.ProcessTableMessage(msg)
    

    【讨论】:

    • 当您说更新CustomDataTable中的数据时,您的意思是简单地调用'grid.Update()'吗?我已经尝试过了,它可以编译,但是当我调用搜索时,表格保持不变。
    • 此外,我尝试了 'grid.ForceRefresh()' 而不是 'Update()',结果相同。我设置 CustomDataTable 的方式,本质上需要再次调用它的类构造函数来重新定义它的对象,据我所知,这就是这些 defs 应该做的。
    • 我玩弄了其他 msg 调用,例如 'GRIDTABLE_NOTIFY_ROWS_DELETED, 5, 3' 而不是您建议的那个,并且在搜索时它实际上从表中删除了 3 行并显示更新的表。所以您的建议是正确的,我只是认为特定消息“REQUEST_VIEW_GET_VALUES”有问题,或者我们使用错误。
    • 我认为问题在于我设置代码的方式,我需要完全重新定义我的 CustomDataTable 对象并让我的网格更新更改。
    • 不必重新定义整个类对象,我需要做的只是更改其中的数据...我会尽快发布结果。
    猜你喜欢
    • 2011-10-03
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多