2013-01-10 2 views
0

구현하려고합니다. 그리드 응용 프로그램에서 기능을 찾으십시오. SetGridCursor(self, row, col)을 사용하여 커서를 이동할 수 있지만 그리드의 "뷰포트"를 새 커서 위치로 이동하는 방법을 알 수 없습니다. 즉, 커서가 사용자가 찾고있는 셀로 이동하면 사용자는 여전히 커서 셀을 찾을 때까지 수동으로 스크롤해야합니다.어떻게 wxPython에서 그리드의 뷰포트를 제어합니까?

그리드 커서를 뷰포트에 가운데 놓을 수 있도록 프로그래밍 방식으로 그리드를 스크롤하는 방법은 무엇입니까? 효과적으로 볼 수 있도록 특정 셀을 강제로 -

MakeCellVisible(int row, int col) :이 질문을 쓰는 동안 랜덤으로


는, 나는 그리드 위키 페이지에 가서 단어 "스크롤"검색 및 발견 격자가 셀로 지정되도록 스크롤합니다.

어느 것이 거의 내 문제를 해결합니다. 셀을 뷰포트의 중앙에 배치하고 싶습니다만이 함수는 셀이 화면 가장자리에 표시 될 때까지 스크롤됩니다. 커서 위치에도 영향을주지 않고 그리드의 스크롤 위치에만 영향을주는 함수를 찾을 수 없습니다. 생각?

답변

3

이와 같은 상황에서는 어떤 메소드가 wxWidgets (핵심 C++ 라이브러리)에 의해 노출되어 있는지 살펴보십시오. wxGrid 서브 클래스 wxScrolled. wxScrolled는 이러한 방법을 노출 :

  • Scroll

    스크롤 창을보기 시작 지정된 지점에 있도록. (현재 표시 창 영역 인 클라이언트 크기와는 대조적으로)

    GetVirtualSize

  • 는 스크롤 가능한 창 영역의 소자 단위의 크기를 가져.

난 당신이 중심이 스크롤 윈도우의 좌표를 계산하기 위해이 방법을 사용할 수 있다고 생각합니다. 자, 당신이 필요로하는 것은 중심에 놓고 싶은 셀의 좌표입니다. wxGrid이 방법을 공개한다

  • CellToRect

    복귀 논리 좌표 격자 셀의 크기 및 위치에 대응하는 직사각형

      .
    이제 C++에서는 wxGridwxScrolled으로 캐스팅하고 원하는 메서드를 호출합니다. 그러나 wxPython은 항상 wxWidgets에서 사용할 수있는 모든 메서드를 노출하지는 않으므로 언 바운드 메서드를 사용하여 약간의 창의적인 작업을해야합니다. 아래는 몇 가지 의사 코드이며, 테스트되지 않았지만이를 수행하는 방법에 대한 아이디어를 제공해야합니다.

    grid = wx.Grid() 
    
    cell_coords = grid.CellToRect(12,12) 
    
    # get the virtual size by calling it as unbound method 
    virtual_size = wx.Scrolled.GetVirtualSize(grid) 
    
    # calculate the upper-left coordinate 
    scroll_coords = (cell_coords.x - virtual_size.width/2, 
           cell_coords.y - virtual_size.height/2) 
    
    # call Scroll as unbound method 
    wx.Scrolled.Scroll(grid, scroll_coords) 
    
  • 2

    이 페이지의 중간에 그리드 커서를 유지하기 위해 수직 스크롤 나를 위해 작동합니다 : 당신은 wx.CallAfter(set_grid_cursor, grid, irow, icol)를 사용하여 방금 그리드를 업데이트 한 경우 있음을 호출해야 할 수도 있습니다

    def set_grid_cursor(grid, irow, icol): 
        # move the cursor to the cell as usual 
        grid.GoToCell(irow, icol) 
        # scroll to keep irow in the middle of the page 
        ppunit = grid.GetScrollPixelsPerUnit() 
        cell_coords = grid.CellToRect(irow, icol) 
        y = cell_coords.y/ppunit[1] # convert pixels to scroll units 
        scrollPageSize = grid.GetScrollPageSize(wx.VERTICAL) 
        scroll_coords = (0, y - scrollPageSize/2) 
        grid.Scroll(scroll_coords) 
    

    .

    +0

    이 코드와 스크롤 메커니즘을 이해하지 못했지만 작동합니다. 감사 – Himura

    관련 문제