techtalk

PHP-GTKでTwitterクライアントを作ってみる
AddThis Social Bookmark Button  Date:2008年07月09日  Category:PHP  Author:伊丹

最近はPythonのようなスクリプト言語でGTKのアプリケーションを開発することが多くなっています。その理由は、コーディングのしやすさと、コンパイルが不要といったスクリプト言語ならではの開発効率のよさにあると思います。

PHPでもPHP-GTKを利用することでGTKアプリを作成できるようになります。PHP-GTKはオブジェクト指向のインタフェースを提供しており、Linux/Windows/Mac OS Xといった環境をサポートしています。

PHP-GTKのインストール方法はこちらを参考にしてください。
http://gtk.php.net/manual/ja/tutorials.installation.php

ソースコードに付属するデモをいくつか動かしてみると、通常のアプリと違和感なく動作しています。これを見ると、もう少し実用的なアプリを試してみたくなります。そこでポーティングの素材となるようなアプリを探していると、gtktwitterというGTKで動作するTwitterクライアントが見つかりました。

gtktwitterをPHP-GTKにポーティングしてみたのが下の画面です。

PHPGtkTwitter
gtktwitterのソースはCで記述されてますが、基本的にそのままPHP-GTKに置き換えることで、ひとまずコメントが読めるところまで実装できました。

まだソースコード全部を公開できるような状態ではないので、PHP-GTKの雰囲気が分かる部分を抜粋しますと、GTKのウィジェットを使ってGUIを構築する部分はこんな感じになりました。

  1.  
  2.   /* main window */
  3.   $this->window = new GtkWindow();
  4.   $this->window->set_title('PHPGtkTwitter');
  5.   $this->window->connect_simple('destroy', array('gtk', 'main_quit'));
  6.  
  7.   /* virtical container box */
  8.   $vbox = new GtkVBox(false, 6);
  9.   $vbox->set_border_width(10);
  10.   $this->window->add($vbox);
  11.  
  12.   /* title logo */
  13.   $image = GtkImage::new_from_pixbuf(
  14.       GdkPixbuf::new_from_file(DATADIR . "/twitter.png"));
  15.   $vbox->pack_start($image, false, true, 0);
  16.  
  17.   /* status viewer on scrolled window */
  18.   $textview = new GtkTextView();
  19.   $textview->set_editable(false);
  20.   $textview->set_cursor_visible(false);
  21.   $textview->set_wrap_mode(Pango::WRAP_CHAR);
  22.   $textview->connect('motion-notify-event', array($this, 'textview_motion'));
  23.   $textview->connect('visibility-notify-event', array($this, 'textview_visibility'));
  24.   $textview->connect('event-after', array($this, 'textview_event_after'));
  25.  
  26.   $swin = new GtkScrolledwindow();
  27.   $swin->set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
  28.   $swin->add($textview);
  29.   $vbox->add($swin);
  30.  
  31.   $buffer = $textview->get_buffer();
  32.   $buffer->connect('delete-range', array($this, 'buffer_delete_range'));
  33.   $this->window->set_data('buffer', $buffer);
  34.  
  35.   ...snip...
  36.  
  37.   /* horizontal container box for buttons and entry */
  38.   $hbox = new GtkHBox(false, 6);
  39.   $vbox->pack_start($hbox, false, true, 0);
  40.   $this->window->set_data("toolbox", $hbox);
  41.  
  42.   /* update button */
  43.   $button = new GtkButton();
  44.   $button->connect('clicked', array($this, 'update_friends_statuses'));
  45.   $image = GtkImage::new_from_pixbuf(
  46.       GdkPixbuf::new_from_file(DATADIR . "/reload.png"));
  47.   $button->add($image);
  48.   $hbox->pack_start($button, false, true, 0);
  49.  
  50.   /* post button */
  51.   $button = new GtkButton();
  52.   $button->connect('clicked', array($this, 'post_status'));
  53.   $image = GtkImage::new_from_pixbuf(
  54.       GdkPixbuf::new_from_file(DATADIR . "/post.png"));
  55.   $button->add($image);
  56.   $hbox->pack_start($button, false, true, 0);
  57.  
  58.   /* text entry */
  59.   $entry = new GtkEntry();
  60.   $this->window->set_data('entry', $entry);
  61.   $entry->connect('key-press-event', array($this, 'on_entry_keyp_ress'));
  62.   $hbox->pack_start($entry, true, true, 0);
  63.  
  64.   /* request initial window size */
  65.   $this->window->set_size_request(300, 400);
  66.   $this->window->show_all();
  67.  
  68.   /* show login dialog, and update friends status */
  69.   if ($this->login_dialog()) {
  70.       $this->update_friends_statuses();
  71.       Gtk::main();
  72.   }
  73.  

PHP-GTKはAPIリファレンスが整備されており、ソースコードに付属するデモアプリを見ながらポーティングを進めていくのは、そんなに難しくなかったのですが、まだ未実装のGTK APIもあるようなので、その部分は工夫が必要です。
日本語が表示できなかったのが悔しいです。機会があればまた...。

←携帯向けサイトのアクセス制限 Topに戻る GoogleMaps にカスタムウィンドウを表示する→
カテゴリー
全て
Flash
PHP
雑記