むとうです。
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>