The following code gets 2 scroll bars moving together when you grab one or the other.
Python version 2.7.3 and wxpython 2.9.4.0 and windows Xp.
import wx
import wx.grid as grid
class Frame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, "Grid", size=(350, 250))
self.grid = grid.Grid(self)
self.grid.CreateGrid(20, 20)
class ScrollSync(object):
def __init__(self, frame1, frame2):
self.frame1 = frame1
self.frame2 = frame2
self.frame1.grid.Bind(wx.EVT_SCROLLWIN, self.onScrollWin1)
self.frame2.grid.Bind(wx.EVT_SCROLLWIN, self.onScrollWin2)
def onScrollWin1(self, event):
if event.Orientation == wx.SB_HORIZONTAL:
self.frame2.grid.Scroll(event.Position, -1)
else:
self.frame2.grid.Scroll(-1, event.Position)
event.Skip()
def onScrollWin2(self, event):
if event.Orientation == wx.SB_HORIZONTAL:
self.frame1.grid.Scroll(event.Position, -1)
else:
self.frame1.grid.Scroll(-1, event.Position)
event.Skip()
if __name__ == '__main__':
app = wx.App()
frame1 = Frame(None)
frame1.Show()
frame2 = Frame(None)
frame2.Show()
ScrollSync(frame1, frame2)
app.MainLoop()
Here is another version that uses a timer to check and set scroll positions, so it covers any scroll changes.
import wx
import wx.grid as grid
class Frame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, "Grid", size=(350, 250))
self.grid = grid.Grid(self)
self.grid.CreateGrid(20, 20)
class ScrollSync(wx.EvtHandler):
def __init__(self, frame1, frame2):
super(ScrollSync, self).__init__()
self.frame1 = frame1
self.frame2 = frame2
self.frame1ScrollPos = self.getFrame1Pos()
self.frame2ScrollPos = self.getFrame2Pos()
self.Bind(wx.EVT_TIMER, self.onTimer)
self.timer = wx.Timer(self)
self.timer.Start(20)
def onTimer(self, event):
if not self.frame1 or not self.frame2:
self.timer.Stop()
return
if self.frame1ScrollPos != self.getFrame1Pos():
self.frame1ScrollPos = self.getFrame1Pos()
self.frame2.grid.Scroll(self.frame1ScrollPos)
elif self.frame2ScrollPos != self.getFrame2Pos():
self.frame2ScrollPos = self.getFrame2Pos()
self.frame1.grid.Scroll(self.frame2ScrollPos)
def getFrame1Pos(self):
horizontal = self.frame1.grid.GetScrollPos(wx.SB_HORIZONTAL)
vertical = self.frame1.grid.GetScrollPos(wx.SB_VERTICAL)
return horizontal, vertical
def getFrame2Pos(self):
horizontal = self.frame2.grid.GetScrollPos(wx.SB_HORIZONTAL)
vertical = self.frame2.grid.GetScrollPos(wx.SB_VERTICAL)
return horizontal, vertical
if __name__ == '__main__':
app = wx.App()
frame1 = Frame(None)
frame1.Show()
frame2 = Frame(None)
frame2.Show()
ScrollSync(frame1, frame2)
app.MainLoop()