2009/10/01(木) [n年前の日記]
#1 [perl] Perl/Tk、Perl/Tkxでハマり中
とあるファイルの中にサウンド指定をしていくのがずいぶんと面倒なので、何とかツールスクリプトを書いて楽が出来ないものかと。
ちなみに今現在、下のような感じの作業を。や、読まなくていいですよ。
が、しかし、いざ調べてみるとスクリプトを書くのも面倒で。
「表示制御テーブルファイル」は、C++の流儀で書かれてる。TAB幅が4文字。ところが、Perl/Tkのtext widgetは標準でTAB幅8文字。そのまま表示するとインデントがぐちゃぐちゃ。視認性が悪いため、作業効率がグンと落ちる。ここは一つ、text widget のソレを、TAB幅4文字にしたい。
某2chのTcl/Tkスレで質問をしてみたら、Tcl/Tkならそういうことができると教えてもらえた。おそらくポイントとなるのは、
ところが、Perl/Tkのtext widgetには tabstyleが指定できない。英語圏サイトを検索してみたら、どうもActivePerl + Tkのソレは8.0.4相当で、tabstyleが実装されたのは8.0.5以降、のように見えた。
Perl/Tkは既に古くなっていて、Perl + Tkxが今風らしい。なんでも、TkxはTcl/Tkのコア部分をそのまま使うので、Tcl/Tkのバージョンアップ時に対応が楽なのだとか。ということで試しに ActivePerl 8.10 + Tkx 上で試してみたところ、こちらなら tabstyle が使える。
しかし、今度は font measure の記述の仕方が判らない。Perl/Tk であれば、
ちなみに今現在、下のような感じの作業を。や、読まなくていいですよ。
- 元データファイルと今企画用データファイルの対応が列挙されている、「対応表ファイル」をxyzzyで開く。
- サウンドの内容と管理番号が列挙されている、「サウンドリスト.xls」をExcelで開く。
- 対応表ファイルを眺めて、サウンド指定をすべき、表示制御テーブルのファイル名を確認。xyzzyで開く。
- ファイル中に画像番号が列挙されているので、「どの画像番号がどの画像ファイルと対応しているかが列挙」されている、使用画像定義ファイルをxyzzyで開く。使用画像定義ファイルと表示制御テーブルファイルは1対1で対応している。
- 使用画像定義ファイルを見て、使われている画像ファイル名を把握。
- ViXのサムネイル表示で、使用されている各画像ファイルの内容を確認して、どの画像=何番目の画像が出てきたら音を鳴らすのかを、自分の脳に記憶。
- 表示制御テーブルファイルに戻って、「何番目,」で検索して、たぶんここだろうと思われる箇所を探す。
- サウンドリスト.xlsを眺めて、鳴らすべき音の管理番号を、自分の脳に記憶。するのだけど時々何の音か判らなくなるので、エミュレータ上でサウンドテストアプリを動かして実際の音を確認もしくは似た音を探す。
- 表示制御テーブルファイルに戻って、サウンド再生コマンドと、サウンド管理番号を書き込む。
- 他に入れるべきサウンドがあれば、5に戻る。
- 挿入が終わったら、保存。
- 3に戻る。
が、しかし、いざ調べてみるとスクリプトを書くのも面倒で。
「表示制御テーブルファイル」は、C++の流儀で書かれてる。TAB幅が4文字。ところが、Perl/Tkのtext widgetは標準でTAB幅8文字。そのまま表示するとインデントがぐちゃぐちゃ。視認性が悪いため、作業効率がグンと落ちる。ここは一つ、text widget のソレを、TAB幅4文字にしたい。
某2chのTcl/Tkスレで質問をしてみたら、Tcl/Tkならそういうことができると教えてもらえた。おそらくポイントとなるのは、
- text widget に -tabstyle => "wordprocessor" を指定。
- text widget の -tabs には、ピクセル数、mm、cm、inchしか指定できないので、font measure で1文字分のドット数を得て、TAB幅にしたい文字数を掛けてドット数を算出し、-tabs => ["$tabwidth", 'left'] のように指定する。
ところが、Perl/Tkのtext widgetには tabstyleが指定できない。英語圏サイトを検索してみたら、どうもActivePerl + Tkのソレは8.0.4相当で、tabstyleが実装されたのは8.0.5以降、のように見えた。
Perl/Tkは既に古くなっていて、Perl + Tkxが今風らしい。なんでも、TkxはTcl/Tkのコア部分をそのまま使うので、Tcl/Tkのバージョンアップ時に対応が楽なのだとか。ということで試しに ActivePerl 8.10 + Tkx 上で試してみたところ、こちらなら tabstyle が使える。
しかし、今度は font measure の記述の仕方が判らない。Perl/Tk であれば、
$txt = $mw->Text(...); ... my $fontwidth = $txt->fontMeasure("0");のような記述で1文字あたりのドット数が取得できる。でも、Tkx では、$txt->fontMeasure("0"); ではエラーが出る。$txt->m_fontmeasure() も、$txt->g_fontMeasure() でもダメ。というかエラーメッセージが、
bad option "fontMeasure": must be bbox, cget, compare, configure, count, debug, delete, dlineinfo, dump, edit, get, image, index, insert, mark, peer, replace, scan, search, see, tag, window, xview, or yview at C:\home\prg\perl\test_tk\tkxtexttabs.pl line 30てな感じで表示されるわけで。どうも、cgetとかconfigureとかは使える・実装済みだけど、fontMeasureは実装されていないような気がしないでもない。
[ ツッコむ ]
以上です。