新井です。

こちら(ruby-ext)は初めてです。よろしくお願いします。

ついに、Ruby/Tk に手を出してしまったんですが、ちょっ
と困ってます。

16進の入力だけを許す Entry Widget を作ろうと思い
以下のようなスクリプトを書きました。

#!/usr/local/bin/ruby

require "tk"

class TkEntryHex < TkEntry
    def initialize(parent=nil, keys=nil)
	super
	
	self.bind 'KeyPress', proc {|c|
	    c = sprintf("%d", c) if Fixnum === c

	    if String === c and /[0-9a-fA-F]/ !~ c
		callback_break
	    end
	}, '%A'
    end
end

TkEntryHex.new.pack
Tk.mainloop
__END__

上記スクリプトのように、Widgetのあるイベント*だけ*を
殺すために、bind と callback_break を使ってイベント
を奪おうとしてるのですがうまくいきません。

上記を実行して0-9a-f以外のキーを押すと callback_break で、

Error: /usr/local/lib/ruby/1.3/tk.rb:413:in `raise': wrong # of arguments(2 for 1)

とエラーになります。
エラーの該当行は以下なのですが

412   def callback_break
413     raise TkCallbackBreak, "Tk callback returns 'break' status"
414   end

raiseの引数が間違ってるわけではないようです。以下
ではちゃんと例外が発生します。

$ ruby -rtk -e 'raise TkCallbackBreak, "hoge"'
/tmp/rba03586:1: hoge (TkCallbackBreak)

何か根本的な勘違いをしているかもしれませんが、どなたか
うまくいく例を教えてください。

# 入力文字数の制限などまだまだ課題は残ってる…

Ruby/Tk を使うにあたって以下は大変参考になりました。
 http://www.cdrom.co.jp/~hiramatu/#RubyTK
 http://www2s.biglobe.ne.jp/~Nori/ruby/tk-faq/
この場を借りて感謝!