Pygtk-signal-handling

提供:Dev Guides
移動先:案内検索

PyGTK-信号処理

順次実行されるコンソールモードアプリケーションとは異なり、GUIベースのアプリケーションはイベント駆動型です。 * gtk.main()*関数は無限ループを開始します。 GUIで発生するイベントは、適切なコールバック関数に転送されます。

GObjectクラスから派生した各PyGTKウィジェットは、1つ以上のイベントに応じて*「シグナル」*を送信するように設計されています。 シグナル自体はアクションを実行しません。 代わりに、コールバック関数に「接続」されます。

一部の信号はウィジェットに継承されますが、一部の信号はウィジェット固有です。 たとえば、「toggled」信号は、toggleButtonウィジェットによって発行されます。

シグナルハンドラーは、gtk.widgetクラスの* connect()*メソッドを呼び出すことでセットアップされます。

handler_id = object.connect(name, func, func_data)
  • 最初の引数 name は、キャッチする信号の名前を含む文字列です。
  • 2番目の引数 func は、キャッチされたときに呼び出されるコールバック関数です。
  • 3番目の引数 func_data は、この関数に渡すデータです。
  • コールバックメソッドを一意に識別するために使用されるハンドラーID。

たとえば、ボタンがクリックされたときにonClicked()関数を呼び出すには、次の構文を使用します-

btn.connect("clicked",onClicked,None)

onClicked()関数は次のように定義されています-

def onClicked(widget, data=None):

コールバックメソッドがオブジェクトメソッドである場合、追加の引数として自己を受け取ります-

def onClicked(self, widget, data=None):

次の例では、ボタンがgtk.Windowに追加されます。 ボタンをクリックすると、「Hello World」メッセージが出力されます。

import gtk
class PyApp(gtk.Window):
   def __init__(self):
      super(PyApp, self).__init__()
      self.set_title("Hello World in PyGTK")
      self.set_default_size(400,300)
      self.set_position(gtk.WIN_POS_CENTER)

      self.label = gtk.Label("Enter name")
      self.entry = gtk.Entry()

      self.btn = gtk.Button("Say Hello")
      self.btn.connect("clicked",self.hello)

      fixed = gtk.Fixed()
      fixed.put(self.label, 100,100)
      fixed.put(self.entry, 100,125)
      fixed.put(self.btn,100,150)

      self.add(fixed)
      self.show_all()

   def hello(self,widget):
      print "hello",self.entry.get_text()
PyApp()
gtk.main()

Pythonプロンプトから上記のコードを実行します。 次の出力が表示されます-

信号処理

ボタンが押されると、次の出力がコンソールに表示されます-

Hello finddevguides