2011-04-21 3 views
2

나는 빈 레이아웃이 있으며, 고정 된 크기의 GtkDrawingArea가 있습니다. 계층 구조의 현재 관련 부분은 다음과 같습니다 부모 위젯의 가운데에 고정 된 크기의 GtkDrawingArea 위젯

GtkWindow > GtkVBox > GtkHPaned > GtkViewport > GtkAlignment > GtkFixed > GtkDrawingArea 

는 현재 GtkFixed 위젯은 GtkViewport의 왼쪽 상단 모서리에 그립니다.

그러나 GtkFixed (따라서 유일한 자식 인 GtkDrawingArea)는 GtkViewport에 집중되어 있습니다 (당연히 위젯이 해당 위치에 맞지 않는 지점으로 압축 될 때 제외). 내용과 스크롤바가 나타납니다).

이 작업을 수행하는 가장 좋은 방법은 무엇입니까? (일반 GTK 질문을 나는 실제 응용 프로그램 논리를 할 pygtk를 사용하고 있지만,이 있어야한다)

여기

이 대표 코드 샘플입니다 :

import gtk 

class Controller: 

    def on_window1_destroy(self, widget, data=None): 
     gtk.main_quit() 

    def __init__(self): 
     self.builder = gtk.Builder() 
     self.builder.add_from_file("sample.glade") 
     self.window = self.builder.get_object("window1") 
     self.builder.connect_signals(self) 

    def on_drawingarea1_expose_event(self, widget, event): 
     cr = widget.window.cairo_create() 
     cr.set_source_rgb(0,0,0) 
     cr.paint() 
     return True 

if __name__ == "__main__": 
    client = Controller() 
    client.window.show() 
    gtk.main() 

그리고 같은 문제에 샘플 빈터 파일 :

<?xml version="1.0" encoding="UTF-8"?> 
<interface> 
    <requires lib="gtk+" version="2.16"/> 
    <!-- interface-naming-policy project-wide --> 
    <object class="GtkWindow" id="window1"> 
    <signal name="destroy" handler="on_window1_destroy"/> 
    <child> 
     <object class="GtkVBox" id="vbox1"> 
     <property name="visible">True</property> 
     <child> 
      <object class="GtkHPaned" id="hpaned1"> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <child> 
       <object class="GtkLabel" id="label1"> 
       <property name="visible">True</property> 
       <property name="label" translatable="yes">label</property> 
       </object> 
       <packing> 
       <property name="resize">False</property> 
       <property name="shrink">True</property> 
       </packing> 
      </child> 
      <child> 
       <object class="GtkScrolledWindow" id="scrolledwindow1"> 
       <property name="visible">True</property> 
       <property name="can_focus">True</property> 
       <property name="hscrollbar_policy">automatic</property> 
       <property name="vscrollbar_policy">automatic</property> 
       <child> 
        <object class="GtkAlignment" id="alignment1"> 
        <property name="visible">True</property> 
        <child> 
         <object class="GtkFixed" id="fixed1"> 
         <property name="width_request">300</property> 
         <property name="height_request">300</property> 
         <property name="visible">True</property> 
         <child> 
          <object class="GtkDrawingArea" id="drawingarea1"> 
          <property name="width_request">300</property> 
          <property name="height_request">300</property> 
          <property name="visible">True</property> 
          <signal name="expose_event" handler="on_drawingarea1_expose_event"/> 
          </object> 
         </child> 
         </object> 
        </child> 
        </object> 
       </child> 
       </object> 
       <packing> 
       <property name="resize">True</property> 
       <property name="shrink">True</property> 
       </packing> 
      </child> 
      </object> 
      <packing> 
      <property name="position">0</property> 
      </packing> 
     </child> 
     </object> 
    </child> 
    </object> 
</interface> 

그리고 마지막으로 ... 문제의 샘플 이미지 ... Screeshot @ imgur

답변

5

GTK 2.x에서는 GtkAlignment를 중심에 놓고 0.5 (정렬 사용 안 함)로 정렬하려는 부모로 추가합니다.

3.x에는 모든 위젯에 xalign 및 yalign 속성이 있으며 CENTER로 설정됩니다.

업데이트 : 샘플 glade 파일에서 채우기가 비활성화되어 있지 않습니다. GtkAlignment에서 속성이 이전에 호출 된 것을 조사하기에는 너무 게을 렀다. 이것은 xscale = 0.0 yscale = 0.0으로, 이는 사용 가능한 공간을 채우기 위해 자식을 확장하지 않는다는 것을 의미한다. 기본 xscale = 1.0 yscale = 1.0은 어린이가 사용 가능한 공간을 채우고 센터링이 아무 것도하지 않음을 의미합니다.

샘플 글 레이드 파일에서 스크롤 된 창과 정렬 사이에 뷰포트를 추가하려면 "부모 -> 뷰포트 추가"도해야했습니다. 이것에 대해서는 콘솔에 경고가 있어야합니다.

+0

이전에 GtkFixed의 부모로 설명한대로 GtkAlignment를 시도했지만 위젯을 중앙에 배치하지 않았습니다. – sleepynate

+0

사람들이 볼 수 있도록 glade 파일을 게시해야 할 수도 있습니다. –

+0

샘플 글 레이드 파일과 일치하는 파이썬 스크립트를 게시했습니다.이 스크립트는 중심을 검은 색으로 유지하고 싶습니다. 이상적으로 검은 색 그리기 영역은 GtkViewport 내부에 집중됩니다. – sleepynate

0

모든 SP를 사용합니다 고정 에이스를 사용할 수있는, 당신이 여기에 필요한 것은 뷰포트 또는 고정 뷰포트 중 하나에서 크기 조정 이벤트를 잡는 것입니다. 내 생각에 뷰포트가 더 잘 작동하고 고정 된 크기를 얻고 tho에 따라 자식을 이동합니다. 아이의 크기와 고정 된 크기.

뷰포트, 하위 위젯 가져 오기 또는 부모를 가져 오는 DrawingArea에서이 작업을 수행 할 수 있습니다.

+0

크기를 조정할 때의 GtkFixed는 고정 크기입니다. GtkViewport는 확장/축소 할 수있는 콘솔이며, 고정되어있는 것처럼 고정되어 있습니다. – sleepynate

관련 문제