wxPython:使用更新 Table 刷新帧
wxPython: Refresh a Frame with Updated Table
我正在使用 pyodbc 创建一个 GUI 来查看我的 SQL 数据库中的 table 信息,目前我的代码会终止框架并使用更新的信息重新生成它。下面是它在执行搜索时执行的操作的示例:
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()
它可以工作,但看到 window 重新出现在屏幕上的新位置让我有点恼火。我真正想要实现的是在不终止框架的情况下更新 table 信息。
有没有一种方法可以在不杀死和重新制作 wxPython 框架的情况下更新框架中的 table?
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):
...
首先,我不得不说using globals is generally frowned upon。
也就是说,如果不完全重新组织您的程序,我将不得不对您的全局变量做出一些假设。
而不是:
frame.Destroy()
frame = TestFrame(None, sys.stdout)
frame.Show(True)
假设 CustTableGrid
class 中的 table
和 TestFrame
中的 grid
都是全局的(或者您将它们设为实例成员并且从更高的地方获取对它们的引用),你应该能够做这样的事情:
首先更新CustomDataTable
中的数据
接下来,使用这些行代替 Frame 替换行:
msg = wx.grid.GridTableMessage(table, wx.grid.GRIDTABLE_REQUEST_VIEW_GET_VALUES)
grid.ProcessTableMessage(msg)
代替:
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() 是 class 对象 CustomDataTable 的定义,它将对象内的数据修改为所需的值,然后 ForceRefresh() 网格对象以强制它显示更改。
我正在使用 pyodbc 创建一个 GUI 来查看我的 SQL 数据库中的 table 信息,目前我的代码会终止框架并使用更新的信息重新生成它。下面是它在执行搜索时执行的操作的示例:
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()
它可以工作,但看到 window 重新出现在屏幕上的新位置让我有点恼火。我真正想要实现的是在不终止框架的情况下更新 table 信息。
有没有一种方法可以在不杀死和重新制作 wxPython 框架的情况下更新框架中的 table?
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):
...
首先,我不得不说using globals is generally frowned upon。
也就是说,如果不完全重新组织您的程序,我将不得不对您的全局变量做出一些假设。
而不是:
frame.Destroy()
frame = TestFrame(None, sys.stdout)
frame.Show(True)
假设 CustTableGrid
class 中的 table
和 TestFrame
中的 grid
都是全局的(或者您将它们设为实例成员并且从更高的地方获取对它们的引用),你应该能够做这样的事情:
首先更新CustomDataTable
接下来,使用这些行代替 Frame 替换行:
msg = wx.grid.GridTableMessage(table, wx.grid.GRIDTABLE_REQUEST_VIEW_GET_VALUES)
grid.ProcessTableMessage(msg)
代替:
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() 是 class 对象 CustomDataTable 的定义,它将对象内的数据修改为所需的值,然后 ForceRefresh() 网格对象以强制它显示更改。