作者: 機械伯爵
日時: 2005/12/20(00:13)
 最後の最後で時間リミットオーバー
 全て大雪が悪い(泣)

MR. FRISBEE III: Cheer up, Brian. You know what they say.
  Some things in life are bad.
  They can really make you mad.
  Other things just make you swear and curse.
  When you're chewing on life's gristle,
  Don't grumble. Give a whistle.
  And this'll help things turn out for the best.
  And...

フリスビー三世 氏「元気出せって、ブライアン。
 よく言うだろう、
 人生、いいことばかりじゃない
 ホント、君をいらだたせることもあるし、
 君をただバカにし、呪うこともあるだろう
 でも、君が人生の髄を味わってる時は、
 不平なんか言わないで、口笛を吹こうって
 すると、世の中なんだか、よくなってくるもんさ
 そして………

by "MONTY PYTHON'S LIFE OF BRIAN"




0000-1010.ウロボロス(UROBOROS)

 昼休み、望美と美央に連れられて来たのは、議員会議
室だった。
 そしてそこに居たのは、新聞部編集長の来生章介と、
数名の生徒自治会議員だった。
「食事中、呼びたてして申し訳ないね」
 章介の言葉に巽は首を振る。
「僕の食事は一分あれば終わりますから、お気になさら
ずに」
 章介が苦笑する。
「バランス栄養食のブロックかい?」
 あたしには食べろ食べろって言ったくせに、と、美央
が小さく愚痴る。
「食事の時間が惜しいんですよ。できるだけ早く終わっ
て、色々やりたいことがありますからね」
「それならなおさら、貴重な時間なわけだ。ところで、
呼び出された理由、わかるかな?」
 巽は肩をすくめた。
「さぁ、見当もつきませんね」
 望美がきっ、っと睨むが、巽は涼しい顔をしてとぼけ
た。
 章介は面白そうにその様子を見ながら、口を開く。
「君は、自治会の情報管理についてどう思う?」
 巽は言葉を選んで答えた。
「効率的とは言いがたいですね。また、安全性に関して
も若干問題があります」
「もし、君が自由にシステムを組めるとしたら、どうし
たい?」
 巽は首を振った。
「それが間違いなんですよ」
 章介は面白そうに笑う。
「間違い? どういうことかな?」
「システムを家電のように完全でメンテナンスフリーな
モノとしてみることが、です。どういうシステムを組む
かも大切ですけど、実際にシステムに一番労力を払うの
は保守 (メンテナンス) なんです。つまり現在の技術レ
ベルでは、ネットワークは、本来稼動中は管理者 (アド
ミニストレータ) が常駐し、定期的あるいは必要に応じ
て整備されなければならないモノなんです。システムを
組めといわれれば組みますが、保守全般までは、正直、
面倒見切れません」
「その口調だと、君に依頼したいことは、既に伝わって
いるようだね」
 巽は頷く。
「では、受けてくれないか。完璧は望まない。だだ、今
できうる最高のコンディションにしたいだけなんだよ」
 巽は首を横に振った。
「お断りします。僕には出来ませんし、責任も負えませ
ん」「君がやらなければ、今のまま何も変わらない」
「僕は僕が納得できないような結果になることを承知で、
何かをする気は全くありません。話がそれだけなら、失
礼します」
 きびすを返して戻ろうとする巽の前に、望美が立ちは
だかる。
「何怖がってるのよ、男のクセに」
 その脇をすり抜けようとするが、望美は巽の胸倉を締
め上げた。
「あんたがやんなきゃどうにもならないって、どうして
わかんないのっ!」
「わかってないのは、君等だよ。君等が僕に要求してる
のは、一人の人間にはどうしたって出来ないことなんだ。
特に僕が学生で、あまりにも限られた時間しか関われな
いとすれば、なおさらだ。ネットワークはただのハード
ウェアのインフラじゃない。血の通った生き物なんだよ」
「誰も一人でやれなんて言ってないじゃない。あたしも
手伝うって。それでも不満なの?」
 巽は辛そうに、それでもきっぱりと言った。
「悪いけど、スキルがあまりにも足りない。そうだね、
一年もみっちりと勉強して、現場で研修したら、ものに
なるかもしれないけど」
「そ……………う」
 急に、望美の目が、死んだように虚ろになった。
 胸元を締め上げていた両手の力が抜け、巽は解放され
る。
 巽はそのまま、会議室を出た。
 気がつくと、美央がその横に並んでた。
「木崎?」
 美央はにっこりと笑って頷く。
「あたしは、朽縄くんと一緒がいいって言ったでしょ?
 朽縄くんが無理だって言うなら、多分ホントに無理だ
と思うの。だって朽縄くん、頼まれたことを真剣に検討
せずに断るなんてしないと思うから」
 巽は肩をすくめた。
「それ、買いかぶりすぎ。翔子が会計やれって言った時
は、即答で断ったよ。結局やらされるハメにはなったけ
どね」
「でも、今の事は、真剣に考えたんでしょ?」
「それなりにね。強引だとは思うけど、坂下も来生さん
も、真剣に考えてたみたいだから。ただ僕は、ネットワー
クやパソコンなんてものは、使う人が一々いろんな注意
事項を意識せずとも使えるようにならなきゃならないと
思ってるんだ。そのためには、陰で面倒を見る人がいな
きゃいけない。理想的には、そういう面倒は全て機械が
やってくれるといいんだけどね、まだそういう状態には、
ハードウェアもソフトウェアもなっていない。僕だって
プロじゃないし、出来ることは限られてる。この場合の
正解は、学校の教員側のネットワークの一部として管理
してもらって、学校全体の管理をするためにプロの管理
者を入れてもらうことだね」
「あたしはわかんないけど、朽縄くんがそう言うなら、
そうなんだと思う」

    ☆   ☆   ☆

「私はよくわからないけど、巽くんが言うなら、そうじ
ゃないの?」
 会議室に集まっていた議員は既に去っていた。
 入れ替わりに二人、さっき居なかった人間が来ていた。
「巽くんが聞く耳持たないっていう態度を取ったなら、
実際無理なのよ。勿論、誰にも出来ないってことじゃな
いかもしれないけど、少なくとも自分は無理だと思った
んだわ。情熱とか努力とか、そんな問題じゃなさそうね」
「でしょうね、羽島先輩の言う通り、そこは俺の計画自
体が根本的に間違ってたってことだと思います。すいま
せん、無理言って朽縄くんに声かけてもらったのに」
「あら、それはいいのよ。あたしも巽くんとデート出来
て楽しかったんだから」
 ふふふ、と笑う八重を、焦点の定まらない瞳でぼんや
りと見つめる望美。
「それで来生、このまま引き下がるのか?」
 修也の問いかけに、章介は首を振り、にやりと不敵に笑う。
「確かに来年の立ち上げは無理だ。でも、あきらめたわ
けじゃない。皮肉にも、と言うべきか、彼の…朽縄くん
の言葉がヒントになったよ」
「そうか。それは楽しみだな」
 八重は、放心している望美に近づいて、後ろから肩を
抱いた。
「ほら、来生くんがあきらめてないなら、望美ちゃんも
あきらめちゃダメでしょ?」
 ぼんやりと、八重を見上げた望美の目の端には、涙が
たまっていた。
「巽………あたしのこと、無能だって言った………役に
立たないって………」
 八重は望美の耳元で言った。
「巽くんはそんなこと言わない。『今は無理だ』って言
っただけでしょ。ね、来生くん?」
 章介の方を向いて、にっこり笑う八重。
「羽島先輩、お見通し、ですか?」
「ええ。だから望美ちゃんにも、早く立ち直ってもらわ
ないと」
「あたし………」
 八重はそのまま、望美の頭を撫でた。
 嗚咽を洩らす低い声だけが、会議室に響いた…………
…?

    ぽりぽりぽり

「ん? 何喰ってるんだ、天美?」
 なにやら四角いビスケットのようなモノをパクついて
いる修也を、章介が見咎めて言った。
「いや、なんとなく昼を食べそびれたから、朽縄くんの
マネして、バランス栄養食。余分あるけど、いるかい、
来生、羽島先輩、坂下くん?」
 三人は顔を見合わせた。
「………くれ。俺も飯抜きだから」
「天海くん、あたしも貰える?」
「………先輩、下さい」
 いったい何人分常備しているのかわからないが、とり
あえず修也はあっさりと人数分、一箱ずつ渡した。
 そして三人が、包みを開け、ブロックにパクつく。
「! ! !」
「新発売のピリ辛中華味、俺は気に入ってるんだけど、
どう?」
 三人は、名状しがたい表情で、天美を見た。

    ☆   ☆   ☆

「本日の御題は………」
「当然、アレよね」
「………GUI、やるの?」
「勿論」
 巽はため息をついた。
「じゃ、ホンのさわりだけね」
 巽は、メモ帳を開いて、以下のように打ち込んだ。

# coding: sjis
from Tkinter import *

def s2u(s):
 return unicode(s, 'sjis').encode('utf-8')

w = Tk()
l = Label(
 w,
 text = s2u('唯我独尊'),
 font = 'herbetica 72 bold'
)
l.pack()

def changeLabel():
 l.config(
  text = s2u('じこちゅー!'),
  fg = 'red',
  bg = '#0000FF'
 )

b = Button(
 text = s2u('意訳'),
 font = 'times 36 italic',
 command = changeLabel
)
b.pack()
w.mainloop()

 これを、tktest1.pywという名前で保存する。
「あ、ボタン押したら表示変わるじゃない。面白いわね」
「Python で GUI アプリケーションを作るのは、他の環
境よりはずっと簡単だけど、やっぱり知っておかなきゃ
ならないことが沢山あるんだ。大丈夫?」
「大丈夫かどうかは、やってみないとわかんない。やっ
てみてダメならやめるわ」
 嘆息する巽の様子など気にせず、翔子は質問してきた。
「これ、ファイル名の………拡張子だっけ? これ、py
じゃなくって pyw になってるんだけど?」
「ああ、これは Windows で GUI プログラムを動かす時
に便利なオプションだよ。拡張子を pyw にしておくと、
ダブルクリックでコマンドプロンプトを立ち上げずに、GUI
だけ動くんだ。なんとなくそれっぽいでしょ?」
「うん、なんかいい。でも、違いはそれだけ?」
「そうだね。拡張子が py でないとモジュールとしてイ
ンポートできないけど、ダブルクリックするスクリプト
ファイルは結局立ち上げ用だから、インポートする必要
無いしね」
「じゃ、内容説明。早く早くっ☆」
「はいはい。まず、GUI ツールは Tkinter っていうモジ
ュールに入ってるから、それを from〜 import * で丸
ごとインポートする。普通はこういう丸ごとインポート
はあまりやらないんだけど、殊 GUI プログラミングに関
してだけは、そうじゃないと面倒だからね」
「セオリーみたいなもん?」
「そういうこと。プログラミングであまりセオリーを重
視するのは、好きじゃないんんだけど、この場合仕方が
無い。その次の s2u 関数は、日本語を扱う際は作ってお
くと便利だよ。Tkinter では UTF-8 は使えても Shift-JIS
は使えないから、S-JIS から UTF-8 に変更するコードな
んだ。ちなみに、Windows Xp に付属のメモ帳は UTF-8
で保存できるから、その機能を使えば、いちいち変換す
る必要無いんだけどね」
「じゃ、今までなんで Shift-JIS でプログラム書いてた
の?」
「コンソールが Shift-JIS 用だから」
「面倒ね」
「面倒だよ。日本語の問題は、これからいつまででも付
きまとってくるから、覚悟した方がいいよ」
「うぇ。次、次っ! 辛気臭い話はやめっ!」
「はいはい。Tk クラスのオブジェクト w は、GUI プロ
グラムの核だと思って。このオブジェクトの destroy メ
ソッドを動かすと、GUI 全体が終了するんだ」
「Pythonも?」
「Python は動いてる。なんならもう一度 Tk オブジェク
トを作れば、GUI も再開できる」
「ふぅん」
「次はラベル (Label) クラスだ。普通に文字を表示する
場合は、このクラスが便利だよ。作る最初の時に文字や
フォントのようなオプションを指定するけど、後でやっ
てるように、config をいじれば簡単に変更できるから」
「テキストはShift-JISからUTF-8に変更してるのね?」
「そういうこと」
「フォントは、どんな種類が使えるの?」
「う〜ん、明朝体ライクなら times、ゴシック体ライク
なら herbetica が定番だけど、あとはあんまり凝らない
ほうがいい。ワープロにも言えることなんだけど、凝っ
たフォントを使っても、プログラムを持ってった先にフ
ォントがインストールされてなければアウトだからね。
フォント指定しなければシステムフォントが使われるけ
ど、前見せたとおり、正直あまり綺麗じゃないから、こ
の二つを使うといいよ。もし凝った装飾文字が使いたけ
れば、画像を貼り付けるほうが無難だね」
「画像も使えるの?」
 巽は、しまった、というように口を押さえる。
「何よ。なんかマズいこと、あるの?」
「画像、使えるんだけど、はっきり言ってかなり面倒な
んだ。使える画像フォーマットは4種類あるんだけど、
そのうちメジャーなのって、GIF しか無いし………」
「JPEGとかPNGとかBMPとか、使えないの?」
「うん。使う場合、フルカラーなら PPM 形式に、8 ビッ
ト、つまり 256 色なら GIF に変換しなきゃならない。PPM
形式って、UNIX 用だから、PhotoShop でも Element だ
と対応してないんじゃないかな? 一応 GIMP を使えば
変換できるけどね」
 GIMP(GNU Image Manipulate Program) は、フリーソフ
トウェアながらさまざまな画像形式を扱えるプログラム
である。
「4種類って、他には何?」
「あと、カラー画像では PGM ってのがあるけど、PPM 以
上にマイナーだし、GIF を使えばいいから覚えなくても
いいと思う。もう一つは XBM っていう特殊なビットマッ
プ画像なんだ」
「XBM? ビットマップってBMPみたいな?」
「今では、ピクセルドットに色を直接指定する画像形式
…つまりラスタ画像を全部ビットマップと言ってるけど、
本来はカラービットマップと言ってたものなんだよね。
ビットマップと言う場合、昔はモノクロビットマップを
指したんだ。XBM はそのモノクロビットマップ、つまり
色が『あるか無いか』の情報しか無い画像なんだ」
「それって何か意味あるの?」
「もちろん。色があるか無いかの指定ってことは、つま
りどんな色にも出来るってことだよ。例えばその画像で
字を書いておけば、色違いのレタリングが簡単に作れる
ってことになる」
「あ、そっか。白黒じゃなくてもいいんだ」
「そういうこと。それから、XBM は実はテキスト形式だ
から、がんばればメモ帳で絵が書けたりするんだよ」
「で、ピクセル単位で指定するわけ?」
「基本的には4ドットで一文字だけど、まぁそういうこ
とかな」
「面倒臭い」
「ごもっとも」
「ま、いいわ。説明続けて」
「はいはい。Label オブジェクトは、第一引数として貼
り付けるフレームを指定するんだ。今回は w がフレーム
の役割も果たしてるから、直接 w に貼り付けるってこと
で w を指定してる。で、テキストやフォントや、必要な
ら色なんかも指定するんだ」
「ところで気になってたんだけど、引数を指定するとき
に、代入してるのって何?」
「ああ、これ説明してなかったね。キーワード引数って
言って、関数やメソッドなんかが指定してる仮引数を指
定して代入できるんだ。関数の引数の書き方には色々あ
って、引数の数を特定しなかったり、足りない引数には
デフォルトで値を指定したりとか、色々できるんだよ。
キーワード引数もその一種だと思って」
「なんだか、まだ覚えなきゃならないこと、沢山あるの
ね」「そうだなぁ。全部一度に覚える必要は無いから、
必要に応じて覚えていけばいいと思うよ。まずはプログ
ラムを書けるようにだけして、あとは書きながら覚える
ってとこかな。前も言ったけど、目的はプログラムを書
けることになることであって、言語ヲタクになることで
はないんだ」
「ふぅん」
「さて、説明の続き。ラベルの最後だけど、pack ってい
うメソッドを実行してるよね。これは、最終的に準備が
ととのったから、実際に GUI に表示させるメソッドなん
だ」
「ふむふむ」
「次の changeLabel 関数は、l オブジェクトのさまざま
なオプションを表示したり変更したりする config って
いうメソッドを使って、ラベルの文字やフォントや色を
変更してるんだ」
「まぁ、見ればなんとなくわかるけど、fg と bg っての
は何?」「fg は foreground(前景) の略で、今の場合は
文字の色、bg は同じく background(背景) で、今の場合
は文字の背景だよ」
「色指定、片一方の red は判るんだけど、シャープにゼ
ロとエフで書いてるこれはなに?」
「RGB(Red Green Blue) 指定だよ。頭から、#RRGGBB っ
て並んでる。数値は 16 進法だから、0〜 9 の次は A〜
F になる。B、つまり青のところの数値だけ最高だから、
青色の背景になったってわけ。色の名前で指定しづらい
時とか、指定できないときは、こういう書き方するんだ」
「色指定の書き方は二通りあるってことね」
「そういうこと。次はボタンだね。ボタンは殆どラベル
と同じだけど、command っていうオプションがある」
「ボタンを押した時の動作?」
「そういうこと。あとはあんまり変わんないかな」
「commandのところって、メソッドは指定できないの?」
「どういうこと?」
「わざわざ関数作ってるから、どうしてかな、と思って」
「うん。実は command で指定できるのは、引数の無い関
数だけなんだよ。メソッドでも引数が無ければ、たとえ
ば l.destroy とかなら指定できるけど、config でオプ
ションを変更するようなものは、専用の関数を作るしか
ないんだ」
「面倒ね」
「本当は、こういう書き方も出来るんだけどね。

    command = (lambda : l.config(
     text = s2u('じこちゅー!'),
     fg = 'red',
     bg = '#0000FF'))

「なにこれ?」
「λ(ラムダ) 式って言っていう特殊な書き方。ただ、こ
の書き方をすると、スクリプトが複雑になってみにくく
なるからっていう理由で、今では推奨されていないんだ。
僕は結構好きなんだけどね」
「そうね、これならあたしは、別に関数作ったほうが見
やすいと思う」
「うん、僕も慣れないうちはそのほうがいいと思う。ま、
こういう書き方もあるっていう紹介だと思って」
「で、これで説明は全部終了?」
「えっと、最後に一つだけ。ボタンのパックはいいとし
て、mainloop メソッドってやつ。これは、実質上 GUI
プログラムをスタートさせて、そちらにメインの制御を
置くっていう命令なんだけど、ぶっちゃけて言えば、こ
れ書いておかないとプログラムが何もしないうちに終了
しちゃうんだ」
「そういえば、whileループとか書いてないものね」
「そういうこと。以上がスクリプトの簡単な説明。あと
は、プログラムをどうやって組み合わせるか、を考える
だけだよ」
「とかいっても、これだけじゃ、ちょっと………」
「じゃ、文字を入力するエントリーオブジェクトの例と
か、少し書いてみよう。

from Tkinter import *
w = Tk()
l = Label(w, text='',font='times 20 bold',justify=LEFT)
l.pack()

e = Entry(w, width=50)
e.pack()

def getText():
 t = e.get()
 l['text'] = l['text'] + t + "\n"
 e.delete(0,END)

b = Button(
 w, text="ENTER!",
 font="times 20 bold",
 command=getText)
b.pack()

w.mainloop()

「これ、どうするの?」
「ボックスに文字を書いて ENTER ボタンを押すと、上の
ラベルに入力されるんだ」
「あ、こういうこと」
「じゃ、説明ね。ラベルのところはほとんど同じ。justify
ってのは、複数行テキストを表示するとき文字をどちら
でそろえるかで、普通は中央揃えになるんだけど、今回
は左揃えにしてみた」
「大文字で LEFT って書いてあるけど、これ、特殊なオ
ブジェクトなの?」
「いや、ただの文字列だよ。内容は'left'。Tkinter で
は、よく使う文字列は、変数に入ってるんだ。後で出て
くる END も同じだよ」
「じゃ、今のjustify='left'でもいいの?」
「うん。ただ、LEFTのほうがタイプが少ないだけ」
「う〜ん、便利なんだかどうなんだか」
「文字列のクォートを何回も書くと、本当に面倒だから
ね。次、Entry オブジェクトは、一行の文字を入力する
ときに使うんだ。そこに書かれた文字は get メソッドで
取り出せるし、delete メソッドで最初と最後を指定すれ
ば、その範囲が削除できる。他に insert メソッドで文
字を挿入できたりも出来るけど、あんまり用途は無いか
も」
「そうすると、getText 関数は、テキストを取り出して
………あれ? 辞書じゃないのに、ラベルオブジェクト
に変なことしてる?」
「うん、config を使う方法とは別に、辞書みたいな使い
方でオプションが変更できるんだよ。まとめて複数変更
するなら config が便利だけど、今回みたいに内容を取
り出して一個だけ変更するなら、辞書式のほうが簡単だ
と思う」
「じゃ、getText は text オプションを変更してるわけ
ね。えっと………元のテキストに、エントリーのテキス
トを加えて、改行してるから、追加? それから最後は、
エントリーの中のクリアね?」
「だんだん解ってきたね」
「えへへ」
「あとはボタンの動作だから、説明はいいね」
「うん。さっきと同じだしね。ところでちょっと気にな
るんだけど、もしこういう動作なら、ボタン押すより、
エントリーボックスの最後でエンターキーを押せばテキ
ストが入力される方が、気が利いてるんじゃない?」
「そうだね。そういうふうに改造してみようか」

from Tkinter import *
w = Tk()
l = Label(w, text='',font='times 20 bold',justify='left')
l.pack()

e = Entry(w, width=50)

def getText(event):
 t = e.get()
 l['text'] = l['text'] + t + "\n"
 e.delete(0,'end')

e.bind('<Return>',getText)
e.pack()
w.mainloop()

「バインド?」
「うん。マウスやキーの動作を GUI の部品………ウィジ
ェット (widget) っていうんだけど………に文字どおり
結び付けるメソッドなんだ。たとえば、ラベルにマウス
クリックの動作をバインドすれば、ボタンみたいに使え
るよ」
「うぁ、なんだか大層ね」
「GUI の動作はマウスクリックが基本だけど、例えば電
卓スクリプトとか作ったら、いちいちマウス使うの面倒
でしょ? キーをバインドしておけば、そういうとき便
利なんだ」
「うん、ますます本格っぽいね」
「ただキーバインドは、作り方によっては、ウィジェッ
トのフォーカスが問題になることがあるから注意が必要
だけどね」
「フォーカス? 焦点?」
「うん。つまり現在どの部品がキーの入力を受け取るよ
うになってるかによって、機能が思いどおり動かないこ
とがあるんだ。今回は、エントリーに必ず入力中だから、
問題ないけどね」
「思った所にフォーカスが合ってない時はどうするの?」
「focus っていうメソッドを使って、強制的にフォーカ
スを設定するか、あるいは、トップレベル、つまりウィ
ジェットを置く本体にバインドしておけば、ほぼ問題は
無いけどね」
 翔子がげんなりしたような声で言う。
「GUIって、なんか気を使う場所、やたら多くない?」
 巽はにやっと笑った。
「そういうこと。GUI って、使うのは楽だけど、作るの
は相当面倒なんだよね。コンソールだと入力は普通一カ
所だけだけど、GUI だとどこから指令がくるかわかんな
い。こういうのをイベントドリブン(イベント駆動式)
プログラムって言うんだけど、ユーザの自由度がそのま
ま設計者の負担となって跳ね返ってくるんだ。Python は
これでも簡単にしてある方なんだけど、あまり簡単にし
すぎると作成できるアプリケーションの可能性まで狭め
てしまうから、限界はあるんだ。だから、誰かにプログ
ラムを使ってほしい場合以外は、GUI は大概、労力に見
合わないんだよ」
「自分で使うプログラムには、GUIは使うなってこと?」
「そうは言わない。GUI が便利だったり、GUI しか出来
ないプログラムは存在するからね。例えば画像表示なん
かは、GUI でしか出来ない」
「そこまで言うなら、画像の使い方、教えてよ」
「はいはい。じゃ簡単に、ラベルに絵を貼り付けるだけ
のプログラムね」

from Tkinter import *
w = Tk()
i = PhotoImage(file='image.gif')
l = Label(w, image=i)
l.pack()
w.mainloop()

「要するに、PhotoImage ってオブジェクトをファイル指
定して作って、ラベルとかボタンとかに貼り付ければい
いわけね」
「そういうこと」
「ふふふ、思いついちゃった」
 含み笑いする翔子に、巽は思わず後退ざる。
「な、なに?」
「えっと、グラフィックローダっていうのかな? 絵を
見るだけのアプリケーション。今までのでできるんじゃ
ない?」
「あ、そっか。それいいかも。書いてみる?」
「うん、えっと……………」

from Tkinter import *
w = Tk()
l = Label(w)
l.pack()
e = Entry(w, width=50)
e.pack()
def setImage(event):
 f = e.get()
 i = PhotoImage(file = f)
 l['image'] = i

e.bind('<Return>',setImage)

w.mainloop()

「どう?」
「論よりRUN。実行実行」
「ほい、ぽちっとなっ!」
 エントリーオブジェクトだけのウィンドウが現れる。
「じゃ、ファイル名を入れて、エンターとっ!」
 画像を入れたと思しきラベルの領域は現れた。
 しかし肝心な画像は、そこには現れなかった。
「な、なんでぇ〜っ!」
「う〜ん、コレは難しいんだけど、i は関数で作られる
一時的なオブジェクトだから、ラベルが参照し続けるこ
とが出来ないんだ」
「え〜? そんなんあり?」
「簡単な解決方法としては、i を作る前に、'global i'
って宣言して、i をグローバル変数にすればいいんだけ
ど………」
「え? あ、動いたっ! 絵、出てきた出てきたっ!」
「グローバル変数はちょっとお勧め出来ないから、こん
な風に改造したらどうかな?」

from Tkinter import *
w = Tk()
l = Label(w)
l.pack()
e = Entry(w, width=50)
e.pack()
imagebox = [None]
def setImage(event):
 f = e.get()
 imagebox[0] = PhotoImage(file = f)
 l['image'] = imagebox[0]

e.bind('<Return>',setImage)

w.mainloop()

「あ、リストの参照?」
「うん。実際はもっとスマートな方法はあるんだけど、
こんなところでいいんじゃないかな?」
「なるほど、参照も使いようね」
「そういうこと。じゃ、これで終わり」
「GUIって面倒だけど、結構やりだすとはまりそうね。で、次回は何?」
 巽は、にっこりと笑って言った。
「だから、終わり。次回は無し。翔子のプログラミング
入門は、これで終了」
「え―――――っ! ? ちょ、ちょっと待って。まだ
あたし、プログラムなんて書けるようになってないよっ
!」
 いきなりの終了宣言にうろたえる翔子に、巽は静かに
首を振った。
「いや、もう十分書けるよ。あとは『何に使うか』だけ
ど、それは翔子が自分で見つけるべきだよ。Python はリ
ファレンスも充実してるし、今までの知識を生かせば、
ちゃんと必要な情報、見つけられる筈だよ」
「でも………」
「ううん、これ以上僕が、手取り足取り教えるのは、か
えって良く無いんだ。もちろん、リファレンスを読んで
もどうしてもわかんないところがあれば教えてあげるけ
ど、『何をするか』は、これからは翔子が決めるんだ」
「じゃ、わかんないとこあったら、教えてくれるのね?」
「勿論」
「ん……………」
 翔子はぶるぶるっと頭をふって、それから、なにか吹
っ切れたようなすっきりした笑顔で言った。
「ありがとうございました、巽先生」

    ☆   ☆   ☆

 翌日、大仕事をやり終えた感慨にひたる巽と、合格を
貰った翔子は、朝、顔を合わせると同時に、どちらとも
無く吹き出した。
 理由は、どちらも聞かなかった。
 なんだか、妙にすっきりした気分だった。
 そして、そのすっきりは、残念ながら午前中までしか
続かなかった。
「二日連続、呼び出しですか?」
 巽は明らかに困惑顔で、ぽりぽりとブロックを食んでいた。
 それは、昨日章介たちに名状しがたい世界を垣間見さ
せた、あの『ピリ辛中華味』だった。
 なお、今日は議員のメンバーはおらず、代わりに修也
と八重、そして翔子が居た。
 呼び出したのは章介で、望美も美央も同じように居た
のだが、今日は美央が一人で巽を連れて来た。
 そしてなぜか、望美は今日は一度も巽と目を合わせよ
うとはしない。
「昨日の件なら、申し訳ありませんが、何回言われても
ダメですよ」
 章介は、巽の口元を極力見ないようにしつつ、なんと
か笑顔を作って言った。
「いや、君の話はこちらが納得したよ。いきなり分室を
作るのは、無理だとわかった」
「何の話?」
 呼び出されたものの蚊帳の外の翔子は、不満そうに巽
に聞く。
「僕を中心とした、自治会の情報を一手に管理するセク
ションを立ち上げるって計画」
「何よそれ。あたし聞いてないわよ」
「安心して、断ったから」
「当然じゃない。あんたがあたしの許可無しに、そんな
ことしていいわけ無いでしょ?」
 頬が引きつるのを感じながら、章介は続ける。
「だけど、俺はその計画をあきらめたわけじゃない。た
だ、朽縄くんが言うように、メンバーが足りないんだ。
スキルを持った、ね」
「そう、です………けど?」
 なんだか不吉な予感がして、巽は怪訝な目で章介を見た。
「そこで、だ。来年の前期を準備期間として、朽縄くん
に管理者たる能力を持った人間を、必要分育成して欲し
い」
「へ……………?」
 巽は、顎が外れんばかりに口をあんぐりと開けた。
 章介はにやりと笑う。
「それなら問題ないだろ? それとも、それでも何か問
題があるかい?」
「それは…………」
 言いかけた巽に、いままでうつむいていた望美が、急
に顔を上げ、巽の両手を取った。
「さ、坂下………」
「が、がんばる。あたし、がんばるから………おねがい
っ!」
 今までの強引さとは違った、すがりつくような目に、
巽はたじろぐ。
 助けを求めて周囲を見渡すと、目の下を少し赤くして、
いたずらっぽく笑う美央の顔が見えた。
「あたしも、ね。もちろん朽縄くんが良ければ、だけど」
 目を移すと、その横には、なんだか全てを悟ったよう
な聖母の微笑をたたえる八重の姿があった。
「私は、巽くんなら出来ると思うけど」
 さらにその横には修也の姿があったが、口を開くまで
もなく面白そうに笑っていたので、援護は望めなかった。
 そこで最後に一縷の望みを託して翔子を見ると、あろ
うことかニヤニヤと笑っているではないか。
「あたしを教えた根気があれば出来るわ。やってみなさいよ」
「翔子まで………」
 がっくりと肩を落とした巽は、章介に向かって言った。
「負けましたよ先輩。判りました。僕にどれだけ出来る
かわかりませんが、管理者育成、やってみます」
「ありがとう」
 章介は、ようやく勝利した、という晴れ晴れとした顔
で、右手を差し伸べて握手を求めた。
 ………が、その手は望美が掴んだままだったので、そ
の手は所在無く留まり、ばつが悪そうに笑って、引っ込
めざるをえなかった。
「それにしても大鳥先輩、朽縄くんに何習ってたんです
か?」
 美央が興味津々という顔で聞く。
「ふふふ、プログラムよ」
 翔子の答えに、美央は目を丸くした。
「あー、先輩だけ、抜け駆けしてたんだ」
 美央の不平に、翔子は威張って言う。
「木崎ちゃん、あたしと巽は十年以上の付き合いだよ。
今更抜け駆けなんて言ってもらっても困るのよね」
「ずるいずるい」
 二人のやりとりを見ていた巽は、ふと、ぞくりと背筋
の寒くなるのを感じて、望美を見た。
 望美はしっかりと巽の手をにぎったまま、翔子を睨ん
でいた。
 そして巽が自分を見ているのに気付くと、壮絶な笑い
を浮かべた。
「ふふふ、付き合いの長さなんかハンデじゃないわ。大
事なのはインパクトよ」
「相性と思いやり、だとあたしは思う」
 美央も負けずに言う。
「あら、包容力と理解じゃないの?」
 本気とも冗談ともつかない、八重の言葉。
「じゃ、早いモノ勝ちということで」
 言うが早いか、いきなり翔子が動いた。
 巽が気付くと、いつのまにか目を閉じた翔子の顔が、
目前にあった。
 そして唇のあたりに、温かい感触が………
「あ―――――っ!」
 望美が慌てて巽を奪還するが、巽は既に自失していた。
 その巽に、こんどは美央が抱きつく。
 望美と美央に両手を引っ張られながら、巽の頭には、
こんな言葉がうずまいていた。

    人生、いいトコだけ見て生きてりゃいいのさ
    Always look on the bright side of life.

            おしまい☆