From: aito@...5sun.yz.yamagata-u.ac.jp Date: 1997-09-05T08:51:56+09:00 Subject: [ruby-list:4129] Re: How to get value (ruby/tk) あ伊藤です. In article <19970904212328X.nnakamur@mxq.meshnet.or.jp>, Noritsugu Nakamura writes: > 質問です。ruby/Tk で Tk からの値をもらうには > どうしたら良いのでしょうか? > > 例えば、以下のようなプログラムです。 > > #!/usr/local/bin/wish4.2 > > button .quit -text "Quit" -command { > set value [tk_messageBox -type yesno -default no \ > -icon question -message "Really Quit?"] > if {$value == "yes"} {exit} > } > pack .quit tcl/tk の変数は TkVariable で確保することができるのですが, tcl/tk の手続きが返す値をその変数に代入するのが難しいのです. tk_call を使うと,[ ] がクオートされてしまうので. 私は,次のような手を使っています.まず tcl の特殊記号を そのまま送出する関数 tk_call_without_quote を定義して, その上で set value [tk_messageBox -type yesno -default no \ -icon question -message "Really Quit?"] に相当するコマンドを直接送出します.変数を TkVariable で 確保すれば,あとは ruby の中から自由に変数を参照できます. (以下のソースは,contrib の下にある emie の一部です. 適当にお使いください.) #!/bin/sh # This is a shell archive (produced by shar 3.49) # To extract the files from this archive, save it to a file, remove # everything above the "!/bin/sh" line above, and type "sh file_name". # # made 09/04/1997 23:55 UTC by aito@ei5nazha # Source directory /home/disk/usrs/aito/amuse/emie # # existing files will NOT be overwritten unless -c is specified # # This shar contains: # length mode name # ------ ---------- ------------------------------------------ # 1432 -rw-r--r-- dialog.rb # 1257 -rw-r--r-- lowlevel.rb # # ============= dialog.rb ============== if test -f 'dialog.rb' -a X"$1" != X"-c"; then echo 'x - skipping dialog.rb (File already exists)' else echo 'x - extracting dialog.rb (Text)' sed 's/^X//' << 'SHAR_EOF' > 'dialog.rb' && require "tk" require "lowlevel" X class TkDialog < TkWindow X include TkLowlevel X # initialize tk_dialog X def initialize X super X @var = TkVariable.new X tk_call_without_quote('global',@var,';', X 'set',@var,'[','tk_dialog', X @path, title, "\"#{message}\"", bitmap, X default_button, buttons, ']') X end X def value X return @var.value.to_i X end X ###################################################### X # # X # these methods must be overridden for each dialog # X # # X ###################################################### X def title X return "DIALOG" X end X def message X return "MESSAGE" X end X def bitmap X return "info" X end X def default_button X return 0 X end X def buttons X return "BUTTON1 BUTTON2" X end end X # # dialog for warning # class Warning < TkDialog X def initialize(mes) X @mes = mes X super() X end X def message X return @mes X end X def title X return "WARNING"; X end X def bitmap X return "warning"; X end X def default_button X return 0; X end X def buttons X return "OK"; X end end X class CantOpen < Warning X def initialize(mes,parent=nil,keys=nil) X super(mes+"が開けないの") X end end X class Decision < Warning X def bitmap X return "question" X end X def default_button X return 1 X end X def buttons X return "はい いいえ" X end end SHAR_EOF chmod 0644 dialog.rb || echo 'restore of dialog.rb failed' Wc_c="`wc -c < 'dialog.rb'`" test 1432 -eq "$Wc_c" || echo 'dialog.rb: original size 1432, current size' "$Wc_c" fi # ============= lowlevel.rb ============== if test -f 'lowlevel.rb' -a X"$1" != X"-c"; then echo 'x - skipping lowlevel.rb (File already exists)' else echo 'x - extracting lowlevel.rb (Text)' sed 's/^X//' << 'SHAR_EOF' > 'lowlevel.rb' && require "tk" X module TkLowlevel X include Tk X # X # tk_call_without_quote : stolen from module Tk X # remove quote from strings sent to wish X # X def tk_call_without_quote(str, *args) X args = args.collect{|s| X next if s == None X if s.kind_of?(Hash) X s = hash_kv(s).join(" ") X else X if not s X s = "0" X elsif s == TRUE X s = "1" X elsif s.kind_of?(TkObject) X s = s.path X elsif s.kind_of?(TkVariable) X s = s.id X else X s = s.to_s X end X s X end X } X str += " " X str += args.join(" ") X print str, "\n" if $DEBUG X tk_write 'rb_ans {%s}', str X while PORT.gets X print $_ if $DEBUG X $_.chop! X if /^=(.*)@@$/ X val = $1 X break X elsif /^=/ X val = $' + "\n" X while TRUE X PORT.readline X if ~/@@$/ X val += $' X return val X else X val += $_ X end X end X elsif /^!/ X $@ = error_at X msg = $' X if msg =~ /unknown option "-(.*)"/ X $! = NameError.new(format("undefined method `%s' for %s(%s)", X $1, self, self.type)) #`' X else X $! = RuntimeError.new(format("%s - %s", self.type, msg)) X end X fail X end X $tk_event_queue.push $_ X end X X while ev = $tk_event_queue.shift X Tk.dispatch ev X end X fail 'wish closed' if PORT.closed? X val X end end SHAR_EOF chmod 0644 lowlevel.rb || echo 'restore of lowlevel.rb failed' Wc_c="`wc -c < 'lowlevel.rb'`" test 1257 -eq "$Wc_c" || echo 'lowlevel.rb: original size 1257, current size' "$Wc_c" fi exit 0 --_ ITO Akinori at YAMAGATA UNIVERSITY 伊藤 彰則 山形 大学