2014-05-22 4 views
0

내 Gtk.DrawingArea 개체 내부에 그릴 싶습니다. 내가 그리기 기능을 "그리기"이벤트가 아니라 "노출 이벤트"에 연결할 필요가 있기 때문에 gtk3와 함께 일하고 있어요.Gtk.DrawingArea에서 그리기

그러나 이것은 작동하지 않습니다.. hexpand 및 vexpand이 설정되지 않은 경우 그리드에 DrawingAreas 추가

def draw(widget, context, args=()): 

    context.set_source_rgb(0.9, 0, 0.1) #rosso 
    context.rectangle(0, 0, widget.get_allocated_width(), widget.get_allocated_height()) 
    context.fill() 


builder = Gtk.Builder() 
builder.add_from_file('menuitem.glade') 

builder.get_object('drawingarea1').connect("draw", draw) 
builder.get_object('drawingarea1').show() 

builder.get_object('window1').show() #there are many drawing areas inside a window (they are inside a grid) 

Gtk.main() 

답변

0

조금 문제가있다 :

여기 내 코드입니다. 또한 width_request 및 height_request를 추가해야합니다 (또는 DrawingArea가 크기를 갖도록하는 다른 레이아웃 구성). 그렇지 않으면 초기 창 크기가 작거나 보이지 않습니다. 다음은 그리드와 두 개의 DrawingAreas를 사용하는 코드를 보여줍니다.

from gi.repository import Gtk 

ui = """ 
<?xml version="1.0" encoding="UTF-8"?> 
<!-- Generated with glade 3.16.1 --> 
<interface> 
    <requires lib="gtk+" version="3.10"/> 
    <object class="GtkWindow" id="window1"> 
    <property name="can_focus">False</property> 
    <child> 
     <object class="GtkGrid" id="grid1"> 
     <property name="visible">True</property> 
     <property name="can_focus">False</property> 
     <property name="column_spacing">4</property> 
     <child> 
      <object class="GtkDrawingArea" id="drawingarea1"> 
      <property name="width_request">100</property> 
      <property name="height_request">100</property> 
      <property name="visible">True</property> 
      <property name="can_focus">False</property> 
      <property name="hexpand">True</property> 
      <property name="vexpand">True</property> 
      </object> 
      <packing> 
      <property name="left_attach">0</property> 
      <property name="top_attach">0</property> 
      <property name="width">1</property> 
      <property name="height">1</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkDrawingArea" id="drawingarea2"> 
      <property name="width_request">100</property> 
      <property name="height_request">100</property> 
      <property name="visible">True</property> 
      <property name="can_focus">False</property> 
      <property name="hexpand">True</property> 
      <property name="vexpand">True</property> 
      </object> 
      <packing> 
      <property name="left_attach">1</property> 
      <property name="top_attach">0</property> 
      <property name="width">1</property> 
      <property name="height">1</property> 
      </packing> 
     </child> 
     </object> 
    </child> 
    </object> 
</interface> 
""" 

def draw(widget, context, color=(0, 0, 0)): 
    context.set_source_rgb(*color) 
    context.rectangle(0, 0, widget.get_allocated_width(), widget.get_allocated_height()) 
    context.fill() 

builder = Gtk.Builder.new_from_string(ui, -1) 
builder.get_object('drawingarea1').connect("draw", draw, (0.9, 0, 0.1)) 
builder.get_object('drawingarea2').connect("draw", draw, (0.1, 0, 0.9)) 

window = builder.get_object('window1') 
window.connect('destroy', Gtk.main_quit) 
window.show_all() 

Gtk.main() 
+0

감사합니다! 좋은 소식은 그것이 작동한다는 것이고, 나쁜 소식은 그리기 영역이 설정되지 않은 잘못된 glade 파일 (속성 및 너비 확장)에 연결했다는 것입니다. – FrancescoN