From: MUTOH Masao Date: 2001-12-05T03:19:50+09:00 Subject: [ruby-list:32782] Re: [Q]Ruby/Gtk で画面を変化させる むとうです。 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