Perl/Tkで変数名を使って一気にウィジェットを配置する方法

このQ&Aのポイント
  • Perl/Tkでforやforeachを使って、ウィンドウ上にウィジェットを一括配置することは可能です。
  • しかし、作成したウィジェットに名前をつけて参照する方法はありません。
  • より詳しい方法を知りたい場合は、以下の手順を参考にしてください。
回答を見る
  • ベストアンサー

Perl/Tkで変数名を使って一気にウィジェットを配置できますか

Perl/Tkでforやforeachを使って、ウィンドウ上にウィジェットを一括配置したいのです。 my $window = new MainWindow; for (my $i=0; $i<10; ++$i) {$window->Entry->pack;} みたいにして一括作成はできるのですが、作ったウィジェットを後で使うために、これらのウィジェット名に名前をつけながら配置したいです。 上記のコードの場合、後から ent1->get; のように参照できるようにしたいと思っております。 こういったことは可能でしょうか。またその方法があれば手順を示していただけると助かります。 詳しい人には馬鹿にされそうな文ですが、 $ent$i = $window->Entry->pack;では駄目でした。。。

  • Yonah
  • お礼率100% (6/6)
  • Perl
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

$window->Entry でウィジェットオブジェクトが返ってきそうなので, 無理すれば for my $i (0..9) { (${ent$i} = $window->Entry)->pack; } とか書けるのかもしれんけど, 普通は配列を使うような気がする.

Yonah
質問者

お礼

配列で実行できました!拙いコードですがご笑覧下さい。 #!/usr/bin/perl use strict; use warnings; use Tk; my $window = new MainWindow; my @ents = (qw/$ent0 $ent1 $ent2 $ent3 $ent4 $ent5 $ent6 $ent7 $ent8 $ent9/); foreach (@ents) {$_ = $window->Entry->pack;} #次の行で属性をいじってみるテスト foreach (@ents) {$_->configure(-width=>80);} #OK! MainLoop; なお、「無理すれば」手順はCan't call method "ent" without a package or object referenceで不可でした。 とりあえずプログラム自体を動かすことは配列でいけそうです。 ありがとうございます。_(_ _)_ PerlとTkは機能と比較した場合、Web資料や書籍が他言語より少ないように思えるので、他にもご意見のある方がいればしばしお待ちしております。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

や, それは「変数 $ent? に入れているわけじゃない」ことを理解してるんだよね? まあ, 結果的にできてればいいかもしれんけど....

Yonah
質問者

お礼

下のように修正です。Tacosanさん突っ込みありがとうございます。 ******** #!/usr/bin/perl use strict; use warnings; use Tk; my $window = new MainWindow; my @ents; for (1..9) {@ents[$_] = $window->Entry->pack;} #↓ひとまず参照できた。。。仮に[5]を変更した $ents[5]->configure(-width=>40); MainLoop; ******** 多分、先の qw/$ent?並び/ はなんの意味も成さなかったのかなと思っています。 糞コードしか書けませんので、しばらく何か突っ込みがある方はよろしくお願いします。

Yonah
質問者

補足

こんにちは。 これは前回のお礼を投稿した後、別のコードを書いていて、なんかおかしいなあと思ったところ、どうも$ent?ではなく$ent[?]に入っているようでした…(- -;) なので、Tacosanさんの>>1にお礼したときに僕が書いたコードがおかしいという認識は今はありますが、先に全部動作する状態にして後でマシにしていこうと思っています。 Perlは始めて半月強なため混乱気味でよくわからないので、もう少しうなって、まとまったらお礼と一緒にコードを掲載しようかと思います。

関連するQ&A

  • Perl/Tkで、Entryが上手く扱えません

    GUIプログラミングを始めようと思い、Perlを少しかじっていることもあり、Perl/Tkを選びました。CentOS5にソース(Tk-804.027.tar.gz)からインストールを行い、オライリーの「入門Perl/Tk」に沿って勉強しています。 順調に各ウィジェットを使えていますが、Entryに関しては上手くいっていません。 以下のようなプログラムで問題が起こります。 01 #!/usr/bin/perl -w 02 03 use Tk; 04 05 $buffer = ""; 06 07 $top = MainWindow->new(); 08 09 $top->Entry( -textvariable => \$buffer )->pack(); 10 $top->Button(-text => "EXIT", -command => sub { exit })->pack(); 11 MainLoop; 状況としては、9行目で作成されるエントリが文字入力を受け付けてくれないのです。 しかし、10行目のボタンを作成するプログラムを削除すると入力を受け付けてくれます。 widgetコマンドで見られるサンプルも一部は入力できますが、すべてのエントリに入力できるものはありませんでした。 どなたか原因のわかる方、よろしくお願いします。

  • Perl/Tk Entry に対して見出しを付けたい

    Win-XP,Active-Perl(v5.8.6)利用です。 複数のインプットボックスを持つ、 ┌────────────┐ │   ┌───────┐│ │品名:│       ││ │   └───────┘│ │   ┌───────┐│ │科目:│       ││ │   └───────┘│ │   ┌───────┐│ │価格:│       ││ │   └───────┘│ │ ┌──┐┌─────┐│ │ │OK││キャンセル││ │ └──┘└─────┘│ └────────────┘ こんな感じのウィンドウを作りたいのですが、 (図が崩れているかも知れませんが大体のイメージで・・・) ======================================== use Tk; $top = new MainWindow; $arg[0] = $top->Entry(-title=>'品名:')->pack; $arg[1] = $top->Entry(-title=>'科目:')->pack; $arg[2] = $top->Entry(-title=>'価格:')->pack; $b[0] = $top->Button(-text=>'OK',-command=> [\&exec,\@arg])->pack; $b[1] = $top->Button(-text=>'キャンセル',-command=> [\&exec,(-1)])-pack; ======================================== unknown option "-title" at C:\Perl\site\lib/Tk/Widget.pm Entryに対するオプションが分かりませんでした。 もしくは、Label や Message を組み合わせて実現するものでしょうか。 あと、実際に図のような配置でフォームを作りたい場合、 Buttonの部分の書き方はどのようにすれば良いですか? 以上、ご存知の方、ご教示よろしくお願い致します。

    • ベストアンサー
    • Perl
  • perl 配列名変数指定するには

    perlプログラムで for文で ループ分の配列定義するには どうしたらよいですか? 下記のようなことができないかと 考えております。 for(my $i = 0; $i < $file_no; $i++){ my @{"segments$i"} =(); #配列定義 my ${"line$i"}="";     #変数定義 my %{"hash$i"}= ();    #ハッシュ定義 open(ARG1,$ARGV[$i]); while(<ARG1>){ ${'line'.$i} = $_; chomp ${'line'.$i}; @{'segments'.$i} = split(/\t/,${'line'.$i});        ${'hash'.$i}{${'segments'.$i}[0]}=${'segments'.$i}[1];     } close(ARG1); } #下記で、その後 各ハッシュに設定したデータをもとに いろいろ計算したい foreach my $a (keys %{'hash'.$i}){ ・・・ } 今は、Can't declare array dereference in "my" at test.pl line XX, near "} =" と 配列定義でエラーとなり処理できません。

    • ベストアンサー
    • Perl
  • perl/tk のScrollbarについて

    下のように縦にボタンを100個配置した場合、どのようにスクロールバーを設定するのですか?表現がまずいかもしれませんが、MainWindowの縦にスクロールバーを配置したいのですが、方法がわかりません。 -------------------------------------------------------- #!c:\perl\bin\perl.exe use Tk; $top = MainWindow->new(); #ボタン $button_1 = $top->Button( -text => "ボタン1",-command => \&filemake ) ->grid(); $button_2 = $top->Button( -text => "ボタン2",-command => \&filemake ) ->grid(); $button_3 = $top->Button( -text => "ボタン3",-command => \&filemake ) ->grid(); $button_4 = $top->Button( -text => "ボタン4",-command => \&filemake ) ->grid(); $button_5 = $top->Button( -text => "ボタン5",-command => \&filemake ) ->grid(); $button_6 = $top->Button( -text => "ボタン6",-command => \&filemake ) ->grid(); . . . $button_99 = $top->Button( -text => "ボタン99",-command => \&filemake ) ->grid(); $button_100 = $top->Button( -text => "ボタン100",-command => \&filemake ) ->grid(); MainLoop();

    • ベストアンサー
    • Perl
  • 【Perl/Tk】Photo メソッド に渡すファイル名に2バイト文字コードを指定するには?

    Windows-XP上で、ActivePerl This is perl, v5.8.6 built for MSWin32-x86-multi-thread を使用しています。 次のようなPerl/Tk スクリプトで、例えば、デスクトップ上にあるJPG画像ファイルを キャンバスに表示させようとしますが、2バイト文字コードを含むファイル名やパス名だとエラーが出て上手く行きません。 use Tk; use Tk::JPEG; my $fn = $ARGV[0]; my $mw = MainWindow->new; my $cv = $mw->Canvas()->pack(); if(-e $fn){ my $ph = $mw->Photo(-format=>'jpeg',-file=>$fn); $cv->createImage(64,64,-image=>$ph); } MainLoop; ------------------------------------------------- エラー例: Cannot open 'C:\Documents and Settings\guest\テつデテつステつクテつトテつッテつプ\aaa.jpg' in mode 'r' at C:\Perl\site\lib/Tk/Image.pm line 21. 2バイト文字コードを含まないファイル名(例:C:\aaa.jpg)などを指定した場合は、 無事にキャンバスに画像が表示されています。 また、ファイル名に2バイト文字コードが含まれる場合でも、 ifの判定文でファイル存在確認が機能していますので、 Photoメソッド側の問題と思われるのですが、 他に、このファイル名をutf8やeucjpへencode/decodeしてみるなど色々なパターンで試してみたのですが、 どうやってもエラーになってしまいます。 Photoメソッドには、そもそも2バイト文字コードを含むファイル名の利用は出来ない仕様でしょうか。 その他、よい回避方法などがありましたら、お教えください。 よろしくお願い致します。

  • perl/tk のScrollbarとジオメトリー

    Tk::Tilerを教えてもらってスクロールバーを配置できたのですが、ジオメトリーマネージャでpack,gridを使って、配置できる方法を知りたいのですが。 ----------------------------------------------- use Tk; use Tk::Tiler; $top = MainWindow->new(); $top0 = $top->Tiler()->pack(); $top->AddScrollbars($top0); $top->configure(\'-scrollbars\' => \'w\'); #ボタン $button_1 = $top0->Button( -text => \"1\")->grid(); $button_2 = $top0->Button( -text => \"2\")->grid(); .... $button_6 = $top0->Button( -text => \"6\")->grid(); $button_11 = $top0->Button( -text => \"11\" ); $button_12 = $top0->Button( -text => \"12\" ); $button_13 = $top0->Button( -text => \"13\" ); ...... $button_16 = $top0->Button( -text => \"16\" ); $button_11->grid($button_12,....,$button_16); $button_21 = $top0->Button( -text => \"21\" ); $button_22 = $top0->Button( -text => \"22\" ); ........ $button_26 = $top0->Button( -text => \"26\" ); $button_21->grid($button_22,......,$button_26); $top0->Manage($button_1,$button_2,$button_3,$button_4,$button_5,$button_6); $top0->Manage($button_11,$button_12,$button_13,$button_14,$button_15,$button_16); $top0->Manage($button_21,$button_22,$button_23,$button_24,$button_25,$button_26); $top0->update; $top0->focus; MainLoop();

    • ベストアンサー
    • Perl
  • Perl 変数 連番 for

    いつもお世話になっております。 for文?の使い方を教えてほしいです。 my $test1 = $form->param('test1'); my $test2 = $form->param('test2'); my $test3 = $form->param('test3'); my $test4 = $form->param('test4'); my $test5 = $form->param('test5'); このようにtestは同じでその後ろに連番がついている場合の変数なのですが これが何十個もあれば、記述するのも管理するのも、少し面倒です。 それでfor文を利用し、 for ($i= 1; $i < 31; $i++){ この中の記述 } ソースを短縮したいのですが、 「この中の記述」がわかりません・・・ ご教示お願い致します。

    • ベストアンサー
    • Perl
  • Perl/TkのWWW::MechanizeのGET失敗時の動作

    WindowsにてPerl/Tkを使用しております。 WWW::MechanizeのGETを使って(おそらく)404 not foundを受信した後の動作の制御の仕方がわかりません。 下記ソースを実行して貰うとわかると思うのですが、 GETが失敗したら即sub関数内をreturnしてしまいます。 #!/usr/bin/perl use Tk; use Encode; use WWW::Mechanize; my $mech = new WWW::Mechanize(autocheck => 1); my $main = MainWindow->new; $main->Button(-text=>decode("cp932",'取得'),-font => ["MS ゴシック", 12], -command => \&get_source) ->grid(-row=>0,-column=>0); my $list = $main->Listbox(-selectmode=>'single',-font => ["MS ゴシック", 12]); $list->grid(-row=>1,-column=>0,-sticky=>'ew'); MainLoop; sub get_source{ my $uri = "http://www.google.co.jp/abcd"; $mech->get($uri); print "get_source end\n"; } 上記の「print "get_source end\n";」は実行されません。 データ取得先サイトがメンテナンス中は404になるようで困っています。 イメージでは「$mech->get($uri) or die "get_source error";」みたいな感じにエラーの場合の時の処理を記述したいのです。 ご存知の方いましたらご教示願います。 使用環境 ・Windows XP Professional SP3 ・Active Perl v5.8.6 for MSWin32-x86-multi-thread build811 ・自作PC(CPU:Athlon 64 3800+)

    • ベストアンサー
    • Perl
  • C#デストラクタが走る理由がわからない(初心者)

    WPF C# アプリを初めて組んでいます。 MainWindowクラスで、publicなクラス変数配列(myclass)を定義し、 MainWindowのコンストラクタ(もしくはLoadedイベント)で、上記クラス変数にインスタンスを生成しています。 そのインスタンスを、MainWindows内のコントロールイベント(Button_Click)で参照しようとするとNullとなっておりました。 MainWindowのコンストラクタ(もしくはLoadedイベント)完了後に、デストラクトが走っているようです。 どこからも参照されていなければGCが走りデストラクタされるのはわかるのですが、 この場合、MainWindowクラスのメンバにクラス変数を追加し、そこにインスタンスを生成しています。よって、MainWindow(つまりアプリが)が終了するまでインスタンスが参照されているため、 デストラクタが走らないのではないかと考えておりました。 ですが、上記の通り、MainWindowのコンストラクタ(もしくはLoadedイベント)後には、MyClassデストラクタが走ってしまいます。この辺を教えていただけないでしょうか。 また、下記のように、Clickでインスタンスを参照するにはどうすればよいでしょうか。 public partial class MainWindow : Window {     MYClass []myclass;     public MainWindow()     {         InitializeComponent();         //ファイル読み込み(記載省略)         for(i=0; i<ファイル読み込み数;i++)         {             myclass[i] = new myclass(ファイル読み込みデータ);         }     }     private void Button_Click(object sender, RoutedEventArgs e)     {         for(int i=0;i<myclass.Length;i++) ←ここに来る前にすでにMyClassのデストラクタが走っており、nullとなっている         {             data = myclass[i].data;         }     } }

  • ActivePerl/Tk で dumpが勝手に

    perl, v5.8.6で、Perl/Tkを利用した環境です。 従来は、Windows-XP(x32)で利用していて、特に問題なかったのですが、 同じ環境をWindows7(x32)に導入して利用しようとしたところ、 Menu メソッド呼び出しのところで、ちょうど Devel::peekのdumpで表示させた ような内容のものが、DOSプロンプト上に出てしまいます。 ↓こちらの記事(英文)に書かれていることも試してみましたが、解決できませんでした。 http://community.activestate.com/forum-topic/perl-tk-cause-warning Windows7だからということではなさそうですが、 この表示が出てしまう原因、出さなくする方法について、教えてください。 何かご存知の方、よろしくお願い致します。 サンプルスクリプト: test.pl ----------------------------- use strict; use Tk; my $mw = MainWindow->new(); my $menu = $mw->Menu(); MainLoop; ----------------------------- このスクリプトをWindows7環境上で実行すると、 MainWindowのダイアログは画面に正しく表示されていますが、 DOSプロンプトで、下記のメッセージも出てしまいます。 ⇒4行目(my $menu = $mw->Menu();)をコメントアウトするとこの表示は出ません。 ----------------------------- C:\Perl\Tk\Win7>test.pl @ 535 not utf8 SV = PV(0x3d4f9d0) at 0x3d53870 REFCNT = 2 FLAGS = (POK,pPOK,UTF8) PV = 0x3d0d9e4 "\203\201\203C\203\212\203I 9"\0 [UTF8 "\x{c1}C\x{c3}C\x{ca}\x{283}\x{c9}I 9"] CUR = 10 LEN = 11 SV = PVMG(0x214bf74) at 0x3d53870 REFCNT = 2 FLAGS = (SMG,POK,pPOK,UTF8) IV = 0 NV = 0 PV = 0x3d0d9e4 "\203\201\203C\203\212\203I 9"\0 [UTF8 "\x{c1}C\x{c3}C\x{ca}\x{283}\x{c9}I 9"] CUR = 10 LEN = 11 MAGIC = 0x3d5d5a4 MG_VIRTUAL = &PL_vtbl_utf8 MG_TYPE = PERL_MAGIC_utf8(w) MG_LEN = 10

    • ベストアンサー
    • Perl

専門家に質問してみよう