Wish Tcl/Tk 入門

Wish Tcl/Tk 入門

7. ファイル入出力

open, close, flush, tk_getOpenFile, tk_getSaveFile

メニューの中にある大事な項目が、開くと保存です。file の 入出力をするのには、便利な tk_getOpenFile, tk_getSaveFile が あります。

7.1 簡単な Editor

(実行例 7.1) file の中身を text に読み 、text を file に保存します。
#!/bin/sh
# the next line restarts using wish \
exec wish "$0" "$@"
# edit1.tcl
# file の中身を読み、保存します。
#
wm title . edit1-tcl
#
# configure command で . に メニューバー .m1 を作ります。
#
. configure -menu .m1 
menu .m1
#
# .m1 の下に file color という メニューを作ります。
#     -tearoff no 切り離しはしない。
#   add cascade です。
#
# 先頭文字(英語) -underline 0 でメニューの選択が可能です。
# 例えば Alt + F で F:ファイル選択
#
.m1 add cascade -label F:ファイル -underline 0 -menu .m1.file
menu .m1.file -tearoff no
#
# .m1.file の下にアクセレレータを付けます。
# bind で アクセレレータ と command の関係を作る必要があります。
# これだと menu を 選択しないでも Cntl-b で ベルの選択になります。
#
.m1.file  add command -label 開く -command Openfile \
	-accelerator "Cntl+O"
bind all  { Openfile }
#
.m1.file  add command -label 保存 -command Savefile \
	-accelerator "Cntl+S"
bind all  { Savefile }
#
.m1.file  add command -label 終了 -command exit \
	-accelerator "Cntl+C"
bind all  { exit }
#
# text 領域を scroll bar を付けて表示します。
#
frame .fm
pack .fm
text .fm.txt -bg white -width 80 -height 20 \
	-yscrollcommand ".fm.ysc set"
scrollbar .fm.ysc -command ".fm.txt yview"
#
# スクロールバーの pack は先にして -side right が良い。
# 
pack .fm.ysc .fm.txt -side right -fill y -expand yes
#
# Openfile file を開く
#
proc Openfile { } {
    set ftype { { "Tcl Files" .tcl } { "All Files" * }}
    set fname [ tk_getOpenFile -filetypes $ftype -parent . ]
    if { $fname == "" } return
#
# "r" read mode で file を open   % man n open を 見よ。
#
# mode には r, w, a (追加), r+ と w+ (読み書き自由)
#           r+, a の場合には既存の file であることが必要。
#
    set fileid [ open $fname "r" ]
#
# .fm.txt (text 部分) を消去して読み込み(read)します。
#
    .fm.txt delete 1.0 end
    .fm.txt insert 1.0 [ read -nonewline $fileid ]
    close $fileid
return
}
#
# Savefile file を保存
#
proc Savefile { } {
#
    set ftype { { "Tcl Files" .tcl } { "All Files" * }}
    set fname [ tk_getSaveFile -filetypes $ftype -parent . ]
    if { $fname == "" } return
#
# "w" write mode で file を open 
#
    set fileid [ open $fname "w" ]
#
# .fm.txt (text 部分) を get して書き出します。
#
    puts -nonewline $fileid [ .fm.txt get 1.0 end ]
    close $fileid
return
}

実行すると、ファイルを読み編集して保存できます。 file を選択する window が でてきます。

編集領域は text 部品の機能だけをつかっています。スクロー ルの設定は例を見て参考にしてください。x 方向のスクロールも設 定出来ます。この場合には、scrollbar .fm.scx -command ".fm.txt xview" -orient horizontal の指定が必要です。

ここでは tcl file だけを読むような設定になっています。 file 選択の中で file type を all files にすれば 全ての file を読みます。

7.2 クリップボードを用いた切り貼り

(実行例 7.2) 7.1 の 操作に、クリップボードを使った 切り貼りをします。text 部品には、何もしなくても C-w (cut) C-y (Paste), M-w (copy) のような windows で良く使うアクセラ レータが備わっていますが、ここでは敢えて自分で設定します。 text 部品に備わっている binding は man n text で /BINDINGS で bindings の 項を検索してください。
#!/bin/sh
# the next line restarts using wish \
exec wish "$0" "$@"
# edit2.tcl
# file の中身を読み、保存します。
# 編集の cut copy paste 機能を加えます。
#
wm title . edit1-tcl
#
# configure command で . に メニューバー .m1 を作ります。
#
. configure -menu .m1 
menu .m1
#
# .m1 の下に file edit という メニューを作ります。
#     -tearoff no 切り離しはしない。
#   add cascade です。
#
# 先頭文字(英語) -underline 0 でメニューの選択が可能です。
# 例えば Alt + F で F:ファイル選択
#
.m1 add cascade -label F:ファイル -underline 0 -menu .m1.file
menu .m1.file -tearoff no
.m1 add cascade -label E:編集 -underline 0 -menu .m1.edit
menu .m1.edit -tearoff no
#
# .m1.file の下にアクセレレータを付けます。
# bind で アクセレレータ と command の関係を作る必要があります。
# これだと menu を 選択しないでも Cntl-b で ベルの選択になります。
#
.m1.file  add command -label 開く -command Openfile \
	-accelerator "Cntl+O"
bind all  { Openfile }
#
.m1.file  add command -label 保存 -command Savefile \
	-accelerator "Cntl+S"
bind all  { Savefile }
#
# 安全のため C-c を copy でも exit でもないようにしました。
#
.m1.file  add command -label 終了 -command exit \
	-accelerator "Cntl+Q"
bind all  { exit }
#
# .m1.edit の下にアクセレレータを付けます。
#
.m1.edit  add command -label コピー -command { copy 0 } \
	-accelerator "Alt+C"
bind all  { copy 0 }
#
.m1.edit  add command -label 切取り -command { copy 1 } \
	-accelerator "Alt+X"
bind all  { copy 1 }
#
.m1.edit  add command -label 張付け -command paste \
	-accelerator "Alt+V"
bind all  { paste }
#
# text 領域を scroll bar を付けて表示します。
#
frame .fm
pack .fm
text .fm.txt -bg white -width 80 -height 20 \
	-yscrollcommand ".fm.ysc set"
scrollbar .fm.ysc -command ".fm.txt yview"
#
# スクロールバーの pack は先にして -side right が良い。
# 
pack .fm.ysc .fm.txt -side right -fill y -expand yes
#
# Openfile file を開く
#
proc Openfile { } {
    set ftype { { "Tcl Files" .tcl } { "All Files" * }}
    set fname [ tk_getOpenFile -filetypes $ftype -parent . ]
    if { $fname == "" } return
#
# "r" read mode で file を open   % man n open を 見よ。
#
# mode には r, w, a (追加), r+ と w+ (読み書き自由)
#           r+, a の場合には既存の file であることが必要。
#
    set fileid [ open $fname "r" ]
#
# .fm.txt (text 部分) を消去して読み込み(read)します。
#
    .fm.txt delete 1.0 end
    .fm.txt insert 1.0 [ read -nonewline $fileid ]
    close $fileid
return
}
#
# Savefile file を保存
#
proc Savefile { } {
#
    set ftype { { "Tcl Files" .tcl } { "All Files" * }}
    set fname [ tk_getSaveFile -filetypes $ftype -parent . ]
    if { $fname == "" } return
#
# "w" write mode で file を open 
#
    set fileid [ open $fname "w" ]
#
# .fm.txt (text 部分) を get して書き出します。
#
    puts -nonewline $fileid [ .fm.txt get 1.0 end ]
    close $fileid
return
}
#
# copy : 選択範囲(sel.first sel.last)
#         selection get で 選択範囲を取得
# をクリップボードに追加 clipboard append contents
#  i = 0 copy =1 cut
# 選択する前にクリップボードの内容を消去
# クリップボードに追加 = clipboard append 
# catch { ... } は ... が 失敗してもそのまま続行して処理
#                  するための コマンド man n catch 
proc copy { i } {
clipboard clear
catch { clipboard append [ selection get ] } 
if { $i == "1" } { catch { .fm.txt delete sel.first sel.last } }
}
#
# paste : クリップボードの内容を張り付ける
#
proc paste { } {
    catch { set contents [ selection get -selection CLIPBOARD ] }
    catch { set point [ .fm.txt index insert ] }
    catch { .fm.txt insert $point $contents } 
}

file を open して、マウスをドラッグして選択します。 cut や paste ができることを確認してください。C-/ で 文章全体を選択できます。

7.3 簡単なイメージビューア (image canvas)

file で open したり save したりするのは、text の他に image があります。ここでは、image の file である gif file をみます。 image を張り付けるのは、canvas というものです。canvas はグラ フィックのための空間です。image が全て見られるように、 scrollbar を付け、また image の大きさを認識して、window の大 きさを変形しています。また window manager によって window を 変形しても、image 全体が scrollbar で見られるようになってい ます。いくつかの gif file を copy して 試してみましょう。
#!/bin/sh
# the next line restarts using wish \
exec wish "$0" "$@"
# edit3.tcl
# Image file の中身を読み、保存します。
#
wm title . edit3-tcl
#
# configure command で . に メニューバー .m1 を作ります。
#
. configure -menu .m1 
menu .m1
#
# .m1 の下に file という メニューを作ります。
#     -tearoff no 切り離しはしない。
#   add cascade です。
#
# 先頭文字(英語) -underline 0 でメニューの選択が可能です。
# 例えば Alt + F で F:ファイル選択
#
.m1 add cascade -label F:ファイル -underline 0 -menu .m1.file
menu .m1.file -tearoff no
#
# .m1.file の下にアクセレレータを付けます。
# bind で アクセレレータ と command の関係を作る必要があります。
# これだと menu を 選択しないでも Cntl-b で ベルの選択になります。
#
.m1.file  add command -label 開く -command Openfile \
	-accelerator "Cntl+O"
bind all  { Openfile }
#
# 安全のため C-c を copy でも exit でもないようにしました。
#
.m1.file  add command -label 終了 -command exit \
	-accelerator "Cntl+Q"
bind all  { exit }
#
# image を張り付ける キャンバスを scrollbar を付けて表示します。
# 
frame .fm
pack .fm
canvas .fm.can -bg white -width 180 -height 120 \
	-xscrollcommand ".fm.xsc set" \
	-yscrollcommand ".fm.ysc set"
scrollbar .fm.xsc -command ".fm.can xview" -orient horizontal
scrollbar .fm.ysc -command ".fm.can yview"
#
# スクロールバーの pack は先にして -side right が良い。
# 
pack .fm.ysc -side right -fill y 
pack .fm.xsc -side bottom -fill x
pack .fm.can -side left -fill both -expand yes
#
# Openfile file を開く
#
proc Openfile { } {
    set ftype { { "gif Files" .gif } { "All Files" * }}
    set fname [ tk_getOpenFile -filetypes $ftype -parent . ]
    if { $fname == "" } return
#
# image を定義します。
# image crate type name -file fname
image create photo img1 -file $fname
#
# image の 幅 w と 高さ h を採取します。
#
set w [ image width img1 ]
set h [ image height img1 ]
#
# canvas の 大きさを変えます。
# scrollbar の動く範囲を指定しなおします。
#
.fm.can configure -width $w -height $h
.fm.can configure -scrollregion "0 0 $w $h" 
#
# image の 左上 (北西 nw) が canvas の 0 0 になるようにおき
# ます。
# 
.fm.can create image 0 0 -image img1 -anchor nw
return
}


いろいろな gif file をload してみてください。例えば、 /usr/lib/tk8.0jp/demos/images などには、earth.gif などがあり ます。

image の編集 (xpaint や MSpaint の様な機能は canvas 上の いろいろな機能で可能です。) 8 章を参照してください。

gif の 他、ppm/pgm/pbm は image で 表示できます。jpeg 等 は、それ用の library を internet 等にありますので 探してみて ください。xv や file converter のようなものを tcl/tk で作っ ている人はいると思います。

image の他に bitmap があります。XBM 形式の白黒なら ok の はずです。man n bitmap で使い方を見てください。


rsaito@ee.uec.ac.jp