2016-09-13 37 views
0

在窗口中我有一個Gtk.Frame與其中的圖像。現在我需要在點擊Gtk.Frame時顯示一條消息。這是我的代碼。按鈕事件和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代碼:

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

但是,當我點擊Gtk.Frame沒有任何反應。我也嘗試在imageframelabel中使用相同的處理程序。仍然不起作用。 我需要捕獲雙擊事件,但我知道起點是button-press-event

我在做什麼錯?

+0

你想在框架上點擊什麼? – andlabs

+0

@andlabs 它可以是任何東西,它可以是一個簡單的「打印」。這只是一個測試。 我意識到函數'on_frame_clicked'沒有被調用。 –

回答

2

有對後的按鍵事件有兩個要求上的小工具的工作:

  • 構件必須有它自己的GdkWindow
  • 構件必須在其事件有GDK_BUTTON_PRESS_MASK掩蓋

小部件通常不用於輸入沒有GdkWindow,所以這不適用於GtkFrame。

我的第一個建議是重新評估需求:用戶不希望框架對點擊作出反應。你確定你想讓你的用戶感到驚訝嗎?也許另一種設計會更好?

如果您的情況確實需要框架可點擊,您可以通過添加一個GtkEventBox作爲框架的父項來解決此問題。 GtkEventBox確實有一個GdkWindow,因此您只需使用widget.add_events()來設置事件掩碼並連接到GtkEventBox的按鈕事件而不是框架。您也可能想要使用event_box.set_visible_window()將EventBox設置爲不可見,但請閱讀有關該功能的文檔以瞭解詳細信息。