Tkを使ったサブルーチン実行前後の処理について

このQ&Aのポイント
  • サブルーチン実行前にポップアップを表示し、終了後にラベルの文字列を変更したいがうまくいかない。
  • Tkを使用してサブルーチンの前後で処理を行いたいが、問題が発生している。
  • ニーズに合わせて、サブルーチンの実行前後に処理を追加したいがエラーが発生する。
回答を見る
  • ベストアンサー

サブルーチン実行前後に処理

Tk を使って、あるサブルーチンの実行前にポップアップを出し、終了後にラベルの文字列を変えるという操作をしたいのですがうまくいきません。解決法をご教示願えましたらうれしいです。 use Tk; use Net::FTP; my $mw = MainWindow->new(-title => "Test"); my $comment = "Please wait ..."; my $label = $mw->Label(-textvariable => \$comment)->pack( ); MainLoop; &download; $comment = "Downloaded"; sub download{ open IDIN, "< id.txt" or die "Cannot open file"; my $ids = <IDIN>; close IDIN; my ($host,$idname,$pswd) = split(',',$ids); my $ftp = Net::FTP->new($host, Debug => 0) or die "Cannot connect to some.host.name: $@"; $ftp->login($idname,$pswd) or die "Cannot login ", $ftp->message; $ftp->get("sample.txt") or die "get failed ", $ftp->message; }

  • SE-1
  • お礼率71% (10/14)
  • Perl
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • yuuki0229
  • ベストアンサー率70% (33/47)
回答No.2

MainLoop前にupdateが使えることが分かりましたので 修正したものを投稿しておきます。 use Tk; use Net::FTP; my $mw = MainWindow->new(-title => "Test"); my $comment = "Please wait ..."; my $label = $mw->Label(-textvariable => \$comment)->pack( ); $mw->update; download(); $comment = "Downloaded"; MainLoop;

SE-1
質問者

お礼

ありがとうございました!本やウェブなど自分なりに調べたのですがずっとできませんでした。ほんとうに助かりました。

その他の回答 (1)

  • yuuki0229
  • ベストアンサー率70% (33/47)
回答No.1

直接的な原因はMainLoopより後ろはウィンドウを閉じる時まで実行されてないことです。 my $label = $mw->Label(-textvariable => \$comment)->pack(); my $button = $mw->Button(-text => "download", -command => \&download)->pack(); あとはdownload内で$commentを編集するか -command => sub{ download(); $comment="..."; } といったことをすれば実現できます。 起動時にdownload処理をさせることもできます。 MainLoopの直前で $mw->after(500 , \&download); としておけば500ms後にサブルーチン呼び出しを行います。その時にはウィンドウやlabelは表示済みですのでlabelを上書きする様が確認できると思います。 どこかに&downloadをコールバックとしてバインドすることでもできそうな気がしますが、分かりませんでした。

関連するQ&A

  • CGIでFTPファイル送信・受信がしたい

    CGIでファイル送信・受信を行いたいと考えてます。 言語は PERL で Net::FTP を利用しようと思ってます。 ローカルで実行するとファイル送信・受信できるのですが。。。。。 サーバにスクリプトを置いてブラウザから実行すると500のエラーが出ます。 自分的には手詰まりの状態です。 大きなファイルが送受信できるようなものを探しています。 なにか参考にできるサイトはございませんでしょうか? よろしくお願いいたします。 #!/usr/bin/perl use strict; use Net::FTP; use CGI; my $host = "my.host.com"; my $user = "user"; my $pass = "pass"; my $remote_file = "/home/test1/remote.txt"; my $local_file = "/tmp/local.txt"; my $q = CGI->new(); my $ftp = Net::FTP->new($host) or die "can not connection: $@"; $ftp->login($user, $pass) or die $ftp->message; $ftp->binary; $ftp->get($remote_file, $local_file) or warn $ftp->message; $ftp->quit; print $q->header( -type=>'text/html', -charset=>'UTF-8', ); print <<"END_OF_HTML"; <body><p>done.</p></body> END_OF_HTML exit;

  • phpのftp_get()でエラーが出ます。

    今回phpを使ってftp関数であるftp_getを実行してみたところ【Warning: ftp_get(): Error opening】が出てきました。 サイトで調べた結果、パスの指定のミスかパーミッションが原因だと言うことがわかりました。 それから小一時間あれこれ試してみましたがダメでした・・・。 そこで今度はperlを使って同じ内容のスクリプトを書いてみると成功しました。 どなたかphpの方ではなぜ正しく動作出来ないのかをご教示ください。 以下はphpとperlのスクリプトです。 =========================================================================== <?php $FTPSERVER = "!!!"; $FTPUSER = "@@@"; $FTPPASSWORD = "***"; //ftpサーバに接続 $ftp = ftp_connect($FTPSERVER); //ユーザログイン ftp_login($ftp, $FTPUSER, $FTPPASSWORD); ftp_pasv($ftp, true); $srverfile = "test.txt"; $localfile = "data1.txt"; ftp_get($ftp, $localfile, $srverfile , FTP_BINARY); ftp_quit($ftp); ?> ============================================================================ #!/usr/local/bin/perl use Net::FTP; my $host = '!!!'; # 接続先 my $user = '@@@'; # FTPのユーザ my $pass = '***'; # FTPのパスワード my $remote_file = 'test.txt'; # リモートのファイル(これを取得) my $local_file = 'data1.txt'; # ローカルファイル(ここに保存) my $ftp = Net::FTP->new($host) or die "can not connection: $@"; $ftp->login($user, $pass) or die $ftp->message; # ログイン $ftp->binary; # バイナリモードに変更 $ftp->get($remote_file, $local_file) or warn $ftp->message; # ファイル取得 $ftp->quit; # 終了

    • 締切済み
    • PHP
  • phpでftp送信 さくらレンタルサーバ cron

    さくらレンタルサーバの cronで、phpを実行し、他サーバのFTPサーバ(PASSIVE)が使えないへ、アップロードするphpのPGで悩んでいます。 さくらレンタルサーバは、通常のftp関数が使えなかったので、「PHP FTP Client Class By TOMO」さんのソケットでFTP送信を行うクラスを使用して、PASSIVEモードで実装、テスト環境・成功するところまでは行けたのですが、相手方のサーバ仕様が使えないことが判明し、アクティブモードに書きかえるところで、悩んでいます。 // 接続を確立する $ftp = new ftp(); $ftp->debug = TRUE;//デバグモード if (!$ftp->ftp_connect($ftp_server)) { die("Cannot connect\n"); print "Cannot connect\n"; exit; } // ユーザ名とパスワードでログインする if (!$ftp->ftp_login($ftp_user_name, $ftp_user_pass)) { $ftp->ftp_quit(); die("Login failed\n"); print "Login failed\n"; exit; } ここから先、どのように書けばよいのやら。 そもそもさくらレンタルサーバのFTPはPASSIVEなので、アクティブ送信できないのでしょうか? 何からしてよいものやら時間がないので焦ってます!

    • ベストアンサー
    • PHP
  • perlでGD::Graph。実行でエラー

    OS: RedHatLinux7.2 perl -v : This is perl, v5.6.2 built for i686-linux HttpErrLog: display: Unable to connect to X server (). Premature end of script headers: /XXX/XXX/XXX.cgi GD::Graphを用いたperlスクリプトを実行すると、上記のようなエラーとなってしまいます。 コマンドでの実行では問題無く動作します。cgiのパーミッションも確認しました。ソースは以下の通りです。作業が進まなくて困っています。 どなたかお知恵をお貸しください。 perl.cgi: --------------------------------------------------------- #!/usr/bin/perl -- use strict; use GD::Graph::bars; my @xLabels = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ); my @data2002 = qw( 17 19 26 38 56 64 67 53 40 29 21 13 ); my @data2003 = qw( 19 24 27 41 56 69 75 60 44 33 22 15 ); my @data = ( \@xLabels, \@data2002, \@data2003 ); my $graph = GD::Graph::bars->new( 800, 600 ); $graph->set( title => "Rainfall 2002/2003", y_label => "Millimetres" ); my $image = $graph->plot( \@data ) or die( "Cannot create image" ); open( OUT, "| display -") or die( "Cannot display image: $!" ); binmode OUT; print OUT $image->png(); close OUT; ---------------------------------------------------------

    • ベストアンサー
    • Perl
  • CGIスクリプトのブラウザから実行エラー

    OS:  RedHatLinux7.2 perl -v :  This is perl, v5.6.2 built for i686-linux HttpErrLog:  display: Unable to connect to X server ().  Premature end of script headers: /XXX/XXX/XXX.cgi GD::Graphを用いたperlスクリプトをブラウザから実行すると、 上記のようなエラーとなってしまいます。 コマンドでの実行では問題無く動作します。 「print」のみの簡易cgiで試行しましたが、問題なく実行されます。 cgiのパーミッションも確認しました。 ソースは以下の通りです。 作業が進まなくて困っています。 どなたかお知恵をお貸しください。 perl.cgi: --------------------------------------------------------- #!/usr/bin/perl -- use strict; use GD::Graph::bars; my @xLabels = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ); my @data2002 = qw( 17 19 26 38 56 64 67 53 40 29 21 13 ); my @data2003 = qw( 19 24 27 41 56 69 75 60 44 33 22 15 ); my @data = ( \@xLabels, \@data2002, \@data2003 ); my $graph = GD::Graph::bars->new( 800, 600 ); $graph->set( title => "Rainfall 2002/2003", y_label => "Millimetres" ); my $image = $graph->plot( \@data ) or die( "Cannot create image" ); open( OUT, "| display -") or die( "Cannot display image: $!" ); binmode OUT; print OUT $image->png(); close OUT; ---------------------------------------------------------

  • FTP接続時失敗時、接続先名をcsvに出力する

    Perl 初心者です。 FTP接続時失敗時、接続先名をcsvに出力する(書き出す)プログラムを作成しております。 ※複数FTPサーバがあり順番に接続していき、接続失敗したところをcsvに一覧にして出力したいです。もし、csvファイルがない場合、C:/logの下にERROR.csvを作成する必要もあります。 今現在、私が作成しているプログラムが以下になります。 #!C:/Perl/bin/perl use Net::FTP; use strict; my $i; my $j; my @ftp_data = ( ['ftp','192.168.0.0'], ['ftp2','192.168.0.10'], ); sub error{ my $file = "ERROR.csv"; if(!-d"C:/log/$file"){ open(TFILE,"+>> $file") or die($!); print OUT "$ftp_data[$i][0]"; close(TFILE); } else{ open(OUT, ">> $file"); # 追加オープン print OUT "$ftp_data[$i][0]"; close(TFILE); } exit; } for ($i = 0; $i <= $#ftp_data; $i++){ #FTPサーバーへの接続 my $ftp = Net::FTP->new("$ftp_data[$i][1]") or &error; #ユーザー名とパスワードを指定してログイン $ftp->login('user','password') or die $ftp->message; print "connect $ftp_data[$i][1]\n"; #接続終了 $ftp->quit; } 実行してみると何もでないでずっとループ?しているみたいなのですが、 どこが悪いのかよく分からないのです。 ご教示いただけないでしょうか?

    • ベストアンサー
    • Perl
  • phpでftpのアップロードができないのですが・・・

    phpでftpコマンドを使ったアップロードができません。どこが間違っているのでしょうか。 ftpで接続してログインするところまでは間違いなくできているのですが・・・よろしくお願いします。 file.php のフォーム部分 <form enctype="multipart/form-data" action="fileupload.php" method="post"> <input type="FILE" name="File"><br>     <input type="SUBMIT" value="送信">     <input type="RESET" vaiue="取消">     </form> fileupload.php のアップロード処理部分 //アップロード後のファイルの名前を仮にaaa.txtとする $file2 = "/public_html/aaa.txt"; if(isset($_REQUEST["File"])){ $file=$_REQUEST["File"]; } $ftp = ftp_connect($hostname) or die("接続失敗"); ftp_login($ftp,$user,$pass) or die("ログイン失敗"); ftp_put($ftp, $file2 , $file , FTP_ASCII) or die("アップロード失敗");

    • ベストアンサー
    • PHP
  • MySQL, PHP をインストール後、データベースにアクセスできません。

    自宅で使っている Windows Vista に ・Apache 2.2.8 ・PHP 5.2.6 ・MySQL 5.0.45 ・PHPMyAdmin 2.11.4 をインストールしました。 それぞれがインストールされたことは確認でき、 PHPMyAdmin でテーブルを作成、インポートなども出来たのですが、 PHP からデータベースにアクセスできずに困っています。 phpinfo(); などは表示されるのですが、 いざデータベースにアクセスしようとすると出来ず、PHPのエラーも表示されません。 $host = 'localhost'; $db_name = 'hoge'; $user = 'root'; $pass = '***'; $con = mysql_connect($host, $user, $pass) or die ("cannot connect DB"); mysql_select_db($db_name,$con) or die ("cannot select DB"); という記述以降に書かれた部分は実行されず、それ以前の部分のみ表示されます。 error_reporting(E_ALL); を記述していても何も表示されないため、原因すら分かりません。 何か心当たりはありますでしょうか?

    • ベストアンサー
    • PHP
  • 多次元配列を使用してFTP接続・フォルダ作成をする

    csvから接続先名とIPアドレスを多次元配列を利用して引っ張り for文等でcsvに書かれている全接続先につなぎデータを取ってくるプログラムを作成しようと思っております。 しかし、多次元配列の使い方やfor文を調べても良くわからず困っています。 csvは、例えば以下の通り設定します。 【hp_ftp.csv】 hp1 192.168.1.12 hp2 192.168.1.10 hp3 192.168.1.20 以下、perlのプログラムです。 #!C:/Perl/bin/perl use Net::FTP; use strict; #FTPサーバーへの接続 my $ftp = Net::FTP->new('各サーバIPアドレス') or die; #ユーザー名とパスワードを指定してログイン $ftp->login('user','password') or die $ftp->message; #保存先ディレクトリの存在確認・作成 if(!-d"C:/接続先名"){ mkdir "C:/接続先名"; } else{ print"Directory already exists!\n"; } #保存先ディレクトリの変更 chdir("C:/接続先名/") or die; 以下略 #取得元ディレクトリの変更 #データ取得(for文で) #接続終了 【質問】 ・IPアドレス(192.168.1.12....)をcsvから引っ張りperlの'各サーバIPアドレス'に入れたい ・接続先(hp1...)をperlの'接続先名'と書かれている部分に入れたい どのようにプログラムを組めば良いのでしょう? ご教授の程宜しくお願いいたします。

    • ベストアンサー
    • Perl
  • ダブルクォーテーションで囲まないと表示できない変数

    ネットから拾ってきたサンプルソースをphp5.2.3を使って試行錯誤中です。 今回、メール受信のソースを試しており、 exitに変数を添えて変数の確認をしていたところ、 8行目は変数が表示できず、 9行目のようにダブルクォーテーションで囲むと表示できる といった変数がいくつかあることに気付きました。 10行目などの変数は、ダブルクォーテーションなしでも表示できますし、 print関数だと、ダブルクォーテーションのあるなしにかかわらず表示できています。 どのような変数でおこる現象なのか、知りたいと興味がわきました。 ご存知の方がいらっしゃいましたら、ご回答よろしくお願い致します。 ソース概略 (文頭の数字は行数,$host/$user/$passは事前に代入済) 01 $sock = fsockopen($host, 110, $err, $errno, 10) or die("サーバーに接続できません"); 02 $buf = fgets($sock, 512); 03 if(substr($buf, 0, 3) != '+OK') die($buf); 04 $buf = _sendcmd("USER $user"); 05 $buf = _sendcmd("PASS $pswd"); 06 $data = _sendcmd("STAT"); 07 sscanf($data, '+OK %d %d', $num, $size);   // 以下、必要なもの以外はコメントアウトして確認 08 exit($num);  //表示できない 09 exit("$num"); //表示できる 10 exit($host);  //表示できる 11 print($num);  //表示できる 12 print("$num"); //表示できる

    • ベストアンサー
    • PHP