リスト : 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 を選択
エントリーで身長を入力
リターンキーで更新