2016-09-13 21 views
0

ウィンドウ内に画像があるGtk.Frameがあります。今、Gtk.Frameがクリックされたときにメッセージを表示する必要があります。ここに私のコードです。button-press-eventとGtk.Frame

グレイドのXML:

<?xml version="1.0" encoding="UTF-8"?> 
<!-- Generated with glade 3.18.3 --> 
<interface> 
    <requires lib="gtk+" version="3.12"/> 
    <object class="GtkWindow" id="window1"> 
    <property name="can_focus">False</property> 
    <child> 
     <object class="GtkBox" id="box1"> 
     <property name="visible">True</property> 
     <property name="can_focus">False</property> 
     <property name="orientation">vertical</property> 
     <child> 
      <object class="GtkFrame" id="frame1"> 
      <property name="can_focus">False</property> 
      <property name="tooltip_text" translatable="yes">Clique para imprimir</property> 
      <property name="halign">start</property> 
      <property name="valign">start</property> 
      <property name="label_xalign">0</property> 
      <property name="shadow_type">none</property> 
      <signal name="button-press-event" handler="onFrameClicked" swapped="no"/> 
      <child> 
       <object class="GtkAlignment" id="alignment1"> 
       <property name="visible">True</property> 
       <property name="can_focus">False</property> 
       <property name="left_padding">12</property> 
       <signal name="button-press-event" handler="onFrameClicked" swapped="no"/> 
       <child> 
        <object class="GtkImage" id="image1"> 
        <property name="visible">True</property> 
        <property name="can_focus">False</property> 
        <property name="stock">gtk-home</property> 
        <signal name="button-press-event" handler="onFrameClicked" swapped="no"/> 
        </object> 
       </child> 
       </object> 
      </child> 
      <child type="label"> 
       <object class="GtkLabel" id="label1"> 
       <property name="visible">True</property> 
       <property name="can_focus">False</property> 
       <property name="label" translatable="yes">frame1</property> 
       <signal name="button-press-event" handler="onFrameClicked" swapped="no"/> 
       </object> 
      </child> 
      </object> 
      <packing> 
      <property name="expand">False</property> 
      <property name="fill">True</property> 
      <property name="position">0</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkLabel" id="label2"> 
      <property name="visible">True</property> 
      <property name="can_focus">False</property> 
      <property name="label" translatable="yes">label</property> 
      </object> 
      <packing> 
      <property name="expand">False</property> 
      <property name="fill">True</property> 
      <property name="position">1</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkEntry" id="entry1"> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      </object> 
      <packing> 
      <property name="expand">False</property> 
      <property name="fill">True</property> 
      <property name="position">2</property> 
      </packing> 
     </child> 
     </object> 
    </child> 
    </object> 
</interface> 

Pythonコードは:Gtk.Frame何も起こらない上

import gi 
gi.require_version('Gtk', '3.0') 

from gi.repository import Gtk, Gdk 

def on_frame_clicked(widget, event): 
    print('Clicked!') 

builder = Gtk.Builder.new() 
builder.add_from_file('frame_event.glade') 
window = builder.get_object('window1') 

handlers = {'onFrameClicked': on_frame_clicked} 

builder.connect_signals(handlers) 

window.show_all() 
Gtk.main() 

しかし、私がクリックしたとき。私はまた、imageとの同じハンドラをframeに使ってみました。まだ動作しません。 ダブルクリックイベントをキャプチャする必要がありますが、開始点がbutton-press-eventであることがわかりました。

私は間違っていますか?

+0

フレームをクリックするとどうなりますか? – andlabs

+0

@andlabs それは何でもかまいません。単純な 'print'でもかまいません。それは単なるテストです。 関数 'on_frame_clicked'が呼び出されていないことに気づきました。 –

答えて

2

ウィジェット上で動作するようにボタンを押して、イベントのための2つの要件があります:

  • ウィジェットは、それが自分のGdkWindow
  • ウィジェットはその

ウィジェットを隠し、そのイベントにGDK_BUTTON_PRESS_MASKを持っている必要があります持っている必要がありますが、通常GdkWindowを持たない入力には使用されないので、GtkFrameでは動作しません。

私の最初の提案は、必要性を再評価することです:ユーザーはフレームがクリックに反応するとは予想しません。ユーザーを驚かせてもよろしいですか?多分、別のデザインがうまくいくでしょうか?

実際にフレームをクリック可能にする必要がある場合は、GtkEventBoxをフレームの親として追加することで解決できます。 GtkEventBoxにはGdkWindowがありますので、イベントマスクを設定してフレームの代わりにGtkEventBoxのbutton-press-eventに接続するには、widget.add_events()を使うだけです。おそらく、event_box.set_visible_window()でEventBoxを非表示にしたいと思うかもしれませんが、詳細については、その関数に関するドキュメントをお読みください。

関連する問題