第10回(12/4) Tkライブラリ ・ウィジェット、ジオメトリ、ルーチンの割り当て ■ 用語説明 【tk】ToolKit の略、グラフィカルユーザインタフェース(GUI)ライブラリの一種。 【ウィジェット(widget)】 window gadget(ウインドウ装置)に由来する言葉で、ウインドウ、ボタン、バーなどの部品。 【ジオメトリ(geometry)】 ウィジェットの位置。 ■ tk を用いたプログラムの作成要領(入門用) (まず、紙の上で設計しよう) 1. ウィジェットの種類: アプリケーションの基盤となるウインドウ、「ファイル」、「編集」、「表示」などのメニュー、「yes」、「no」、「cancel」などのボタン、など必要なウィジェットを準備する。 2. ウィジェットの機能: ボタンやメニューを押したり選択したりしたときに、どんなプログラムを動かすのか決める。 3. ジオメトリ: 使い易さを考えながら、ウィジェットの配置を決める。 (次に、コーディングをしよう) 4. 各ウィジェットのインスタンス生成: new( … ) でインスタンスを作るとき、機能の定義をする。 5. ウィジェットの配置: 各ウィジェットの持つ pack メソッドを使い、ジオメトリを指定する。 また、各種メソッドを使い、ウィジェット同士の結合などを行う。 (表示エリアのウィジェットとスクロールバーウィジェットの結合など。) 6. 動作開始: Tk.mainloop のステートメントにより定義したウィジェットの実行を始める。 ■ 例題1 以下の仕様を満たすウインドウを作れ: 「○」ボタンと「×」ボタンのウィジェットを作る。 「○」ボタンを押すとkterm上に「こんにちは、世界」を表示する。 「×」ボタンを押すと終了する。 ⇒ list1001.rb ■ 主なウィジット一覧表 =========================================================================== 名称 クラス名 機能・用途 --------------------------------------------------------------------------- (ウインドウ系) ルート TkRoot 表示用のウインドウを扱う。 自動的に使われる。 フレーム TkFrame 複数のウィジットを扱う。 トップレベル TkToplevel 警告のウインドウなどに使う。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (ボタン系) ボタン TkButton 押しボタン チェックボタン TkCheckButton 選択用ボタン(ボタンの複数選択可) ラジオボタン TkRadioButton 選択用ボタン(ボタンの複数選択不可) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (メニュー系) メニュー TkMenu メニューの表示用。 メニューボタン TkMenubutton メニューの動作定義用。ボタンウィ ジットの様に表示・動作を指定する。 メニューバー TkMenubar メニュー表示と動作を定義する。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (入力系) エントリ TkEntry 一行入力を受け付ける。 (出力系) ラベル TkLabel ウインドウに表示する。 メッセージ TkMessage 自動整形つき複数行表示。 テキスト TkText とても強力なテキスト表示。 キャンバス TkCanvas 図形や、ウィジェットの自由な 配置が可能な表示用ウィジェット - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (その他) スクロールバー TkScrollbar テキストウィジェットなどと連結して 使う。 スケール TkScale いわゆるスライダ。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (特殊) 変数 TkVariable --------------------------------------------------------------------------- □□□ 演習1 □□□ list1001.rb に次のように「△」ボタンを追加しよう。△ボタンは、「こんにちは、世界」と表示し終了する(exit)機能があり、○ボタンと×ボタンの中間に配置する。 ⇒ prac1001.rb ※ できた人は、下記のpackの使い方を読んで、3つのボタンを縦に並べたり、L字型(できるかな?)に並べたりしてみよう。また、○や×の字数を変えて、fill指定を使ってみよう。 ★ pack の使い方 ・'side' 指定: - ウィジェットをウインドウの空き部分に詰めて配置するための方向 - 'top'、'bottom'、'left'、'right'は、上よせ、下よせ、左よせ、右よせの意味 ・'fill' 指定: - ウィジェットを配置したとき、隙間の指定 - 'x'、'y'、'both'は、横方向を埋める、縦方向を埋める、両方向を埋めるの意味 ■ Tk変数オブジェクト ウィジェットの情報を伝達するための変数。 使い方: ・x = TkVariable.new # 変数1つ分を確保 ・x.value = 'abc' # 代入できる。(数字は自動で文字列に変換されて代入される) ・puts x.value # 参照できる。 ウィジェットから情報をもらうには、具体例を参照。 ⇒ list1002.rb □□□ 演習2 □□□ 4桁2進数を10進数に変換し表示するウインドウを作れ: チェックボタンを4つ、「計算」ボタンを1つを1つ用意する。 「計算」ボタンを押すと、チェックボタンの状態に応じた10進数の値をkterm上に表示する なお、チェックボタンの 'text' は指定しないでよい。 ⇒ prac1002.rb ★Tk変数オブジェクトは、 ・あるウィジェットで値が更新されると、それを参照している別のウィジェットにも伝播する。 (チェックボックスの各値が、計算ボタンのプログラムに届いている。) → 'command' のところではプログラムを書いただけで実行しておらず、Tk.mainloop で実行されている、という点に注意! ■ 入力覧と出力覧 入力覧は、TkEntry を使う。「'textvariable'=>Tk変数」とすることで、入力した文字列をTk変数に格納できる。 出力覧は、幾つかの方法がある。 ・比較的短いテキストの出力:TkLabel 固定的テキストの出力 - - -'text'=>文字列 変数値の出力 - - - - - - -'textvariable'=>Tk変数 ・長めだが、装飾のないテキストの出力:TkMessage TkLabelを継承するクラス。 'justify' => 表示位置('left','center','right') 'aspect' => 表示幅(画素数) ※ ちなみに、TkButton も TkLabel を継承するクラス。 = 同様の指定('textvariable'など)が可能。 ・長めで、装飾のあるテキストの出力:TkText TkText のインスタンスに、insert(位置,文字列) として、出力する。 ⇒ list1003.rb ■ 宿題 ■ 以下のプログラムを作成し、プログラムリスト、各行に対する手書きのコメント、および、実行結果を提出せよ。 list1003.rb を改造して、入力文をファイルに保存する機能を追加しよう。 まず、全文を蓄える Tk変数 buffer を用意する。Enterボタンを押すと、insert で表示後に、この Tk変数に追加することにする(buffer.value += x.value)。 次に、保存は、save ボタンで実行する。これを押すと、既に用意しているエントリウィジェットの文字列をファイル名とみなして、ファイルを開く(fp=File::open(x.value,'w'))。そして、buffer の各行をファイルに出力するする。ファイルへの出力は、fp.print とすればよい。なお、すべてを出力すると、fp.close によりファイルを閉じること。 ⇒ work1001.rb ※ 演習1おまけのL字型は、pack ジオメトリマネージャではできません。できた人は教えてください。