SlideShare una empresa de Scribd logo
1 de 29
Descargar para leer sin conexión
RGtk2入門
―Rで作るGUIアプリ―


 大阪大学人間科学研究科
   博士後期課程
 林真広(@phosphor_m)
自己紹介

 社会学
 メディア論,インターネット研究
 主に質問紙調査(アンケート)のデータを分析していま
  す
 Osaka.Rやってます
今日の目的

 RGtk2で手軽にGUIを作る
 RのGUIをもっと充実させたい
   Rはプログラミングができない人も使っている
  • 初心者用デモ
  • 繰り返しの作業をマウスで誰でもできるように
  もっと手軽にグラフを描きたい
   • グラフィックスを対話的に調整
Rで使えるGUIツールキット

 tcltk
  組み込みパッケージ
  手軽だが低機能
 rJava
  Rからjavaを使うためのパッケージ
  javaの知識が必要
 RGtk2
  高機能
  基本的にはRの知識だけで大丈夫
GTK+とは?

 GTK+ (The GIMP Toolkit) はGIMPの実装のため
  に開発されたGUIツールキットで、Gimp Tool Kitの
  略である。オープンソースのGUIツールキットの中での
  品質の良さに注目され、GNOMEデスクトップ環境のツー
  ルキットとして採用される。(Wikipediaより)
 RGtk2はGTK+2をR上で使うためのパッケージ
RGtk2を使ったパッケージ

 RGtk2DfEdit
 pmg
 rattle
 memiscGUI(作ってます!)
RGtk2のインストール

 RGtk2パッケージをインストール
 library(RGtk2)
 「GTKがない」というエラーとともに,Gtkをインストール
  するかどうか尋ねるダイアログが出る
 「Install GTK+」を選ぶとダウンロード&インストール
  が始まる
 インストール終了後,再起動
Hello, world!

lab <- gtkLabelNew("Hello, world!")
win <- gtkWindowNew()
gtkWindowSetTitle(win, "Test")
gtkContainerAdd(win, lab)
Widgetのクラス

lab <- gtkLabelNew("Hello, world!")
win <- gtkWindowNew()
gtkWindowSetTitle(win, "Test")
gtkContainerAdd(win, lab)

 下線がクラス,斜体がメソッド
 クラスの継承あり
   GtkWindowはGtkContainerの下位クラス
GtkWindowクラスの階層

 GObject
  GInitiallyUnowned
  • GtkObject
   • GtkWidget
     • GtkContainer
       • GtkBin
         • GtkWindow

 探している機能が,上位のクラスのメソッドな場
 合がある
簡略記法

lab <- gtkLabelNew("Hello, world!")
win <- gtkWindowNew()
win$setTitle("Test")
win$add(lab)

 「object$method」という簡略記法もある
   第1引数は省略する
 キャメルケース可
プロパティへのアクセス

win <- gtkWindowNew()
win["title"] <- "Test"
# win$setTitle("Test") と同じ

 オブジェクトにはプロパティがある
 リストのようにアクセスできる
 names(object$getPropInfo()) でどんなプロパティ
  があるかわかる
 詳細はGtkのリファレンスで(RGtk2のヘルプは未完成)
Hello, World! 2
win <- gtkWindowNew()
btn <- gtkButtonNew()
win$setDefaultSize(50, 50)
btn$setLabel("OK")
win$add(btn)

gSignalConnect(btn,"clicked",
               quote(cat("Hello, world!")))

 ボタンを押すと”Hello, World!”がコンソールに表示さ
 れる
ボタンに機能を付ける

gSignalConnect(btn,"clicked",
               quote(cat("Hello, world!")))

 第1引数は機能を付けるオブジェクト
 第2引数("clicked")はオブジェクトが起こすイベント
 第3引数はイベントが起こったときに実行される関数
 (または関数呼び出し)
シグナル(signal)




   GTK+のリファレンスマニュアルより
   イベントが起こるとシグナルが発せられる
   シグナルと処理が結び付けられていた場合,処理を実行する
   コールバック関数(イベントが起きたときに実行される処理)に
    渡される引数が重要
     この場合,シグナルを発したオブジェクト(gtkButton)と任意のデータ
コールバック関数の作り方

onClicked <- function(obj, data){
  sprintf("Button[%s] is %s",
          obj$getLabel(), data)
}
gSignalConnect(btn,"clicked",
               onClicked, data="is clicked!")

 第4引数(data)は任意のデータ
 引数としてlistを渡せば,コールバック関数に好きな
 だけデータを渡せる
実例:グラフィックスパラメータを変更する
      アプリケーション
 parが覚えきれない

          ウィンドウ


   パラメータ名         値

 こんなGUIがあれば便利かも
 parBox(“パラメータ名”)で,Windowの内部に配置す
 るWidgetを返す関数を作る
Widgetの作成

parBox <- function(par){ #ここから関数定義
  label <- gtkLabelNew(par)
  entry <- gtkEntryNew()
  hbox <- gtkHBoxNew()
  hbox$packStart(label)
  hbox$packStart(entry)
# 引数parは,グラフィックスパラメータ名
# まず,必要な部品(widget)を用意する
グラフィックスパラメータの処理
val <- par()[[par]] # グラフィックスパラメータの値取得
if (is.character(val)) # 値が文字列かどうかで分岐
  val <- paste("¥"", val, "¥"" , sep="", collapse=",")
else
  val <- paste(as.character(val), sep="", collapse=",")

  entry$setText(val) # 値をgtkEntryにセット
  gSignalConnect(entry, "activate", onEntryActivated, par)
  # entry内でエンターを押したときの処理
  return(hbox)
} # 関数定義終わり
コールバック関数

onEntryActivated <- function(obj, label){
  text <- obj$getText()
  text <- iconv(text, "UTF-8",
                localeToCharset()[1])
  # widget内で文字列はUTF-8なので,
  # ロケールを取得してエンコード変換
  text <- sprintf("par(%s=c(%s))", label, text)
  print(text)
  eval(parse(text=text))
}
とりあえず実行

hbox <- parBox("mfrow")
win <- gtkWindowNew(show=FALSE)
win$add(hbox)
win$showAll()
全グラフィックスパラメータ一覧&変更
parGUI <- function(){
  par.names <- names(par())
  hboxes    <- lapply(par.names, parBox)
  vbox      <- gtkVBoxNew()
  lapply(hboxes, vbox$packStart)

    sw <- gtkScrolledWindowNew()
    sw$addWithViewport(vbox)

    win <- gtkWindowNew(show=FALSE)
    win$add(sw)
    win$showAll()
}
実行

parGUI()
レイアウト用Widgetの種類(1)

win   <- gtkWindowNew(show=FALSE)
note <- gtkNotebookNew() # タブインターフェース
paned <- gtkVPanedNew() # 二分割レイアウト
hbox <- gtkHBoxNew() # widgetを横に詰め込む
vbox <- gtkVBoxNew() # widgetを縦に詰め込む
label <- gtkLabelNew("Label")
entry <- gtkEntryNew()
entry$setText("Entry")
btn1 <- gtkButtonNewWithLabel("Button1")
btn2 <- gtkButtonNewWithLabel("Button2")
レイアウト用Widgetの種類(2)

win$add(note)
note$appendPage(paned)
paned$add1(vbox)
paned$add2(hbox)
vbox$packStart(label)
vbox$packStart(entry)
hbox$packStart(btn1)
hbox$packStart(btn2)

win$showAll()
レイアウト用Widgetの種類(3)

              gtkNotebook


  gtkVBox


  gtkHBox
              gtkVPaned
参考になるもの(1)

 RGtk2のチュートリアルはlibrary内のPDF
   ビニエットにはなっていない
 クラスのヘルプは未完成だが有用
   ?GtkButton などとすると,クラスのヘルプが見られる
  クラスのヘルプにはそのクラスのメソッド一覧,ヒエラルキー,
   簡単なexampleがなどある
  最後尾に本家GTK+のリファレンスマニュアルへのリンク
  • signalとpropertyは本家でもRGtk2でも同じなので,とても有用
参考になるもの(2)

 本家のwidget一覧
  http://library.gnome.org/devel/gtk/unstable/ch02.html

 Ruby/GTK2 チュートリアル
  http://ruby-gnome2.sourceforge.jp/ja/hiki.cgi?gtk2-tut

 Ruby,Python,PHPのGTK+のサンプル・文書は,これら
 の言語を知らなくても役に立つ
  RGtk2の資料は皆無に等しいので,他言語でのノウハウを流用
  慣れてきたら,RGtk2DfEdit(RGtk2を使ったパッケージ)の
  ソースを読むとよい
まとめ

 簡単な機能のものはすぐ作れる
 組み合わせていけば多機能に
 資料は,他言語のものならたくさんある
 ggplot2のGUIとかどうでしょう?

Más contenido relacionado

Destacado

オレオレR-GUIを作りたい
オレオレR-GUIを作りたいオレオレR-GUIを作りたい
オレオレR-GUIを作りたいMasahiro Hayashi
 
平面グラフ
平面グラフ平面グラフ
平面グラフyutaka1999
 
3次元のデータをグラフにする(Tokyo.R#17)
3次元のデータをグラフにする(Tokyo.R#17)3次元のデータをグラフにする(Tokyo.R#17)
3次元のデータをグラフにする(Tokyo.R#17)Takumi Tsutaya
 
はじめてでもわかるデータ入出力
はじめてでもわかるデータ入出力はじめてでもわかるデータ入出力
はじめてでもわかるデータ入出力Masahiro Hayashi
 
Rデータフレーム自由自在
Rデータフレーム自由自在Rデータフレーム自由自在
Rデータフレーム自由自在Takeshi Arabiki
 
Rでピボットテーブル
RでピボットテーブルRでピボットテーブル
RでピボットテーブルYohei Sato
 
Japan.R #2 Introduction to R
Japan.R #2 Introduction to RJapan.R #2 Introduction to R
Japan.R #2 Introduction to RSAKAUE, Tatsuya
 
data.tableパッケージで大規模データをサクッと処理する
data.tableパッケージで大規模データをサクッと処理するdata.tableパッケージで大規模データをサクッと処理する
data.tableパッケージで大規模データをサクッと処理するShintaro Fukushima
 
平面グラフと交通ネットワークのアルゴリズム
平面グラフと交通ネットワークのアルゴリズム平面グラフと交通ネットワークのアルゴリズム
平面グラフと交通ネットワークのアルゴリズムTakuya Akiba
 
機械学習を理解するための数学テクニック勉強会 Lagrange 未定乗数法
機械学習を理解するための数学テクニック勉強会 Lagrange 未定乗数法機械学習を理解するための数学テクニック勉強会 Lagrange 未定乗数法
機械学習を理解するための数学テクニック勉強会 Lagrange 未定乗数法OWL.learn
 
Rにおける大規模データ解析(第10回TokyoWebMining)
Rにおける大規模データ解析(第10回TokyoWebMining)Rにおける大規模データ解析(第10回TokyoWebMining)
Rにおける大規模データ解析(第10回TokyoWebMining)Shintaro Fukushima
 
初心者のためのRとRStudio入門 vol.2
初心者のためのRとRStudio入門 vol.2初心者のためのRとRStudio入門 vol.2
初心者のためのRとRStudio入門 vol.2OWL.learn
 
Feature Selection with R / in JP
Feature Selection with R / in JPFeature Selection with R / in JP
Feature Selection with R / in JPSercan Ahi
 
Rの導入とRStudio事始め(改訂版)
Rの導入とRStudio事始め(改訂版)Rの導入とRStudio事始め(改訂版)
Rの導入とRStudio事始め(改訂版)Takashi Yamane
 
ランダムフォレスト
ランダムフォレストランダムフォレスト
ランダムフォレストKinki University
 
「はじめてでもわかる RandomForest 入門-集団学習による分類・予測 -」 -第7回データマイニング+WEB勉強会@東京
「はじめてでもわかる RandomForest 入門-集団学習による分類・予測 -」 -第7回データマイニング+WEB勉強会@東京「はじめてでもわかる RandomForest 入門-集団学習による分類・予測 -」 -第7回データマイニング+WEB勉強会@東京
「はじめてでもわかる RandomForest 入門-集団学習による分類・予測 -」 -第7回データマイニング+WEB勉強会@東京Koichi Hamada
 

Destacado (19)

オレオレR-GUIを作りたい
オレオレR-GUIを作りたいオレオレR-GUIを作りたい
オレオレR-GUIを作りたい
 
はじめての「R」
はじめての「R」はじめての「R」
はじめての「R」
 
平面グラフ
平面グラフ平面グラフ
平面グラフ
 
3次元のデータをグラフにする(Tokyo.R#17)
3次元のデータをグラフにする(Tokyo.R#17)3次元のデータをグラフにする(Tokyo.R#17)
3次元のデータをグラフにする(Tokyo.R#17)
 
はじめてでもわかるデータ入出力
はじめてでもわかるデータ入出力はじめてでもわかるデータ入出力
はじめてでもわかるデータ入出力
 
Rデータフレーム自由自在
Rデータフレーム自由自在Rデータフレーム自由自在
Rデータフレーム自由自在
 
Rでピボットテーブル
RでピボットテーブルRでピボットテーブル
Rでピボットテーブル
 
Japan.R #2 Introduction to R
Japan.R #2 Introduction to RJapan.R #2 Introduction to R
Japan.R #2 Introduction to R
 
data.tableパッケージで大規模データをサクッと処理する
data.tableパッケージで大規模データをサクッと処理するdata.tableパッケージで大規模データをサクッと処理する
data.tableパッケージで大規模データをサクッと処理する
 
平面グラフと交通ネットワークのアルゴリズム
平面グラフと交通ネットワークのアルゴリズム平面グラフと交通ネットワークのアルゴリズム
平面グラフと交通ネットワークのアルゴリズム
 
機械学習を理解するための数学テクニック勉強会 Lagrange 未定乗数法
機械学習を理解するための数学テクニック勉強会 Lagrange 未定乗数法機械学習を理解するための数学テクニック勉強会 Lagrange 未定乗数法
機械学習を理解するための数学テクニック勉強会 Lagrange 未定乗数法
 
Rにおける大規模データ解析(第10回TokyoWebMining)
Rにおける大規模データ解析(第10回TokyoWebMining)Rにおける大規模データ解析(第10回TokyoWebMining)
Rにおける大規模データ解析(第10回TokyoWebMining)
 
初心者のためのRとRStudio入門 vol.2
初心者のためのRとRStudio入門 vol.2初心者のためのRとRStudio入門 vol.2
初心者のためのRとRStudio入門 vol.2
 
Feature Selection with R / in JP
Feature Selection with R / in JPFeature Selection with R / in JP
Feature Selection with R / in JP
 
Rの導入とRStudio事始め(改訂版)
Rの導入とRStudio事始め(改訂版)Rの導入とRStudio事始め(改訂版)
Rの導入とRStudio事始め(改訂版)
 
Rstudio事始め
Rstudio事始めRstudio事始め
Rstudio事始め
 
ランダムフォレスト
ランダムフォレストランダムフォレスト
ランダムフォレスト
 
Deep parking
Deep parkingDeep parking
Deep parking
 
「はじめてでもわかる RandomForest 入門-集団学習による分類・予測 -」 -第7回データマイニング+WEB勉強会@東京
「はじめてでもわかる RandomForest 入門-集団学習による分類・予測 -」 -第7回データマイニング+WEB勉強会@東京「はじめてでもわかる RandomForest 入門-集団学習による分類・予測 -」 -第7回データマイニング+WEB勉強会@東京
「はじめてでもわかる RandomForest 入門-集団学習による分類・予測 -」 -第7回データマイニング+WEB勉強会@東京
 

Similar a RGtk2入門

ジャパネットQB GPars
ジャパネットQB GParsジャパネットQB GPars
ジャパネットQB GParsTakahiro Sugiura
 
Groovy Shell Scripting 2015
Groovy Shell Scripting 2015Groovy Shell Scripting 2015
Groovy Shell Scripting 2015Uehara Junji
 
クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術Koichi Fujikawa
 
PostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join InterfacePostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join InterfaceKohei KaiGai
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法博文 斉藤
 
Gws 20130315 gradle_handson
Gws 20130315 gradle_handsonGws 20130315 gradle_handson
Gws 20130315 gradle_handsonNobuhiro Sue
 
Angular.jsについてちょっとしゃべる
Angular.jsについてちょっとしゃべるAngular.jsについてちょっとしゃべる
Angular.jsについてちょっとしゃべるMasashi Haga
 
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7Yuichi Sakuraba
 
第四回 JavaScriptから始めるプログラミング2016
第四回 JavaScriptから始めるプログラミング2016第四回 JavaScriptから始めるプログラミング2016
第四回 JavaScriptから始めるプログラミング2016kyoto university
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2DToshiyuki Ienaga
 
Easy caching and logging package using annotation in Python
Easy caching and logging package using annotation in PythonEasy caching and logging package using annotation in Python
Easy caching and logging package using annotation in PythonYasunori Horikoshi
 
Layout analyzerでのgroovyの利用について
Layout analyzerでのgroovyの利用についてLayout analyzerでのgroovyの利用について
Layout analyzerでのgroovyの利用についてkimukou_26 Kimukou
 
Swift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposiumSwift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposiumTomohiro Kumagai
 
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
PostgreSQL 10 新機能 @OSC 2017 FukuokaPostgreSQL 10 新機能 @OSC 2017 Fukuoka
PostgreSQL 10 新機能 @OSC 2017 FukuokaShigeru Hanada
 
20170127 JAWS HPC-UG#8
20170127 JAWS HPC-UG#820170127 JAWS HPC-UG#8
20170127 JAWS HPC-UG#8Kohei KaiGai
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようAkira Shimosako
 

Similar a RGtk2入門 (20)

Jetpack Workshop
Jetpack WorkshopJetpack Workshop
Jetpack Workshop
 
Ajax 応用
Ajax 応用Ajax 応用
Ajax 応用
 
ジャパネットQB GPars
ジャパネットQB GParsジャパネットQB GPars
ジャパネットQB GPars
 
Try Jetpack
Try JetpackTry Jetpack
Try Jetpack
 
Scala on Hadoop
Scala on HadoopScala on Hadoop
Scala on Hadoop
 
Groovy Shell Scripting 2015
Groovy Shell Scripting 2015Groovy Shell Scripting 2015
Groovy Shell Scripting 2015
 
クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術
 
PostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join InterfacePostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join Interface
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
 
Gws 20130315 gradle_handson
Gws 20130315 gradle_handsonGws 20130315 gradle_handson
Gws 20130315 gradle_handson
 
Angular.jsについてちょっとしゃべる
Angular.jsについてちょっとしゃべるAngular.jsについてちょっとしゃべる
Angular.jsについてちょっとしゃべる
 
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7
 
第四回 JavaScriptから始めるプログラミング2016
第四回 JavaScriptから始めるプログラミング2016第四回 JavaScriptから始めるプログラミング2016
第四回 JavaScriptから始めるプログラミング2016
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
 
Easy caching and logging package using annotation in Python
Easy caching and logging package using annotation in PythonEasy caching and logging package using annotation in Python
Easy caching and logging package using annotation in Python
 
Layout analyzerでのgroovyの利用について
Layout analyzerでのgroovyの利用についてLayout analyzerでのgroovyの利用について
Layout analyzerでのgroovyの利用について
 
Swift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposiumSwift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposium
 
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
PostgreSQL 10 新機能 @OSC 2017 FukuokaPostgreSQL 10 新機能 @OSC 2017 Fukuoka
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
 
20170127 JAWS HPC-UG#8
20170127 JAWS HPC-UG#820170127 JAWS HPC-UG#8
20170127 JAWS HPC-UG#8
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 

Más de Masahiro Hayashi

初心者講習会資料(Osaka.R#7)
初心者講習会資料(Osaka.R#7)初心者講習会資料(Osaka.R#7)
初心者講習会資料(Osaka.R#7)Masahiro Hayashi
 
Rzパッケージの紹介
Rzパッケージの紹介Rzパッケージの紹介
Rzパッケージの紹介Masahiro Hayashi
 
重回帰職人の朝は早い
重回帰職人の朝は早い重回帰職人の朝は早い
重回帰職人の朝は早いMasahiro Hayashi
 
初心者講習会資料(Osaka.r#6)
初心者講習会資料(Osaka.r#6)初心者講習会資料(Osaka.r#6)
初心者講習会資料(Osaka.r#6)Masahiro Hayashi
 
Rzパッケージ―spssのようなデータ管理インターフェイス
Rzパッケージ―spssのようなデータ管理インターフェイスRzパッケージ―spssのようなデータ管理インターフェイス
Rzパッケージ―spssのようなデータ管理インターフェイスMasahiro Hayashi
 
初心者講習会資料(Osaka.R#5)
初心者講習会資料(Osaka.R#5)初心者講習会資料(Osaka.R#5)
初心者講習会資料(Osaka.R#5)Masahiro Hayashi
 

Más de Masahiro Hayashi (6)

初心者講習会資料(Osaka.R#7)
初心者講習会資料(Osaka.R#7)初心者講習会資料(Osaka.R#7)
初心者講習会資料(Osaka.R#7)
 
Rzパッケージの紹介
Rzパッケージの紹介Rzパッケージの紹介
Rzパッケージの紹介
 
重回帰職人の朝は早い
重回帰職人の朝は早い重回帰職人の朝は早い
重回帰職人の朝は早い
 
初心者講習会資料(Osaka.r#6)
初心者講習会資料(Osaka.r#6)初心者講習会資料(Osaka.r#6)
初心者講習会資料(Osaka.r#6)
 
Rzパッケージ―spssのようなデータ管理インターフェイス
Rzパッケージ―spssのようなデータ管理インターフェイスRzパッケージ―spssのようなデータ管理インターフェイス
Rzパッケージ―spssのようなデータ管理インターフェイス
 
初心者講習会資料(Osaka.R#5)
初心者講習会資料(Osaka.R#5)初心者講習会資料(Osaka.R#5)
初心者講習会資料(Osaka.R#5)
 

RGtk2入門