• 締切済み

perl/tkで日本語を表記したいのですがうまくいきません。

perl/tkについての質問です。 ラベルウィジェットに日本語を表記したいのですが、ご存知の方教えて下さい。 -text=>"ファイル名" のファイル名が文字化けしてしまいます。 ------------------------------------------- #!c:\perl\bin\perl.exe use Tk; $top = MainWindow->new(); $top->title("test"); $font=['MS ゴシック', 11, 'normal']; #ファイル名 $lb_f=$top->Label(-font=>$font, -text=>"ファイル名")->grid(); MainLoop(); -----------------------------------------------------------

  • Perl
  • 回答数1
  • ありがとう数2

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

環境や処理系のバージョンが明記されていませんが、Windowsで ActivePerlの最近のものだと仮定します。 Tcl/Tkは多言語が対応のため文字列がutf-8化されているので それに応じてPerlから渡してやらなければなりません。 #!c:\perl\bin\perl.exe use Tk; use Encode qw(decode); $top = MainWindow->new(); $top->title("test"); $font=['MS ゴシック', 11, 'normal']; #ファイル名 $lb_f=$top->Label(-font=>$font, -text=>decode('cp932', "ファイル名"))->grid(); MainLoop(); こんな感じで日本語文字列もきちんと描画されるようになります。

stockjp
質問者

お礼

ありがとうございます。 解決しました。

関連するQ&A

  • 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 の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/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でURLを既定のブラウザで開く方法

    Perl/TkでGUIプログラミングをしております。 プログラム中のButtonを押した時に自分のパソコンに設定している 既定のブラウザでWEBサイトを開くにはどうすればいいでしょうか? イメージは下記のような感じです。 use Tk; use Encode; $url = "http://okwave.jp/"; $main->Button(-text=>decode("cp932","URLを開く"),-font => ["MS ゴシック", 12], -command => \&open_url) ->grid(-row=>0,-column=>0); sub open_url{ # 既定のブラウザでURL($url)を開く処理 } よろしくお願いします。

    • ベストアンサー
    • Perl
  • Pythonコードの間違いを指摘して

    import tkinter as tk i=0 def a(): global i i=1 root=tk.TK() root.geometry("100x100") a() label=tk.Label(root,text=i) label.grid() tk.mainloop() →できた import tkinter as tk i=0 def a(): global i i=1 root=tk.TK() root.geometry("100x100") label=tk.Label(root,text=i) label.grid() button=tk.Button(root,text="button",command=a) button.grid() tk.mainloop() →できない(0と表示される)

  • 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
  • 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
  • Pythonコードの間違いを指摘して

    import tkinter as tk lastplay="" def gamestart(): global lastplay lastplay="試合開始" frame_main.tkraise() root=tk.Tk() frame_settings=tk.Frame(root) frame_settings.grid() button_gamestart=tk.Button(frame_settings,command=gamestart) button_gamestart.grid() fraim_main=tk.Frame(root) fraim_main.grid() label_1=tk.Label(frame_main,text=f"{lastplay}です") label_1.grid() fraim_settings.tkraise() root.mainloop() エラー内容 frame_mainが表示されたとき、変数の「試合開始」が表示されず、「です」のみ表示される。

  • 【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バイト文字コードを含むファイル名の利用は出来ない仕様でしょうか。 その他、よい回避方法などがありましたら、お教えください。 よろしくお願い致します。

  • 14行目がおかしい?

    いつもお世話になりありがとうございます。 下記プログラムにてタイトルの通り、メッセージが出ます。 どうおかしいのでしょうか? ご回答のほど宜しくお願い申し上げます。 from cgitb import text import tkinter window = tkinter.Tk() window.title('足し算') window.minsize(400,400) Entry1=tkinter.Entry(font=("ゴシック",20),width=5,bg='blue') Entry1.place(x=30,y=65) textplace=tkinter.Label(font=("ゴシック",20),text='+') textplace.place(x=120,y=65) Entry2=tkinter.Entry(font=("ゴシック",20),width=5,bg='blue') Entry2.place(x=160,y=65) text2=tkinter.Label(font=("ゴシック",20),text='=') text2.place(x=250,y=65) kotae_text=tkinter.Label(text"",font=("ゴシック",20)) kotae_text.place(x=300,y=65) button=tkinter.Button(text='結果は?',font=("ゴシック",20),bk='blue',activebackground="blue") button.place(x=150,y=150) def kekka(): suuji1=Entry1.get() suuji1=int(suuji1) suuji2=Entry2.get() suuji2=int(suuji2) kotae_text['text']=suuji1+suuji2 button['command']=kekka window.mainloop()

専門家に質問してみよう