Perl/Tkには様々な汎用のウィジェットが用意されています.
ファイルを開いたり保存したりするためには,そのファイルの名前を取得する必要があります.getOpenFileとgetSaveFileはブラウザを表示し,マウスで選択するGUIを提供します.
書式: $openfilename = $widget->getOpenFile(?options?)
$savefilename = $widget->getSaveFile(?options?)
主なオプション
オプション | 説明 | オプション値の例 |
-filetypes => filetypelist | ファイルの型の一覧リストの指定 | [["Text file", '.txt'], ["GIF image", '.gif"], ["All files", '*']] |
-defaultextension => filetype | デフォルト拡張子 | '.txt', '.gif' |
-initialdir => directory | 初めのディレクトリを指定 | "$ENV{"HOME"}" |
-title => title | ウィンドウのタイトル | "File Open" |
GUIアプリのほとんどで,操作や終了の確認を求めたりするときに出る,「はい」「いいえ」「キャンセル」などのボタンを選択させるダイアログボックスを出します.
書式: $response = $widget->messageBox(?options?)
主なオプション
オプション | 説明 | オプション値の例 |
-default => name | デフォルトでフォーカスされるボタン | 'Cancel', 'Ok' |
-icon => iconImage | Tk組み込みのビットマップ名 | 'info', 'warning', 'question', 'questhead' |
-message => string | 表示するメッセージ | "本当に終了しますか?" |
-title => title | ウィンドウのタイトル | "Warning " |
-type => predefinedtype | 定義済みのボタンタイプを選ぶ | 'AbortRetryIgnore', 'Ok', 'OkCancel', 'RetryCancel', 'YesNo', 'YesNoCancel' から一つ |
補足:
さらにカスタマイズしたダイアログボックスを作るには,
を用いるか,TopLevelウィジェットで新しいウィンドウを開き,自前でダイアログボックスを作る方法がある.詳しくは,QuickReferenceを参照のこと.
サンプル: 画像ビューワ
#!/usr/bin/perl -w use Tk; $mw = MainWindow->new; $mw->protocol('WM_DELETE_WINDOW', \&Exit); $top = $mw->Frame() ->pack(-fill=>'x'); $bottom = $mw->Frame() ->pack(-fill=>'x'); $top->Label(-text=>"画像ファイル:") ->pack(-side=>'left'); $ent = $top->Entry(-background=>'white', -width=>35) ->pack(-side=>'left', -fill=>'both'); $but = $top->Button(-text=>"参照", -command=>\&Open_file ) ->pack(-side=>'left'); $bottom->Button(-text=>"終了", -width=>10, -command=> \&Exit) ->pack(-side=>'right', -anchor=>'e', -fill=>'x'); $bottom->Button(-text=>"プレビュ", -width=>10, -command=> \&Exec_preview) ->pack(-side=>'right', -anchor=>'e', -fill=>'x'); MainLoop; sub Open_file { my $types = [ ["GIF Image" , '.gif' ], ["JPEG Image", ['.jpg', 'jpeg']], ["All Files" , '*' ] ]; my $filename = $mw->getOpenFile(-filetypes=>$types); if ($filename ne "") { $ent->delete(0, 'end'); } } sub Kill_proc { my $proc = $_[0]; my $pid = `/sbin/pidof $proc`; if ($pid !~ /^\s*$/) { system "/bin/kill $pid"; } } sub Exec_preview { my $file = $ent->get; if (-e $file) { Kill_proc("ee"); system("ee $file &"); } else { $but->flash; $ent->bell; } } sub Exit { $mw->bell; my $answer = $mw->messageBox(-title => "Warning", -icon => 'warning', -type => 'OkCancel', -default => 'Cancel', -message => "終了しますか?"); if ($answer eq 'Ok') { Kill_proc("ee"); exit; } else { return; } }