むとうです。

In message "[ruby-list:32758] [Q]Ruby/Gtk で画面を変化させる"
        on Tue, 4 Dec 2001 15:30:02 +0900, yamato / jade.dti.ne.jp wrote:

> 茨城県の大和と申します。
> 
> Ruby/Gtk の勉強のために囲碁の鑑賞ソフトを書こうとしております。

がんばってください。

> 碁盤や碁石の xpm ファイルを用意して、以下のようにして碁盤の表示は
> できるようになりましたが、黒石や白石を置いたときの画面の変化のさせ方が
> 分かりません。
(略)
> signal を送って、goban.attach black_stone_pixmap, 10,11,10,11; goban.show
> などとしても、画面は変化しません。
>
> draw_pixmap を使って、
> 
> window.signal_connect('key_release_event'){ drawable.draw_pixmap ... }
> 
> などとしても画面が変化しません。
> 
> どうすれば良いのでしょうか、ご教示いただければ幸いです。

参考になるかわかりませんが、以下にサンプルを作ってみました。
r.xpm, r2.xpmはそれぞれ適当なPixmap(同じ大きさしか確認してません)
を使ってください。もしかしたらもっと良いアイデアがあるかもしれませんが、
一案ということで。

ちなみにサンプルはウインドウにフォーカスがある状態で何かキー
を押す(そして話す瞬間= key_release_event)たびに色が変わります。

---
仕組みとしてはWidget#set_eventsでイベントマスクを追加して、
signal_connectでイベントを受けます。

それから、Gtk::EventBoxというのを使っているのですが、
これは違うコンテナウィジェットでも大丈夫かもしれません(試していませんが)。
なぜ、これを使ったかというと、基本的なイベントはEventBoxであれば特に設定せずに
拾うことができるから、Widget#set_eventsがいらないかなぁと思ったからです。
でも、key_release_eventだと、EventBoxでも(少なくともデフォルトでは)受け取れない
みたいで、結局、Widget#set_eventsをしてしまったので、EventBoxをあえて
使う意味はなくなっちゃったかもな〜という感じです(未確認)。

----
require 'gtk'

def create_xpm(window, file)
  Gtk::Pixmap.new(*Gdk::Pixmap.create_from_xpm(window.window, nil, file))
end

window = Gtk::Window.new
window.set_events(Gdk::KEY_RELEASE_MASK)
window.realize

pixmap1 = create_xpm(window, "r.xpm")
pixmap2 = create_xpm(window, "r2.xpm")

eventbox = Gtk::EventBox.new
eventbox.add(pixmap1)

goban = Gtk::Table.new(1, 1, true)
goban.attach(eventbox, 0, 1, 0, 1)

window.signal_connect(Gtk::Widget::SIGNAL_KEY_RELEASE_EVENT) do |v| 
  if eventbox.children[0] == pixmap1
    eventbox.remove(pixmap1)
    eventbox.add(pixmap2)
    eventbox.show_all
    pixmap1 = create_xpm(window, "r.xpm")
  else
    eventbox.remove(pixmap2)
    eventbox.add(pixmap1)
    eventbox.show_all
    pixmap2 = create_xpm(window, "r2.xpm")
  end
end

window.add(goban)
window.show_all
Gtk.main


-- 
.:% MUTOH Masao <mutoh / highway.ne.jp>