リスト : スピンボックス
use strict;
use warnings;
use Tkx;
my $top = Tkx::widget->new('.');
Tkx::option_add('*font', ['', 12]);
my $s1 = $top->new_spinbox(-from => 1, -to => 10, -increment => 1, -width => 10);
my $s2 = $top->new_spinbox(-from => 1, -to => 5, -increment => 0.5, -format => '%05.2f', -width => 10);
my $s3 = $top->new_spinbox(-values => ['apple', 'banana', 'cherry', 'grape', 'orange'], -state => 'readonly', -width => 10);
$s1->g_pack(-padx => 5, -pady => 5);
$s2->g_pack(-padx => 5, -pady => 5);
$s3->g_pack(-padx => 5, -pady => 5);
Tkx::MainLoop();
1.
2.
3.
| N.M | N 行の M 文字目 |
| @x,y | テキスト内の (x,y) の位置にある文字 |
| end | テキスト末尾 |
| マーク名 | その名前のマークをつけた位置 |
| タグ名.first | その名前のタグの最初の位置 |
| タグ名.last | その名前のタグの最後の位置 |
| +Nchars, -Nchars | そこから N 文字先、手前 |
| +Nlines, -Nlines | そこから N 行先、手前 |
| linestart, lineend | その行の先頭、末尾 |
| wordstart, wordend | その単語の先頭、末尾 |
リスト : テキストファイルを表示する
use strict;
use warnings;
use utf8;
use File::Basename;
use Tkx;
# メインウィンドウ
my $top = Tkx::widget->new('.');
Tkx::option_add('*font', ['Terminal', 10]);
Tkx::option_add('*tearOff', 0);
$top->g_wm_title('Text Viewer');
# テキストウィジェット
my $t0 = $top->new_text(-wrap => 'word');
$t0->g_pack(-side => 'left', -expand => 1, -fill => 'both');
# スクロールバー
my $sb = $top->new_scrollbar(-command => [$t0, 'yview']);
$sb->g_pack(-side => 'left', -fill => 'y');
$t0->configure(-yscrollcommand => [$sb, 'set']);
# ファイルの読み込み
my $path_name = '.';
sub load_file {
my $filename = Tkx::tk___getOpenFile(-filetypes => "{Perl {.pl}} {Text {.txt}} {ALL {*}}",
-initialdir => $path_name );
if ($filename) {
$path_name = dirname($filename) . '/';
# 前のドキュメントを消去
$t0->delete('1.0', 'end');
# ファイルのリード
open my $in, "<:utf8", "$filename" or die "Can't open $filename\n";
while (<$in>) {
$t0->insert('end', $_);
}
close($in);
$t0->g_focus();
}
}
# メニューの設定
my $m = $top->new_menu(-type => 'menubar');
$top->configure(-menu => $m);
my $m1 = $m->new_menu;
$m->add_cascade(-menu => $m1, -label => 'File', -under => 0);
$m1->add_command(-label => 'Open', -under => 0, -command => \&load_file);
$m1->add_separator;
$m1->add_command(-label => 'Exit', -under => 0, -command => sub { exit; });
Tkx::MainLoop();
テキストウィジェット
ファイルの表示
リスト : 行番号の挿入と削除
use strict;
use warnings;
use utf8;
use File::Basename;
use Tkx;
# メインウィンドウ
my $top = Tkx::widget->new('.');
Tkx::option_add('*font', ['Terminal', 10]);
Tkx::option_add('*tearOff', 0);
$top->g_wm_title('Text Viewer');
# テキストウィジェット
my $t0 = $top->new_text(-wrap => 'word');
$t0->g_pack(-side => 'left', -expand => 1, -fill => 'both');
# スクロールバー
my $sb = $top->new_scrollbar(-command => [$t0, 'yview']);
$sb->g_pack(-side => 'left', -fill => 'y');
$t0->configure(-yscrollcommand => [$sb, 'set']);
# 行番号の処理
my $number_flag = 0;
sub change_number {
my $line = $t0->index('end');
my $i;
if ($number_flag) {
for ($i = 1; $i < $line; $i++) {
$t0->insert("$i.0", sprintf("%6d:", $i));
}
} else {
for ($i = 1; $i < $line; $i++) {
$t0->delete("$i.0", "$i.7");
}
}
}
# ファイルの読み込み
my $path_name = '.';
sub load_file {
my $filename = Tkx::tk___getOpenFile(-filetypes => "{Perl {.pl}} {Text {.txt}} {ALL {*}}",
-initialdir => $path_name );
if ($filename) {
$path_name = dirname($filename) . '/';
# 前のドキュメントを消去
$t0->delete('1.0', 'end');
# ファイルのリード
open my $in, "<:utf8", "$filename" or die "Can't open $filename\n";
while (<$in>) {
$t0->insert('end', $_);
}
close($in);
$t0->g_focus();
&change_number if $number_flag;
}
}
# メニューの設定
my $m = $top->new_menu(-type => 'menubar');
$top->configure(-menu => $m);
my $m1 = $m->new_menu;
$m->add_cascade(-menu => $m1, -label => 'File', -under => 0);
$m1->add_command(-label => 'Open', -under => 0, -command => \&load_file);
$m1->add_separator;
$m1->add_checkbutton(-label => 'Number', -under => 0,
-variable => \$number_flag, -command => \&change_number);
$m1->add_separator;
$m1->add_command(-label => 'Exit', -under => 0, -command => sub { exit; });
Tkx::MainLoop();
$m1->add_checkbutton(-label => 'Number', -under => 0,
-variable => \$number_flag, -command => \&change_number);
行番号の表示
| mark_set(markname, index); | マークの設定 |
| mark_unset(*markname); | マークの削除 |
| mark_names(); | 定義されているすべてのマークを返す |
| mark_gravity(markname, left_or_right); | マークのつき方を left と right で指定 |
| mark_next(index); | index より後ろにあるマークを返す |
| mark_previous(index); | index より前にあるマークを返す |
$t0->mark_set('first', '1.3');
$t0->insert('first', '1234');
$t0->insert('insert', 'string');
| tag_add(tagname, index1, index2); | 指定した範囲に対して、タグ tagname を設定 |
| tag_delete(*tagname); | タグの削除 |
| tag_names(index); | index の位置にある文字と関連するすべてのタグを返す |
| tag_cget(tagname, option); | タグ tagname のオプションの値を返す |
| tag_configure(tagname, option, value); | タグ tagname のオプションを設定する |
| tag_bind(tagname, event, callback); | タグ tagname にバインドを設定する |
リスト : 行番号に色をつける
sub change_number {
my $line = $t0->index('end');
my $i;
if ($number_flag) {
for ($i = 1; $i < $line; $i++) {
$t0->insert("$i.0", sprintf("%6d:", $i), 'LINENUM');
}
} else {
for ($i = 1; $i < $line; $i++) {
$t0->delete("$i.0", "$i.7");
}
}
}
$t0->tag_configure('LINENUM', -foreground => 'red');
$t0->insert(index, string, tagname, ...);
行番号を赤く表示する
| -window | ウィジェット名 |
| -create | ウィジェットを生成するコマンドを指定(window を指定しない場合のみ有効) |
| -align | 上下方向の揃え指定 (baseline, top, bottom, center) |
| -stretch | 上下方向の引き延ばし |
| -padx, -pady | スペースの指定 |
リスト : ラベル (画像) の挿入
use strict;
use warnings;
use utf8;
use File::Basename;
use Tkx;
# メインウィンドウ
my $top = Tkx::widget->new('.');
Tkx::option_add('*font', ['Terminal', 10]);
Tkx::option_add('*tearOff', 0);
$top->g_wm_title('Text Viewer');
# テキストウィジェット
my $t0 = $top->new_text(-wrap => 'word');
$t0->g_pack(-side => 'left', -expand => 1, -fill => 'both');
$t0->tag_configure('LINENUM', -foreground => 'red');
# スクロールバー
my $sb = $top->new_scrollbar(-command => [$t0, 'yview']);
$sb->g_pack(-side => 'left', -fill => 'y');
$t0->configure(-yscrollcommand => [$sb, 'set']);
# 行番号の処理
my $number_flag = 0;
sub change_number {
my $line = $t0->index('end');
my $i;
if ($number_flag) {
for ($i = 1; $i < $line; $i++) {
$t0->insert("$i.0", sprintf("%6d:", $i), 'LINENUM');
}
} else {
for ($i = 1; $i < $line; $i++) {
$t0->delete("$i.0", "$i.7");
}
}
}
# ファイルの読み込み
my $path_name = '.';
sub load_file {
my $filename = Tkx::tk___getOpenFile(-filetypes => "{Perl {.pl}} {Text {.txt}} {ALL {*}}",
-initialdir => $path_name );
if ($filename) {
$path_name = dirname($filename) . '/';
# 前のドキュメントを消去
$t0->delete('1.0', 'end');
# ファイルのリード
open my $in, "<:utf8", "$filename" or die "Can't open $filename\n";
while (<$in>) {
$t0->insert('end', $_);
}
close($in);
$t0->g_focus();
&change_number if $number_flag;
}
}
# 画像を選んで挿入する
my $image_path = '.';
sub insert_image {
my $image_name = Tkx::tk___getOpenFile(-filetypes => "{GIF {.gif}} {PPM {.ppm}} {ALL {*}}",
-initialdir => $image_path);
if ($image_name) {
my $image = Tkx::image_create_photo(-file => $image_name);
my $label = $top->new_label(-image => $image, -relief => 'raised', -borderwidth => 4);
$t0->window_create('insert', -window => $label, -align => 'baseline');
$image_path = dirname($image_name) . '/';
}
}
# メニューの設定
my $m = $top->new_menu(-type => 'menubar');
$top->configure(-menu => $m);
my $m1 = $m->new_menu;
$m->add_cascade(-menu => $m1, -label => 'File', -under => 0);
$m1->add_command(-label => 'Open', -under => 0, -command => \&load_file);
$m1->add_separator;
$m1->add_checkbutton(-label => 'Number', -under => 0,
-variable => \$number_flag, -command => \&change_number);
$m1->add_separator;
$m1->add_command(-label => 'Image', -under => 0, -command => \&insert_image);
$m1->add_separator;
$m1->add_command(-label => 'Exit', -under => 0, -command => sub { exit; });
Tkx::MainLoop();
$m1->add_command(-label => 'Image', -under => 0, -command => \&insert_image);
Tcl/Tk Logo を挿入
テキストの編集
| -image | 表示する画像 |
| -name | 画像を参照するための名前を付ける |
| -align | 上下方向の揃え指定(baseline, top, bottom, center) |
| -padx, -pady | スペースの指定 |
リスト : 画像の挿入
sub insert_image {
my $image_name = Tkx::tk___getOpenFile(-filetypes => "{GIF {.gif}} {PPM {.ppm}} {ALL {*}}",
-initialdir => $image_path);
if ($image_name) {
my $image = Tkx::image_create_photo(-file => $image_name);
$t0->image_create('insert', -image => $image, -align => 'baseline');
$image_path = dirname($image_name) . '/';
}
}
Tcl/Tk Logo を挿入