リスト : Ttk Widget の簡単な使用例
use strict;
use warnings;
use Tkx;
my $top = Tkx::widget->new('.');
Tkx::ttk__style_configure('.', -font => ['', 12]); # Ttk Widget のフォントの大きさを 12 に変更
my $theme;
if (@ARGV) {
$theme = shift;
Tkx::ttk__style_theme_use($theme);
} else {
$theme = Tkx::ttk__style_theme_use();
}
# ラジオボタン用
my $v = 0;
# チェックボタン用
my @opts = (0, 1, 0, 1);
# テーマ表示用ラベル
my $la = $top->new_ttk__label(-text => $theme);
$la->g_pack;
# ボタン類の配置
my $f0 = $top->new_ttk__labelframe(-text => 'Buttons');
my $f1 = $top->new_ttk__labelframe(-text => 'CheckButtons');
my $f2 = $top->new_ttk__labelframe(-text => 'RadioButtons');
foreach my $x (0 .. 3) {
$f0->new_ttk__button(-text => "button $x")->g_pack();
$f1->new_ttk__radiobutton(-text => "radiobutton $x", -value => $x, -variable => \$v)->g_pack;
$f2->new_ttk__checkbutton(-text => "checkbutton $x", -variable => \$opts[$x])->g_pack;
}
$f0->g_pack(-padx => 5, -pady => 5, -side => 'left');
$f1->g_pack(-padx => 5, -pady => 5, -side => 'left');
$f2->g_pack(-padx => 5, -pady => 5, -side => 'left');
Tkx::MainLoop();



リスト : Ttk Widget の簡単な使用例
use strict;
use warnings;
use utf8;
use Tkx;
my $top = Tkx::widget->new('.');
Tkx::ttk__style_theme_use('winnative');
Tkx::ttk__style_configure('test1.TLabel', -font => ['遊ゴシック', 12]);
Tkx::ttk__style_configure('test2.TLabel', -font => ['遊ゴシック', 14], -foreground => 'blue');
Tkx::ttk__style_configure('test3.TLabel', -font => ['遊ゴシック', 16, 'italic'], -foreground => 'green');
my $str = 'Hello, world, こんにちは世界';
$top->new_ttk__label(-text => $str, -style => 'test1.TLabel')->g_pack;
$top->new_ttk__label(-text => $str, -style => 'test2.TLabel')->g_pack;
$top->new_ttk__label(-text => $str, -style => 'test3.TLabel')->g_pack;
Tkx::MainLoop();

$widget->new_ttk__combobox(-option => value, ...);
| -height | リストボックスの行数 |
| -width | エントリーの文字数 |
| -state | 'normal' : エントリーとリストボックスの両方から入力できる 'readonly' : リストボックスのみ有効 'disabled' : どちらも無効 |
| -values | リストボックスに表示するデータを格納した文字列 (または配列) |
リスト : コンボボックスの使用例
use strict;
use warnings;
use utf8;
use Time::Local ('timelocal');
use Tkx;
my $top = Tkx::widget->new('.');
Tkx::ttk__style_configure('.', -font => ['', 14]);
my $label_buff = '';
my $year_buff = '1970';
my $month_buff = '1';
my $day_buff = '1';
my $la = $top->new_ttk__label(-textvariable => \$label_buff);
$la->g_pack;
$top->new_ttk__label(-text => " 年: ")->g_pack(-side => 'left');
my $year_cb = $top->new_ttk__combobox(-textvariable => \$year_buff, -width => 8, -values => [(1970 .. 2031)]);
$year_cb->g_pack(-side => 'left');
$top->new_ttk__label(-text => " 月: ")->g_pack(-side => 'left');
my $month_cb = $top->new_ttk__combobox(-textvariable => \$month_buff, -width => 8, -height => 12, -values => [(1 .. 12)]);
$month_cb->g_pack(-side => 'left');
$top->new_ttk__label(-text => " 日: ")->g_pack(-side => 'left');
my $day_cb = $top->new_ttk__combobox(-textvariable => \$day_buff, -width => 8, -values => [(1 .. 31)]);
$day_cb->g_pack(-side => 'left');
# 入力データの表示
sub get_item {
my $y = $year_cb->get();
my $m = $month_cb->get();
my $d = $day_cb->get();
eval {
timelocal(0, 0, 0, $d, $m - 1, $y - 1900);
};
if ($@) {
$label_buff = "Input Error";
} else {
$label_buff = "$y 年 $m 月 $d 日";
}
}
$year_cb->g_bind('<<ComboboxSelected>>', \&get_item);
$year_cb->g_bind('<Return>', \&get_item);
$month_cb->g_bind('<<ComboboxSelected>>', \&get_item);
$month_cb->g_bind('<Return>', \&get_item);
$day_cb->g_bind('<<ComboboxSelected>>', \&get_item);
$day_cb->g_bind('<Return>', \&get_item);
get_item();
Tkx::MainLoop();
初期状態
日付の入力
エラー
リスト : ノートブックの使用例 (1)
use strict;
use warnings;
use Tkx;
my $top = Tkx::widget->new('.');
Tkx::ttk__style_configure("TButton", -font => ['', 16]);
Tkx::ttk__style_configure("TRadiobutton", -font => ['', 16]);
Tkx::ttk__style_configure("TCheckbutton", -font => ['', 16]);
my $v = 0;
my @opts = (1, 1, 1, 1);
# ノートブック
my $nb = $top->new_ttk__notebook;
$nb->g_pack;
# ボタン類の配置
my $f0 = $top->new_ttk__frame;
my $f1 = $top->new_ttk__frame;
my $f2 = $top->new_ttk__frame;
foreach my $x (0 .. 3) {
$f0->new_ttk__button(-text => "button $x")->g_pack;
$f1->new_ttk__radiobutton(-text => "radiobutton $x", -value => $x, -variable => \$v)->g_pack;
$f2->new_ttk__checkbutton(-text => "checkbutton $x", -variable => \$opts[$x])->g_pack;
}
$nb->add($f0, -text => 'Button', -padding => 20);
$nb->add($f1, -text => 'Radio', -padding => 20);
$nb->add($f2, -text => 'Check', -padding => 20);
Tkx::MainLoop();
初期状態 (Button が選択されている)
Radio を選択
Check を選択
リスト : ノートブックの使用例 (2)
use strict;
use warnings;
use Tkx;
my $top = Tkx::widget->new('.');
Tkx::option_add('*Text.font', ['', 14]);
# 生成したテキストウィジェットの個数
my $text_count = 0;
# ノートブック
my $nb = $top->new_ttk__notebook;
# テキストウィジェットを追加
sub new_text {
my $tw = $top->new_text(-width => 40, -height => 10);
$text_count += 1;
$nb->add($tw, -text => "Memo$text_count");
$nb->select($tw);
}
# テキストウィジェットを削除
sub del_text {
$nb->forget('current');
}
# ボタン
my $fr = $top->new_ttk__frame;
$fr->new_ttk__button(-text => 'New', -command => \&new_text)->g_pack(-side => 'left');
$fr->new_ttk__button(-text => 'Del', -command => \&del_text)->g_pack(-side => 'left');
# 配置
$fr->g_pack(-anchor => 'w');
$nb->g_pack;
Tkx::MainLoop();
初期状態
Memo1 を生成
Memo2 を生成
Memo3 を生成して Memo2 を削除
リスト : プログレスバーの使用例
use strict;
use warnings;
use Tkx;
my $top = Tkx::widget->new('.');
my $var = 0;
my $pb1_id = '';
sub exec_pb1 {
$var++;
if ($var < 100) {
$pb1_id = Tkx::after(40, \&exec_pb1);
}
}
sub start_pb1 {
$var = 0;
exec_pb1();
}
sub stop_pb1 {
if ($pb1_id) {
Tkx::after_cancel($pb1_id);
$pb1_id = '';
}
}
my $pb1 = $top->new_ttk__progressbar(-length => 200, -variable =>\$var);
my $pb2 = $top->new_ttk__progressbar(-length => 200, -mode => 'indeterminate');
$pb1->g_pack;
my $f1 = $top->new_ttk__frame;
$f1->new_ttk__button(-text => 'Start', -command => \&start_pb1)->g_pack(-side => 'left');
$f1->new_ttk__button(-text => 'Stop', -command => \&stop_pb1)->g_pack(-side => 'left');
$f1->g_pack;
$pb2->g_pack;
my $f2 = $top->new_ttk__frame;
$f2->new_ttk__button(-text => 'Start', -command => [$pb2, 'start', 10])->g_pack(-side => 'left');
$f2->new_ttk__button(-text => 'Stop', -command => [$pb2, 'stop'])->g_pack(-side => 'left');
$f2->g_pack;
Tkx::MainLoop();
初期状態
途中経過
pb1 が終了し、pb2 を停止した状態
リスト : ツリービューの簡単な使用例 (1)
use strict;
use warnings;
use utf8;
use Tkx;
my $top = Tkx::widget->new('.');
Tkx::ttk__style_configure('.', -font => ['', 12]);
my $tview = $top->new_ttk__treeview(-columns => ['Name', 'Height']);
$tview->column('#0', -width => 50);
$tview->column('Name', -anchor => 'w', -width => 100);
$tview->column('Height', -anchor => 'e', -width => 50);
$tview->heading('#0', -text => "クラス");
$tview->heading('Name', -text => "名前");
$tview->heading('Height', -text => "身長");
my $id = $tview->insert('', 'end', -text => 'A');
$tview->insert($id, 'end', -values => ['Ada', 148.7]);
$tview->insert($id, 'end', -values => ['Hanna', 154.2]);
$tview->insert($id, 'end', -values => ['Miranda', 148.2]);
$id = $tview->insert('', 'end', -text => 'B');
$tview->insert($id, 'end', -values => ['Alice', 149.5]);
$tview->insert($id, 'end', -values => ['Janet', 147.8]);
$tview->insert($id, 'end', -values => ['Sara', 153.1]);
$id = $tview->insert('', 'end', -text => 'C');
$tview->insert($id, 'end', -values => ['Carey', 133.7]);
$tview->insert($id, 'end', -values => ['Linda', 154.6]);
$tview->insert($id, 'end', -values => ['Tracy', 138.2]);
$id = $tview->insert('', 'end', -text => 'D');
$tview->insert($id, 'end', -values => ['Ellen', 157.9]);
$tview->insert($id, 'end', -values => ['Maria', 159.1]);
$tview->insert($id, 'end', -values => ['Violet', 138.7]);
my $sb = $top->new_ttk__scrollbar(-orient => 'v', -command => [$tview, 'yview']);
$tview->configure(-yscrollcommand => [$sb, 'set']);
$tview->g_pack(-side => 'left');
$sb->g_pack(-side => 'left', -fill => 'y');
Tkx::MainLoop();
初期状態
クラス A を表示
クラス A と C を表示
全クラスを表示
set(item, column, value);
リスト : 身長の更新機能を追加
use strict;
use warnings;
use utf8;
use Tkx;
my $top = Tkx::widget->new('.');
Tkx::ttk__style_configure('.', -font => ['', 12]);
my $buff1 = ' ';
my $buff2 = '';
my $select_item = '';
my $fr = $top->new_ttk__frame;
$fr->new_ttk__label(-textvariable => \$buff1)->g_pack(-side => 'left');
my $e = $fr->new_ttk__entry(-width => 8, -textvariable => \$buff2);
$e->g_pack(-side => 'left');
$fr->g_pack(-anchor => 'w');
my $tview = $top->new_ttk__treeview(-columns => ['Name', 'Height']);
$tview->column('#0', -width => 50);
$tview->column('Name', -anchor => 'w', -width => 100);
$tview->column('Height', -anchor => 'e', -width => 50);
$tview->heading('#0', -text => "クラス");
$tview->heading('Name', -text => "名前");
$tview->heading('Height', -text => "身長");
my $id = $tview->insert('', 'end', -text => 'A');
$tview->insert($id, 'end', -values => ['Ada', 148.7]);
$tview->insert($id, 'end', -values => ['Hanna', 154.2]);
$tview->insert($id, 'end', -values => ['Miranda', 148.2]);
$id = $tview->insert('', 'end', -text => 'B');
$tview->insert($id, 'end', -values => ['Alice', 149.5]);
$tview->insert($id, 'end', -values => ['Janet', 147.8]);
$tview->insert($id, 'end', -values => ['Sara', 153.1]);
$id = $tview->insert('', 'end', -text => 'C');
$tview->insert($id, 'end', -values => ['Carey', 133.7]);
$tview->insert($id, 'end', -values => ['Linda', 154.6]);
$tview->insert($id, 'end', -values => ['Tracy', 138.2]);
$id = $tview->insert('', 'end', -text => 'D');
$tview->insert($id, 'end', -values => ['Ellen', 157.9]);
$tview->insert($id, 'end', -values => ['Maria', 159.1]);
$tview->insert($id, 'end', -values => ['Violet', 138.7]);
my $sb = $top->new_ttk__scrollbar(-orient => 'v', -command => [$tview, 'yview']);
$tview->configure(-yscrollcommand => [$sb, 'set']);
$tview->g_pack(-side => 'left');
$sb->g_pack(-side => 'left', -fill => 'y');
# 生徒の選択
sub select_student {
my @x = Tkx::SplitList($tview->selection());
my %d = Tkx::SplitList($tview->set($x[0])); # 配列を辞書に変換する
if (%d) {
$buff1 = sprintf("%8s", $d{'Name'});
$buff2 = $d{'Height'};
$select_item = $x[0];
} else {
$buff1 = ' ';
$buff2 = '';
$select_item = '';
}
}
# 身長の更新
sub update_height {
if ($select_item) {
$tview->set($select_item, 'Height', $buff2);
}
}
# バインディング
$e->g_bind('<Return>', \&update_height);
$tview->g_bind('<<TreeviewSelect>>', \&select_student);
Tkx::MainLoop();
Alice を選択
エントリーで身長を入力
リターンキーで更新