Wish Tcl/Tk 入門7. ファイル入出力 |
open, close, flush, tk_getOpenFile, tk_getSaveFile
メニューの中にある大事な項目が、開くと保存です。file の 入出力をするのには、便利な tk_getOpenFile, tk_getSaveFile が あります。
#!/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 を読みます。
#!/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-/ で 文章全体を選択できます。
#!/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 で使い方を見てください。