2013-04-08 2 views
3

하나의 사용자 정의 wx.frame이 만들어져 두 개의 격자 컨트롤이있는 분할 윈도우가 포함됩니다. 각 그리드의 데이터를 비교하는 데 사용됩니다. 이 시점에서 두 개의 그리드 스크롤바는 동기화 스크롤을 지원해야합니다.wx에서 두 격자의 스크롤 막대를 동기화하는 방법

질문 :

  1. 방법이 두 그리드의 스크롤 이벤트를 얻으려면? 프레임에서 wx.EVT_SCROLL 이벤트를 보관하려고했지만 실패했습니다. 또한 사용자 정의 그리드 컨트롤에서 스크롤 이벤트를 바인드하려고 시도했지만 실패했습니다.
  2. 두 격자의 스크롤 막대를 동기화하는 방법은 무엇입니까? grid 클라이언트 창을 스크롤하기 위해 gridInstance.Scroll (row, col)을 사용하는 상대 question의 대답. 그러나 스크롤바를 동기화하는 방법은 포함되어 있지 않습니다.

의견을 보내 주셔서 감사합니다.

사용자 정의 프레임

def __init__(self, parent): 
     wx.Frame.__init__(self, parent, -1, title='', size=(640,480)) 
     main_panel = wx.Panel(self, -1) 
     self.TBFLAGS = (wx.TB_HORIZONTAL| wx.NO_BORDER| wx.TB_FLAT) 
     self.controller = None 
     self.isSyncScroll = True 

     #hsizer = wx.BoxSizer(wx.VERTICAL) 
     gsizer = wx.FlexGridSizer(rows = 1, 
                cols = 1, 
                vgap = 2, 
                hgap = 2) 
     gsizer.AddGrowableRow(0) 
     gsizer.AddGrowableCol(0) 
     self.tb = self.init_toolbar() 
     (sub_panel0, sub_panel1) = self.init_splitter(main_panel) 
     self.grid0 = self.init_grid(sub_panel0) 
     self.grid1 = self.init_grid(sub_panel1) 
     self.init_status_bar() 

     gsizer.Add(main_panel, 1, wx.EXPAND) 
     self.SetSizer(gsizer) 

     ico = wx.Icon(u'Compare.ico', wx.BITMAP_TYPE_ICO) 
     self.SetIcon(ico) 
     self.Maximize() 

     #can't catch the scroll event at the frame 
     self.Bind(wx.EVT_SCROLL, self.OnScroll, self.grid0) 
     #self.Bind(wx.EVT_SCROLL, self.OnScroll) 
     #self.Bind(wx.EVT_SCROLL, self.OnScroll, id=self.grid0.GetId()) 
+0

왜 모든 데이터를 동일한 그리드에 나란히 놓지 않습니까? – Arthur

+0

고객이 무엇을 ... 이렇게해야합니다. 데이터 열은 winmerge와 add dummy 열을 비교하여 동일한 열을 정렬합니다. – Erxin

+0

다른 모든 기능은 두 격자의 스크롤 막대를 동기화 스크롤하는 것 외에는 구현됩니다. 그것은 일반적인 문제가 보인다, 이미 [누군가가] (http://stackoverflow.com/questions/11269558/wxgrid-detecting-scroll-event) 어떻게 스크롤 이벤트를 감지했다. 그리드 창에서 마우스 휠 이벤트를 바인딩하는 방법 만 알 수있었습니다. – Erxin

답변

4

다음 코드의 초기화 방법은 하나 또는 다른 잡아 때 함께 이동이 스크롤바를 가져옵니다.

파이썬 버전 2.7.3 & wxpython 2.9.4.0 & 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() 

는 스크롤 변화의 모든 유형을 덮도록 설정할 스크롤 위치를 확인하기 위해, 타이머를 사용하여 다른 버전이다.

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() 
+0

고맙습니다.하지만 마우스 휠, 페이지 위/아래 및 줄 위/아래 이벤트는 여전히 별도로 처리해야합니다. – Erxin

+0

답변 해 주셔서 감사합니다. – alwbtc

관련 문제