tk 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.gitignore +2 -0
- data/MANUAL_tcltklib.eng +0 -2
- data/MANUAL_tcltklib.ja +0 -2
- data/README.ActiveTcl +1 -1
- data/README.md +43 -0
- data/ext/tk/extconf.rb +4 -2
- data/ext/tk/old-extconf.rb +0 -1
- data/ext/tk/tcltklib.c +46 -148
- data/ext/tk/tkutil/extconf.rb +0 -2
- data/ext/tk/tkutil/tkutil.c +6 -9
- data/lib/multi-tk.rb +95 -315
- data/lib/remote-tk.rb +6 -23
- data/lib/tk.rb +41 -122
- data/lib/tk/bgerror.rb +2 -2
- data/lib/tk/bindtag.rb +1 -1
- data/lib/tk/canvas.rb +6 -14
- data/lib/tk/canvastag.rb +8 -16
- data/lib/tk/font.rb +1 -1
- data/lib/tk/fontchooser.rb +1 -1
- data/lib/tk/image.rb +1 -1
- data/lib/tk/menu.rb +4 -4
- data/lib/tk/msgcat.rb +5 -5
- data/lib/tk/namespace.rb +12 -32
- data/lib/tk/optiondb.rb +3 -73
- data/lib/tk/scale.rb +2 -2
- data/lib/tk/scrollable.rb +4 -2
- data/lib/tk/selection.rb +5 -4
- data/lib/tk/text.rb +8 -16
- data/lib/tk/textmark.rb +1 -1
- data/lib/tk/texttag.rb +7 -15
- data/lib/tk/timer.rb +2 -2
- data/lib/tk/tk_mac.rb +18 -18
- data/lib/tk/validation.rb +4 -35
- data/lib/tk/variable.rb +7 -5
- data/lib/tk/virtevent.rb +1 -1
- data/lib/tkextlib/blt/barchart.rb +0 -17
- data/lib/tkextlib/blt/bitmap.rb +1 -1
- data/lib/tkextlib/blt/component.rb +34 -34
- data/lib/tkextlib/blt/dragdrop.rb +6 -6
- data/lib/tkextlib/blt/graph.rb +0 -17
- data/lib/tkextlib/blt/stripchart.rb +0 -17
- data/lib/tkextlib/blt/tabset.rb +16 -31
- data/lib/tkextlib/blt/tree.rb +5 -5
- data/lib/tkextlib/blt/treeview.rb +14 -14
- data/lib/tkextlib/blt/watch.rb +1 -1
- data/lib/tkextlib/bwidget/labelentry.rb +6 -14
- data/lib/tkextlib/bwidget/listbox.rb +13 -29
- data/lib/tkextlib/bwidget/notebook.rb +6 -14
- data/lib/tkextlib/bwidget/spinbox.rb +6 -14
- data/lib/tkextlib/bwidget/tree.rb +19 -35
- data/lib/tkextlib/itcl/incr_tcl.rb +2 -2
- data/lib/tkextlib/itk/incr_tk.rb +7 -29
- data/lib/tkextlib/iwidgets/calendar.rb +0 -15
- data/lib/tkextlib/iwidgets/entryfield.rb +0 -21
- data/lib/tkextlib/iwidgets/notebook.rb +2 -2
- data/lib/tkextlib/iwidgets/scrolledcanvas.rb +6 -14
- data/lib/tkextlib/iwidgets/tabnotebook.rb +2 -2
- data/lib/tkextlib/tcllib/ctext.rb +2 -2
- data/lib/tkextlib/tcllib/plotchart.rb +5 -5
- data/lib/tkextlib/tcllib/validator.rb +6 -6
- data/lib/tkextlib/tile.rb +1 -1
- data/lib/tkextlib/tile/style.rb +1 -1
- data/lib/tkextlib/tile/treeview.rb +13 -20
- data/lib/tkextlib/tkDND/tkdnd.rb +6 -22
- data/lib/tkextlib/tkHTML/htmlwidget.rb +1 -1
- data/lib/tkextlib/tktable/tktable.rb +1 -1
- data/lib/tkextlib/treectrl/tktreectrl.rb +12 -20
- data/lib/tkextlib/vu/pie.rb +1 -1
- data/sample/binding_sample.rb +2 -2
- data/sample/cmd_res_test.rb +1 -1
- data/sample/demos-en/widget +21 -21
- data/sample/demos-jp/widget +4 -4
- data/sample/multi-ip_sample.rb +0 -3
- data/sample/multi-ip_sample2.rb +1 -1
- data/sample/resource.en +3 -3
- data/sample/resource.ja +3 -3
- data/sample/tcltklib/sample1.rb +2 -2
- data/sample/tkballoonhelp.rb +2 -2
- data/sample/tkextlib/tkHTML/ss.rb +0 -6
- data/sample/tkmulticolumnlist.rb +2 -2
- data/sample/tkmultilistframe.rb +2 -2
- data/sample/tkoptdb.rb +14 -16
- data/tk.gemspec +4 -4
- metadata +6 -13
- data/ChangeLog.tkextlib +0 -949
- data/old-README.tcltklib.ja +0 -159
- data/sample/binstr_usage.rb +0 -46
- data/sample/remote-ip_sample2.rb +0 -57
- data/sample/safe-tk.rb +0 -132
- data/sample/tkoptdb-safeTk.rb +0 -74
- data/sample/tktree.rb +0 -104
- data/sample/tktree.tcl +0 -305
data/old-README.tcltklib.ja
DELETED
@@ -1,159 +0,0 @@
|
|
1
|
-
(tof)
|
2
|
-
2003/06/19 Hidetoshi NAGAI
|
3
|
-
|
4
|
-
本ドキュメントには古い tcltk ライブラリ,tcltklib ライブラリの説明
|
5
|
-
が含まれていますが,その記述内容は古いものとなっています.
|
6
|
-
|
7
|
-
まず,現在の Ruby/Tk の中心である tk.rb は wish を呼び出したりはせ
|
8
|
-
ず,tcltklib ライブラリを wrap して動作するものとなっています.その
|
9
|
-
ため,古い説明記述で述べられているようなプロセス間通信によるオーバ
|
10
|
-
ヘッドは存在しません.
|
11
|
-
|
12
|
-
現在の tcltklib ライブラリでも,Tcl/Tk の C ライブラリをリンクして
|
13
|
-
直接に動かすことで,オーバヘッドを押さえつつ Tcl/Tk インタープリタ
|
14
|
-
のほぼ全機能(拡張ライブラリを含む)を使える点は同じです.しかし,
|
15
|
-
その役割はほぼ「tk.rb 以下のライブラリを効果的に働かせるためのもの」
|
16
|
-
と見なされており,その目的でメンテナンスされています.
|
17
|
-
|
18
|
-
tk.rb の高機能化に伴って,中水準のライブラリである tcltk ライブラリ
|
19
|
-
(tcltk.rb)はその存在意義を減じており,現在ではメンテナンスは行わ
|
20
|
-
れていません.
|
21
|
-
|
22
|
-
なお,古い説明ではバインディングにおけるスクリプトの追加はできないこ
|
23
|
-
ととなっていますが,現在の tk.rb ではこれも可能であることを補足して
|
24
|
-
おきます.
|
25
|
-
|
26
|
-
以下がライブラリの古い説明文書です.
|
27
|
-
==============================================================
|
28
|
-
tcltk ライブラリ
|
29
|
-
tcltklib ライブラリ
|
30
|
-
Sep. 19, 1997 Y. Shigehiro
|
31
|
-
|
32
|
-
以下, 「tcl/tk」という表記は, tclsh や wish を実現している, 一般でいう
|
33
|
-
ところの tcl/tk を指します. 「tcltk ライブラリ」, 「tcltklib ライブラ
|
34
|
-
リ」という表記は, 本パッケージに含まれる ruby 用のライブラリを指します.
|
35
|
-
|
36
|
-
[ファイルについて]
|
37
|
-
|
38
|
-
README.euc : このファイル(注意, 特徴, インストールの方法).
|
39
|
-
MANUAL.euc : マニュアル.
|
40
|
-
|
41
|
-
lib/, ext/ : ライブラリの実体.
|
42
|
-
|
43
|
-
sample/ : マニュアル代わりのサンプルプログラム.
|
44
|
-
sample/sample0.rb : tcltklib ライブラリのテスト.
|
45
|
-
sample/sample1.rb : tcltk ライブラリのテスト.
|
46
|
-
tcl/tk (wish) でできそうなことを一通り書いてみました.
|
47
|
-
sample/sample2.rb : tcltk ライブラリのサンプル.
|
48
|
-
maeda shugo (shugo@po.aianet.ne.jp) 氏による
|
49
|
-
(`rb.tk' で書かれていた) ruby のサンプルプログラム
|
50
|
-
http://www.aianet.or.jp/~shugo/ruby/othello.rb.gz
|
51
|
-
を tcltk ライブラリを使うように, 機械的に変更してみました.
|
52
|
-
|
53
|
-
demo/ : 100 本の線を 100 回描くデモプログラム.
|
54
|
-
最初に空ループの時間を測定し, 続いて実際に線を引く時間を測定します.
|
55
|
-
tcl/tk は(再)描画のときに backing store を使わずに律義に 10000 本(?)
|
56
|
-
線を引くので, (再)描画を始めると, マシンがかなり重くなります.
|
57
|
-
demo/lines0.tcl : wish 用のスクリプト.
|
58
|
-
demo/lines1.rb : `tk.rb' 用のスクリプト.
|
59
|
-
demo/lines2.rb : tcltk ライブラリ用のスクリプト.
|
60
|
-
|
61
|
-
[注意]
|
62
|
-
|
63
|
-
コンパイル/実行には, tcl/tk の C ライブラリが必要です.
|
64
|
-
|
65
|
-
このライブラリは,
|
66
|
-
|
67
|
-
ruby-1.0-970701, ruby-1.0-970911, ruby-1.0-970919
|
68
|
-
FreeBSD 2.2.2-RELEASE
|
69
|
-
およびそのパッケージ jp-tcl-7.6.tgz, jp-tk-4.2.tgz
|
70
|
-
|
71
|
-
で作成/動作確認しました. 他の環境では動作するかどうかわかりません.
|
72
|
-
|
73
|
-
TclTkLib.mainloop を実行中に Control-C が効かないのは不便なので, ruby
|
74
|
-
のソースを参考に, #include "sig.h" して trap_immediate を操作していま
|
75
|
-
すが, ruby の README.EXT にも書いてないのに, こんなことをして良いのか
|
76
|
-
どうかわかりません.
|
77
|
-
|
78
|
-
-d オプションでデバッグ情報を表示させるために, ruby のソースを参考に,
|
79
|
-
debug という大域変数を参照していますが, ruby の README.EXT にも書いて
|
80
|
-
ないのに, こんなことをして良いのかどうかわかりません.
|
81
|
-
|
82
|
-
extconf.rb は書きましたが, (いろいろな意味で)これで良いのか良く分かり
|
83
|
-
ません.
|
84
|
-
|
85
|
-
[特徴]
|
86
|
-
|
87
|
-
ruby から tcl/tk ライブラリを利用できます.
|
88
|
-
|
89
|
-
tcl/tk インタプリタのスクリプトは, 機械的に tcltk ライブラリ用の ruby
|
90
|
-
スクリプトに変換できます.
|
91
|
-
|
92
|
-
(`tk.rb' との違い)
|
93
|
-
|
94
|
-
1. tcl/tk インタプリタのスクリプトが, どのように, tcltk ライブラリ用の
|
95
|
-
ruby スクリプトに変換されるかが理解できれば, マニュアル類が無いに等
|
96
|
-
しい `tk.rb' とは異なり
|
97
|
-
|
98
|
-
tcl/tk のマニュアルやオンラインドキュメントを用いて
|
99
|
-
|
100
|
-
効率良くプログラミングを行うことができます.
|
101
|
-
記述方法がわからない, コマンドに与えるパラメータがわからない...
|
102
|
-
- Canvas.new { ... } と, なぜイテレータブロックを書けるの??
|
103
|
-
- Canvas の bbox は数値のリストを返すのに, xview は文字列を返すの??
|
104
|
-
と, いちいち, ライブラリのソースを追いかける必要はありません.
|
105
|
-
|
106
|
-
2. 個々の機能(オプション)を個別処理によりサポートしており, そのためサ
|
107
|
-
ポートしていない機能は使うことができない(本当は使えないこともないの
|
108
|
-
ですが) `tk.rb' とは異なり, tcl/tk インタプリタで可能なことは
|
109
|
-
|
110
|
-
ほとんど
|
111
|
-
|
112
|
-
ruby からも実行できます. 現在, ruby から実行できないことが確認され
|
113
|
-
ているのは,
|
114
|
-
|
115
|
-
bind コマンドでスクリプトを追加する構文
|
116
|
-
「bind tag sequence +script」
|
117
|
-
^
|
118
|
-
|
119
|
-
のみです.
|
120
|
-
- `. configure -width' をしようとして, `Tk.root.height()' と書い
|
121
|
-
たのに, `undefined method `height'' と怒られてしまった. tk.rb を
|
122
|
-
読んでみて, ガーン. できないのか...
|
123
|
-
ということはありません.
|
124
|
-
|
125
|
-
3. wish プロセスを起動しプロセス間通信で wish を利用する `tk.rb' とは
|
126
|
-
異なり, tcl/tk の C ライブラリをリンクし
|
127
|
-
|
128
|
-
より高速に (といっても, 思った程は速くないですが)
|
129
|
-
|
130
|
-
処理を行います.
|
131
|
-
|
132
|
-
4. `tk.rb' ほど, 高水準なインターフェースを備えていないため, tcl/tk イ
|
133
|
-
ンタプリタの生成等
|
134
|
-
|
135
|
-
何から何まで自分で記述
|
136
|
-
|
137
|
-
しなければなりません(その代わり, tcl/tk ライブラリの仕様通り,
|
138
|
-
tcl/tk インタプリタを複数生成することもできますが).
|
139
|
-
インターフェースは(おそらく) ruby の思想に沿ったものではありません.
|
140
|
-
また, スクリプトの記述は
|
141
|
-
|
142
|
-
ダサダサ
|
143
|
-
|
144
|
-
です. スクリプトは, 一見, 読みづらいものとなります. が, 書く人にとっ
|
145
|
-
ては, それほど煩わしいものではないと思います.
|
146
|
-
|
147
|
-
[インストールの方法]
|
148
|
-
|
149
|
-
0. ruby のソースファイル(ruby-1.0-なんたら.tgz)を展開しておきます.
|
150
|
-
|
151
|
-
1. ruby-1.0-なんたら/ext に ext/tcltklib をコピーします.
|
152
|
-
cp -r ext/tcltklib ???/ruby-1.0-なんたら/ext/
|
153
|
-
|
154
|
-
2. ruby のインストール法に従い make 等をします.
|
155
|
-
|
156
|
-
3. ruby のライブラリ置場に lib/* をコピーします.
|
157
|
-
cp lib/* /usr/local/lib/ruby/
|
158
|
-
|
159
|
-
(eof)
|
data/sample/binstr_usage.rb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# frozen_string_literal: false
|
3
|
-
|
4
|
-
require "tk"
|
5
|
-
|
6
|
-
TkMessage.new(:width=>360, :text=><<EOM).pack
|
7
|
-
This sample shows how to use a binary sequence between Ruby and Tk. \
|
8
|
-
This reads the image data from the file as the binary sequence.
|
9
|
-
|
10
|
-
To treat the difference of encodings between on Ruby and on Tk seamlessly, \
|
11
|
-
Ruby/Tk converts the encoding of string arguments automatically. \
|
12
|
-
I think it is comfortable for users on almost all situations. \
|
13
|
-
However, when treats a binary sequence, the convert process makes troubles.
|
14
|
-
|
15
|
-
Tk::BinaryString class (subclass of Tk::EncodedString class) is the class \
|
16
|
-
to avoid such troubles. Please see the source code of this sample. \
|
17
|
-
A Tk::BinaryString instance is used to create the image for the center button.
|
18
|
-
EOM
|
19
|
-
|
20
|
-
ImgFile=[File.dirname(__FILE__), 'images','tcllogo.gif'].join(File::Separator)
|
21
|
-
|
22
|
-
ph1 = TkPhotoImage.new(:file=>ImgFile)
|
23
|
-
p ph1.configinfo
|
24
|
-
|
25
|
-
b_str = Tk::BinaryString(IO.read(ImgFile))
|
26
|
-
p [b_str, b_str.encoding]
|
27
|
-
|
28
|
-
ph2 = TkPhotoImage.new(:data=>b_str)
|
29
|
-
p ph2.configinfo
|
30
|
-
p ph2.data(:grayscale=>true)
|
31
|
-
|
32
|
-
ph3 = TkPhotoImage.new(:palette=>256)
|
33
|
-
ph3.put(ph2.data)
|
34
|
-
|
35
|
-
ph4 = TkPhotoImage.new()
|
36
|
-
ph4.put(ph2.data(:grayscale=>true))
|
37
|
-
|
38
|
-
#p [b_str.encoding, b_str.rb_encoding]
|
39
|
-
|
40
|
-
f = TkFrame.new.pack
|
41
|
-
TkButton.new(:parent=>f, :image=>ph1, :command=>proc{exit}).pack(:side=>:left)
|
42
|
-
TkButton.new(:parent=>f, :image=>ph2, :command=>proc{exit}).pack(:side=>:left)
|
43
|
-
TkButton.new(:parent=>f, :image=>ph3, :command=>proc{exit}).pack(:side=>:left)
|
44
|
-
TkButton.new(:parent=>f, :image=>ph4, :command=>proc{exit}).pack(:side=>:left)
|
45
|
-
|
46
|
-
Tk.mainloop
|
data/sample/remote-ip_sample2.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# frozen_string_literal: false
|
3
|
-
|
4
|
-
require 'remote-tk'
|
5
|
-
|
6
|
-
# start sub-process
|
7
|
-
ip_name = 'remote_ip'
|
8
|
-
ip_list = TkWinfo.interps
|
9
|
-
fork{
|
10
|
-
exec "/usr/bin/env ruby -r tk -e \"Tk.appname('#{ip_name}');Tk.mainloop\""
|
11
|
-
}
|
12
|
-
sleep 1 until (app = (TkWinfo.interps - ip_list)[0]) && app =~ /^#{ip_name}/
|
13
|
-
p TkWinfo.interps
|
14
|
-
|
15
|
-
# create RemoteTkIp object
|
16
|
-
ip = RemoteTkIp.new(app)
|
17
|
-
|
18
|
-
# setup remote-ip window
|
19
|
-
btns = []
|
20
|
-
ip.eval_proc{
|
21
|
-
btns <<
|
22
|
-
TkButton.new(:command=>proc{
|
23
|
-
puts 'This procedure is on the controller-ip (Ruby-side)'
|
24
|
-
},
|
25
|
-
:text=>'print on controller-ip (Ruby-side)').pack(:fill=>:x)
|
26
|
-
|
27
|
-
btns <<
|
28
|
-
TkButton.new(:command=>
|
29
|
-
'puts {This procedure is on the remote-ip (Tk-side)}',
|
30
|
-
:text=>'print on remote-ip (Tk-side)').pack(:fill=>:x)
|
31
|
-
|
32
|
-
btns <<
|
33
|
-
TkButton.new(:command=>
|
34
|
-
'ruby {
|
35
|
-
puts "This procedure is on the remote-ip (Ruby-side)"
|
36
|
-
p Array.new(3,"ruby")
|
37
|
-
}',
|
38
|
-
:text=>'ruby cmd on the remote-ip').pack(:fill=>:x)
|
39
|
-
|
40
|
-
TkButton.new(:command=>'exit', :text=>'QUIT').pack(:fill=>:x)
|
41
|
-
}
|
42
|
-
|
43
|
-
# setup controller-ip window
|
44
|
-
btns.each_with_index{|btn, idx|
|
45
|
-
# The scope of the eval-block of 'eval_proc' method is different from
|
46
|
-
# the enternal. If you want to pass local values to the eval-block,
|
47
|
-
# use arguments of eval_proc method. They are passed to block-arguments.
|
48
|
-
TkButton.new(:command=>proc{ip.eval_proc(btn){|b| b.flash}},
|
49
|
-
:text=>"flash button-#{idx}",
|
50
|
-
:padx=>10).pack(:padx=>10, :pady=>2)
|
51
|
-
}
|
52
|
-
|
53
|
-
TkButton.new(:command=>proc{exit}, :text=>'QUIT',
|
54
|
-
:padx=>10, :pady=>7).pack(:padx=>10, :pady=>7)
|
55
|
-
|
56
|
-
# start eventloop
|
57
|
-
Tk.mainloop
|
data/sample/safe-tk.rb
DELETED
@@ -1,132 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# frozen_string_literal: false
|
3
|
-
# This script is a sample of MultiTkIp class
|
4
|
-
|
5
|
-
require "multi-tk"
|
6
|
-
|
7
|
-
###############################
|
8
|
-
|
9
|
-
TkLabel.new(:text=>'This is the Default Master Ipnterpreter').pack(:padx=>5, :pady=>3)
|
10
|
-
TkButton.new(:text=>'QUIT', :command=>proc{exit}).pack(:pady=>3)
|
11
|
-
TkFrame.new(:borderwidth=>2, :height=>3,
|
12
|
-
:relief=>:sunken).pack(:fill=>:x, :expand=>true,
|
13
|
-
:padx=>10, :pady=>7)
|
14
|
-
|
15
|
-
safe0_p = proc{|*args| p args}
|
16
|
-
|
17
|
-
###############################
|
18
|
-
|
19
|
-
puts "---- create a safe slave IP with Ruby's safe-level == 1 ----------"
|
20
|
-
ip = MultiTkIp.new_safe_slave(1){|*args| safe0_p["safe_slave safe_level == #{$SAFE}", args]}
|
21
|
-
|
22
|
-
puts "\n---- create procs ----------"
|
23
|
-
puts 'x = proc{p [\'proc x\', "$SAFE==#{$SAFE}"]; exit}'
|
24
|
-
#x = proc{p ['proc x', "$SAFE==#{$SAFE}"]; exit}
|
25
|
-
x = proc{p ['proc x', "$SAFE==#{$SAFE}"]; exit}
|
26
|
-
TkLabel.new(:text=>'x = proc{p [\'proc x\', "$SAFE==#{$SAFE}"]; exit}',
|
27
|
-
:anchor=>:w).pack(:fill=>:x)
|
28
|
-
|
29
|
-
puts 'y = proc{|label| p [\'proc y\', "$SAFE==#{$SAFE}", label]; label.text($SAFE)}'
|
30
|
-
y = proc{|label| p ['proc y', "$SAFE==#{$SAFE}", label]; label.text($SAFE)}
|
31
|
-
TkLabel.new(:text=>'y = proc{|label| p [\'proc y\', "$SAFE==#{$SAFE}", label]; label.text($SAFE)}',
|
32
|
-
:anchor=>:w).pack(:fill=>:x)
|
33
|
-
|
34
|
-
puts 'z = proc{p [\'proc z\', "$SAFE==#{$SAFE}"]; exit}'
|
35
|
-
z = proc{p ['proc z', "$SAFE==#{$SAFE}"]; exit}
|
36
|
-
TkLabel.new(:text=>'z = proc{p [\'proc z\', "$SAFE==#{$SAFE}"]; exit}',
|
37
|
-
:anchor=>:w).pack(:fill=>:x)
|
38
|
-
|
39
|
-
puts "\n---- call 1st eval_proc ----------"
|
40
|
-
print 'lbl = '
|
41
|
-
p lbl = ip.eval_proc{
|
42
|
-
TkLabel.new(:text=>"1st eval_proc : $SAFE == #{$SAFE}").pack
|
43
|
-
|
44
|
-
f = TkFrame.new.pack
|
45
|
-
TkLabel.new(f, :text=>"$SAFE == ").pack(:side=>:left)
|
46
|
-
# TkLabel.new(f, :text=>" (<-- 'lbl' widget is here)").pack(:side=>:right)
|
47
|
-
l = TkLabel.new(f).pack(:side=>:right)
|
48
|
-
|
49
|
-
TkButton.new(:text=>':command=>proc{l.text($SAFE)}',
|
50
|
-
:command=>proc{l.text($SAFE)}).pack(:fill=>:x, :padx=>5)
|
51
|
-
TkButton.new(:text=>':command=>x', :command=>x).pack(:fill=>:x, :padx=>5)
|
52
|
-
TkButton.new(:text=>':command=>proc{exit}',
|
53
|
-
:command=>proc{
|
54
|
-
safe0_p["'exit' is called at $SAFE=#{$SAFE}"];exit}
|
55
|
-
).pack(:fill=>:x, :padx=>5)
|
56
|
-
TkFrame.new(:borderwidth=>2, :height=>3,
|
57
|
-
:relief=>:sunken).pack(:fill=>:x, :expand=>true,
|
58
|
-
:padx=>10, :pady=>7)
|
59
|
-
l # return the label widget
|
60
|
-
}
|
61
|
-
|
62
|
-
puts "\n---- change the safe slave IP's safe-level ==> 3 ----------"
|
63
|
-
ip.safe_level = 3
|
64
|
-
|
65
|
-
puts "\n---- call 2nd eval_proc ----------"
|
66
|
-
p ip.eval_proc(proc{
|
67
|
-
TkLabel.new(:text=>"2nd eval_proc : $SAFE == #{$SAFE}").pack
|
68
|
-
f = TkFrame.new.pack
|
69
|
-
TkLabel.new(f, :text=>"$SAFE == ").pack(:side=>:left)
|
70
|
-
l = TkLabel.new(f, :text=>$SAFE).pack(:side=>:right)
|
71
|
-
TkButton.new(:text=>':command=>proc{l.text($SAFE)}',
|
72
|
-
:command=>proc{l.text($SAFE)}).pack(:fill=>:x,
|
73
|
-
:padx=>5)
|
74
|
-
TkButton.new(:text=>':command=>proc{y.call(l)}',
|
75
|
-
:command=>proc{y.call(l)}).pack(:fill=>:x,
|
76
|
-
:padx=>5)
|
77
|
-
TkButton.new(:text=>':command=>proc{Proc.new(&y).call(l)}',
|
78
|
-
:command=>proc{
|
79
|
-
Proc.new(&y).call(l)
|
80
|
-
}).pack(:fill=>:x, :padx=>5)
|
81
|
-
TkButton.new(:text=>':command=>proc{MultiTkIp._proc_on_current_safelevel(y).call(l)}',
|
82
|
-
:command=>proc{
|
83
|
-
MultiTkIp._proc_on_current_safelevel(y).call(l)
|
84
|
-
}).pack(:fill=>:x, :padx=>5)
|
85
|
-
if false && Object.const_defined?(:RubyVM) && ::RubyVM.class == Class
|
86
|
-
TkButton.new(:text=>':command=>proc{Thread.new(l, &y).value}',
|
87
|
-
:command=>proc{
|
88
|
-
Thread.new(l, &y).value
|
89
|
-
}).pack(:fill=>:x, :padx=>5)
|
90
|
-
else
|
91
|
-
# KNOWN BUG::
|
92
|
-
# Current multi-tk.rb cannot support long term threads on callbacks.
|
93
|
-
# Such a thread freezes the Ruby/Tk process.
|
94
|
-
end
|
95
|
-
TkButton.new(:text=>':command=>proc{z.call}',
|
96
|
-
:command=>proc{z.call}).pack(:fill=>:x, :padx=>5)
|
97
|
-
TkFrame.new(:borderwidth=>2, :height=>3,
|
98
|
-
:relief=>:sunken).pack(:fill=>:x, :expand=>true,
|
99
|
-
:padx=>10, :pady=>7)
|
100
|
-
})
|
101
|
-
|
102
|
-
puts "\n---- call 1st and 2nd eval_str ----------"
|
103
|
-
p bind = ip.eval_str('
|
104
|
-
TkLabel.new(:text=>"1st and 2nd eval_str : $SAFE == #{$SAFE}").pack
|
105
|
-
f = TkFrame.new.pack
|
106
|
-
TkLabel.new(f, :text=>"$SAFE == ").pack(:side=>:left)
|
107
|
-
l = TkLabel.new(f, :text=>$SAFE).pack(:side=>:right)
|
108
|
-
TkButton.new(:text=>":command=>proc{y.call(l)}",
|
109
|
-
:command=>proc{y.call(l)}).pack(:fill=>:x, :padx=>5)
|
110
|
-
binding
|
111
|
-
', binding)
|
112
|
-
|
113
|
-
p ip.eval_str("
|
114
|
-
TkButton.new(:text=>':command=>proc{ l.text = $SAFE }',
|
115
|
-
:command=>proc{ l.text = $SAFE }).pack(:fill=>:x, :padx=>5)
|
116
|
-
TkFrame.new(:borderwidth=>2, :height=>3,
|
117
|
-
:relief=>:sunken).pack(:fill=>:x, :expand=>true,
|
118
|
-
:padx=>10, :pady=>7)
|
119
|
-
", bind)
|
120
|
-
|
121
|
-
puts "\n---- call 3rd and 4th eval_proc ----------"
|
122
|
-
p ip.eval_proc{
|
123
|
-
TkLabel.new(:text=>"3rd and 4th eval_proc : $SAFE == #{$SAFE}").pack
|
124
|
-
}
|
125
|
-
p ip.eval_proc{
|
126
|
-
TkButton.new(:text=>':command=>proc{ lbl.text = $SAFE }',
|
127
|
-
:command=>proc{ lbl.text = $SAFE }).pack(:fill=>:x, :padx=>5)
|
128
|
-
}
|
129
|
-
|
130
|
-
puts "\n---- start event-loop ( current $SAFE == #{$SAFE} ) ----------"
|
131
|
-
|
132
|
-
Tk.mainloop
|
data/sample/tkoptdb-safeTk.rb
DELETED
@@ -1,74 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# frozen_string_literal: false
|
3
|
-
|
4
|
-
require 'multi-tk'
|
5
|
-
|
6
|
-
TkMessage.new(:text => <<EOM).pack
|
7
|
-
This is a sample of the safe-Tk slave interpreter. \
|
8
|
-
On the slave interpreter, 'tkoptdb.rb' demo is running.
|
9
|
-
( NOTE:: a safe-Tk interpreter can't read options \
|
10
|
-
from a file. Options are given by the master interpreter \
|
11
|
-
in this script. )
|
12
|
-
The window shown this message is a root widget of \
|
13
|
-
the default master interpreter. The other window \
|
14
|
-
is a toplevel widget of the master interpreter, and it \
|
15
|
-
has a container frame of the safe-Tk slave interpreter.
|
16
|
-
'exit' on the slave interpreter exits the slave only. \
|
17
|
-
You can also delete the slave by the button on the toplevel widget.
|
18
|
-
EOM
|
19
|
-
|
20
|
-
if ENV['LANG'] =~ /^ja/
|
21
|
-
# read Japanese resource
|
22
|
-
ent = TkOptionDB.read_entries(File.expand_path('resource.ja',
|
23
|
-
File.dirname(__FILE__)),
|
24
|
-
'utf-8')
|
25
|
-
else
|
26
|
-
# read English resource
|
27
|
-
ent = TkOptionDB.read_entries(File.expand_path('resource.en',
|
28
|
-
File.dirname(__FILE__)))
|
29
|
-
end
|
30
|
-
|
31
|
-
file = File.expand_path('tkoptdb.rb', File.dirname(__FILE__))
|
32
|
-
|
33
|
-
ip = MultiTkIp.new_safeTk{
|
34
|
-
# When a block is given to 'new_safeTk' method,
|
35
|
-
# the block is evaluated on $SAFE==1.
|
36
|
-
ent.each{|pat, val| Tk.tk_call('option', 'add', pat, val)}
|
37
|
-
}
|
38
|
-
|
39
|
-
print "ip.eval_proc{$SAFE} ==> ", ip.eval_proc{$SAFE}, "\n"
|
40
|
-
|
41
|
-
print "\ncall 'ip.wait_on_mainloop = false'\n"
|
42
|
-
print "If 'ip.wait_on_mainloop? == true', ",
|
43
|
-
"when 'mainloop' is called on 'ip.eval_proc', ",
|
44
|
-
"'ip.eval_proc' doesn't return while the root window exists.\n",
|
45
|
-
"If you want to avoid that, set wait_on_mainloop to false. ",
|
46
|
-
"Then the mainloop in the eval_proc returns soon ",
|
47
|
-
"and the following steps are evaluated. \n",
|
48
|
-
"If you hate the both of them, use 'ip.bg_eval_proc' or ",
|
49
|
-
"wrap 'ip.eval_proc' by a thread.\n"
|
50
|
-
|
51
|
-
ip.wait_on_mainloop = false
|
52
|
-
|
53
|
-
ret = ip.eval_proc{
|
54
|
-
# When a block is given to 'eval_proc' method,
|
55
|
-
# the block is evaluated on the IP's current safe level.
|
56
|
-
# So, the followings raises an exception.
|
57
|
-
# An Exception object of the exception is returned as a
|
58
|
-
# return value of this method.
|
59
|
-
|
60
|
-
load file
|
61
|
-
}
|
62
|
-
print "\nip.eval_proc{}, which includes insecure operation in the given block, returns an exception object: ", ret.inspect, "\n"
|
63
|
-
|
64
|
-
print "If a proc object is given, the proc is evaluated on the safe-level which is kept on the proc :: ip.eval_proc( proc{$SAFE} ) ==> ", ip.eval_proc(proc{$SAFE}), "\n"
|
65
|
-
|
66
|
-
safe0_cmd = Proc.new{
|
67
|
-
print 'safe0_cmd safe-level == ', $SAFE, "\n"
|
68
|
-
# This proc object keeps current safe-level ($SAFE==0).
|
69
|
-
load file
|
70
|
-
}
|
71
|
-
ip.eval_proc{safe0_cmd.call}
|
72
|
-
|
73
|
-
# Tk.mainloop is ignored on the slave-IP
|
74
|
-
Tk.mainloop
|