新井です。

>>> From: Koji Arai <JCA02266 / nifty.ne.jp>
>>> Date: 23 Apr 1999 02:09:59 +0900
>>> Subject: [ruby-ext:00170] Re: [Ruby/Tk] callback_break

>   def callback_break
>     fail TkCallbackBreak, "Tk callback returns 'break' status"
>   end
> 
> にしたらうまく行きました。が、これって私が、
> callback_break の使い方を間違ってるんでしょうか?

使い方を間違っていたようです。

callback_break は、Tk.callback_break として使うの
が正解のようですね[ruby-dev:3225]。

ところで、私のこの質問ってこのMLにそぐわないですね。
よく考えたら、拡張ライブラリの(実装者向けの?)MLな
んですよね。

最初はわかってたつもりだったんですがいつのまにか
ライブラリ一般のMLと思い込むようになってました。

tkutil.so や tcltk.so があるからっていう言い訳は
ダメですかね。

# [ruby-list:13916]を読んで気が付きました。
# 最近こういう早とちりが多すぎです>自分

私が作りたかったEntry Widgetができたので一応
添付します。

#!/usr/local/bin/ruby require "tk" class TkWindow def focus_next(force=false) to = tk_call('tk_focusNext', path) if force tk_call 'focus', '-force', to else tk_call 'focus', to end end def focus_prev(force=false) to = tk_call('tk_focusPrev', path) if force tk_call 'focus', '-force', to else tk_call 'focus', to end end end class TkLimitedEntry < TkEntry def initialize(parent=nil, keys=nil, permit=nil) super parent, keys bind 'KeyPress', proc {|e| c = e.char c = c.to_s if Fixnum === c case e.keysym when 'Delete', 'BackSpace', 'Tab' Tk.callback_continue end if String === c if value.size >= width or permit && /[#{permit}]/ !~ c bell Tk.callback_break end end } fnext = proc {focus_next; Tk.callback_break} fprev = proc {focus_prev; Tk.callback_break} bind 'Return', fnext bind 'Shift-Return', fprev bind 'Down', fnext bind 'Up', fprev end end # TEST if $0 == __FILE__ TkLabel.new {text '10進数'; pack} TkLimitedEntry.new(nil,nil,'0-9') { width 5; pack; focus } TkLabel.new {text '16進数'; pack} TkLimitedEntry.new(nil,nil,'0-9a-fA-F') { width 6; pack } TkLabel.new {text '英数字'; pack} TkLimitedEntry.new(nil,nil,'0-9a-zA-Z') { width 7; pack } Tk.mainloop end