wxPython:在 frame1 上选择一行时,在 frame2 上选择同一行
wxPython: When selecting a row on frame1 the same row is selected on frame2
我有一个使用 API 提取一些极简数据的代码,当双击一个单元格时,它会打开一个新框架,其中包含有关该行的更详细数据。我还 select 单击单元格时的完整行。
我的问题是,当我在第二帧上 select 一行时,它也在第一帧上 selected。此外,当我尝试 select 第 10 行时,例如,在第二帧和第一帧包含较少的行时,该行不会 select 并且我收到一条错误消息,指出该行不存在。
有没有办法区分这两个帧?我尝试重命名第二帧 TestFrame1 但这并没有改变任何东西。
这是第一帧的代码,第二帧基于相同的模板,唯一的区别是 TestFrame1 而不是 TestFrame。
class SimpleGrid(gridlib.Grid):
def __init__(self, parent, log):
gridlib.Grid.__init__(self, parent, -1)
# test all the events
self.Bind(gridlib.EVT_GRID_SELECT_CELL, self.OnSelectCell)
#Select complete row
def OnSelectCell(self, evt):
self.log.write("OnSelectCell: (%d,%d) %s\n" %
(evt.GetRow(), evt.GetCol(), evt.GetPosition()))
self.SelectRow(evt.GetRow())
evt.Skip()
#open TestFrame1
def openPublishers(self, evt):
from publishers import TestFrame1
frame = TestFrame1(self, sys.stdout)
frame.Show()
class TestFrame(wx.Frame):
def __init__(self, parent, log):
wx.Frame.__init__(self, parent, 0, "Report", size=(1400,800))
self.grid = SimpleGrid(self, log)
if __name__ == '__main__':
import sys
from wx.lib.mixins.inspection import InspectableApp
app = InspectableApp(False)
frame = TestFrame(None, sys.stdout)
frame.Show(True)
#import wx.lib.inspection
#wx.lib.inspection.InspectionTool().Show()
app.MainLoop()
谢谢,
问题已解决。因此,如果有人遇到同样的问题,这就是我所做的。
第一个解决方案是删除 evt.Skip() in OnSelectCell
,因为事件传播到错误的父级 windows。这解决了 selection 行,但我仍然遇到无法 select 父框架中不存在的子框架中的任何行的问题。
为了解决这个问题,我必须在调用 Bind 时更加具体。我在第三个参数中传递了指定的源小部件。这样绑定只匹配来自该小部件的事件。换句话说:
# instead of this
self.Bind(gridlib.EVT_GRID_CELL_LEFT_DCLICK, self.OnCellLeftDClick)
# I did this
self.Bind(gridlib.EVT_GRID_CELL_LEFT_DCLICK, self.OnCellLeftDClick, self)
我有一个使用 API 提取一些极简数据的代码,当双击一个单元格时,它会打开一个新框架,其中包含有关该行的更详细数据。我还 select 单击单元格时的完整行。
我的问题是,当我在第二帧上 select 一行时,它也在第一帧上 selected。此外,当我尝试 select 第 10 行时,例如,在第二帧和第一帧包含较少的行时,该行不会 select 并且我收到一条错误消息,指出该行不存在。
有没有办法区分这两个帧?我尝试重命名第二帧 TestFrame1 但这并没有改变任何东西。
这是第一帧的代码,第二帧基于相同的模板,唯一的区别是 TestFrame1 而不是 TestFrame。
class SimpleGrid(gridlib.Grid):
def __init__(self, parent, log):
gridlib.Grid.__init__(self, parent, -1)
# test all the events
self.Bind(gridlib.EVT_GRID_SELECT_CELL, self.OnSelectCell)
#Select complete row
def OnSelectCell(self, evt):
self.log.write("OnSelectCell: (%d,%d) %s\n" %
(evt.GetRow(), evt.GetCol(), evt.GetPosition()))
self.SelectRow(evt.GetRow())
evt.Skip()
#open TestFrame1
def openPublishers(self, evt):
from publishers import TestFrame1
frame = TestFrame1(self, sys.stdout)
frame.Show()
class TestFrame(wx.Frame):
def __init__(self, parent, log):
wx.Frame.__init__(self, parent, 0, "Report", size=(1400,800))
self.grid = SimpleGrid(self, log)
if __name__ == '__main__':
import sys
from wx.lib.mixins.inspection import InspectableApp
app = InspectableApp(False)
frame = TestFrame(None, sys.stdout)
frame.Show(True)
#import wx.lib.inspection
#wx.lib.inspection.InspectionTool().Show()
app.MainLoop()
谢谢,
问题已解决。因此,如果有人遇到同样的问题,这就是我所做的。
第一个解决方案是删除 evt.Skip() in OnSelectCell
,因为事件传播到错误的父级 windows。这解决了 selection 行,但我仍然遇到无法 select 父框架中不存在的子框架中的任何行的问题。
为了解决这个问题,我必须在调用 Bind 时更加具体。我在第三个参数中传递了指定的源小部件。这样绑定只匹配来自该小部件的事件。换句话说:
# instead of this
self.Bind(gridlib.EVT_GRID_CELL_LEFT_DCLICK, self.OnCellLeftDClick)
# I did this
self.Bind(gridlib.EVT_GRID_CELL_LEFT_DCLICK, self.OnCellLeftDClick, self)