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)