# 39.4. `fl` --- グラフィカルユーザーインターフェースのための FORMS ライブラリ

バージョン 2.6 で非推奨: `fl` モジュールは Python 3 で削除されました。

このモジュールは、Mark Overmars による FORMS ライブラリへのインターフェースを提供します。 FORMS ライブラリのソースは anonymous FTP `ftp.cs.ruu.nl` の `SGI/FORMS` ディレクトリから入手できます。最新のテストはバージョン 2.0b で行いました。

ほとんどの関数は接頭辞の `fl_` を取ると、対応する C の関数名になります。ライブラリで使われる定数は後述の `FL` モジュールで定義されています。

Python でこのオブジェクトを作る方法は C とは少し違っています： ライブラリに保持された '現在のフォーム' に新しい FORMS オブジェクトを加えるのではなく、フォームに FORMS オブジェクトを加えるには、フォームを示す Python オブジェクトのメソッドで全て行います。したがって、C の関数の `fl_addto_form()` と `fl_end_form()` に相当するものは Python にはありませんし、 `fl_bgn_form()` に相当するものとしては `fl.make_form()` を呼び出します。

用語のちょっとした混乱に注意してください： FORMS ではフォームの中に置くことができるボタン、スライダーなどに object の用語を使います。 Python では全ての値が 'オブジェクト' です。 FORMS への Python のインターフェースによって、2つの新しいタイプの Python オブジェクト： フォームオブジェクト (フォーム全体を示します) と FORMS オブジェクト (ボタン、スライダーなどの一つひとつを示します) を作ります。おそらく、混乱するほどのことではありません。

FORMS への Python インターフェースに 'フリーオブジェクト' はありませんし、 Python でオブジェクトクラスを書いて加える簡単な方法もありません。しかし、GL イベントハンドルへの FORMS インターフェースが利用可能で、純粋な GL ウィンドウに FORMS を組み合わせることができます。

注意： `fl` をインポートすると、GL の関数 `foreground()` と FORMS のルーチン `fl_init()` を呼び出します。

## 39.4.1. `fl` モジュールに定義されている関数

`fl` モジュールには以下の関数が定義されています。これらの関数の働きに関する詳しい情報については、FORMS ドキュメントで対応する C の関数の説明を参照してください。

`fl.``make_form`(type, width, height)

  与えられたタイプ、幅、高さでフォームを作ります。これは form オブジェクトを返します。このオブジェクトは後述のメソッドを持ちます。

`fl.``do_forms`()

  標準の FORMS のメインループです。ユーザからの応答が必要な FORMS オブジェクトを示す Python オブジェクト、あるいは特別な値 `FL.EVENT` を返します。

`fl.``check_forms`()

  FORMS イベントを確認します。 `do_forms()` が返すもの、あるいはユーザからの応答をすぐに必要とするイベントがないなら `None` を返します。

`fl.``set_event_call_back`(function)

  イベントのコールバック関数を設定します。

`fl.``set_graphics_mode`(rgbmode, doublebuffering)

  グラフィックモードを設定します。

`fl.``get_rgbmode`()

  現在の RGB モードを返します。これは C のグローバル変数 `fl_rgbmode` の値です。

`fl.``show_message`(str1, str2, str3)

  3 行のメッセージと OK ボタンのあるダイアログボックスを表示します。

`fl.``show_question`(str1, str2, str3)

  3 行のメッセージと YES、NO のボタンのあるダイアログボックスを表示します。ユーザによって YES が押されたら `1` 、NO が押されたら `0` を返します。

`fl.``show_choice`(str1, str2, str3, but1[, but2[, but3]])

  3 行のメッセージと最大3つまでのボタンのあるダイアログボックスを表示します。ユーザによって押されたボタンの数値を返します (それぞれ `1` 、 `2` 、 `3`)。

`fl.``show_input`(prompt, default)

  1 行のプロンプトメッセージと、ユーザが入力できるテキストフィールドを持つダイアログボックスを表示します。 2 番目の引数はデフォルトで表示される入力文字列です。ユーザが入力した文字列が返されます。

`fl.``show_file_selector`(message, directory, pattern, default)

  ファイル選択ダイアログを表示します。ユーザによって選択されたファイルの絶対パス、あるいはユーザが Cancel ボタンを押した場合は `None` を返します。

`fl.``get_directory`()
`fl.``get_pattern`()
`fl.``get_filename`()

  これらの関数は最後にユーザが `show_file_selector()` で選択したディレクトリ、パターン、ファイル名 (パスの末尾のみ) を返します。

`fl.``qdevice`(dev)
`fl.``unqdevice`(dev)
`fl.``isqueued`(dev)
`fl.``qtest`()
`fl.``qread`()
`fl.``qreset`()
`fl.``qenter`(dev, val)
`fl.``get_mouse`()
`fl.``tie`(button, valuator1, valuator2)

  これらの関数は対応する GL 関数への FORMS のインターフェースです。 `fl.do_events()` を使っていて、自分で何か GL イベントを操作したいときにこれらを使います。FORMS が扱うことのできない GL イベントが検出されたら `fl.do_forms()` が特別の値 `FL.EVENT` を返すので、 `fl.qread()` を呼び出して、キューからイベントを読み込むべきです。対応する GL の関数は使わないでください!

`fl.``color`()
`fl.``mapcolor`()
`fl.``getmcolor`()

  FORMS ドキュメントにある `fl_color()` 、 `fl_mapcolor()` 、 `fl_getmcolor()` の記述を参照してください。

## 39.4.2. Form オブジェクト

フォームオブジェクト (上で述べた `make_form()` で返されます) には下記のメソッドがあります。各メソッドは名前の接頭辞に `fl_` を付けた C の関数に対応します；また、最初の引数はフォームのポインタです；説明は FORMS の公式文書を参照してください。

全ての `add_*()` メソッドは、 FORMS オブジェクトを示す Python オブジェクトを返します。 FORMS オブジェクトのメソッドを以下に記載します。ほとんどの FORMS オブジェクトは、そのオブジェクトの種類ごとに特有のメソッドもいくつか持っています。

`form.``show_form`(placement, bordertype, name)

  フォームを表示します。

`form.``hide_form`()

  フォームを隠します。

`form.``redraw_form`()

  フォームを再描画します。

`form.``set_form_position`(x, y)

  フォームの位置を設定します。

`form.``freeze_form`()

  フォームを固定します。

`form.``unfreeze_form`()

  固定したフォームの固定を解除します。

`form.``activate_form`()

  フォームをアクティベートします。

`form.``deactivate_form`()

  フォームをディアクティベートします。

`form.``bgn_group`()

  新しいオブジェクトのグループを作ります；グループオブジェクトを返します。

`form.``end_group`()

  現在のオブジェクトのグループを終了します。

`form.``find_first`()

  フォームの中の最初のオブジェクトを見つけます。

`form.``find_last`()

  フォームの中の最後のオブジェクトを見つけます。

`form.``add_box`(type, x, y, w, h, name)

  フォームにボックスオブジェクトを加えます。特別な追加のメソッドはありません。

`form.``add_text`(type, x, y, w, h, name)

  フォームにテキストオブジェクトを加えます。特別な追加のメソッドはありません。

`form.``add_clock`(type, x, y, w, h, name)

  フォームにクロックオブジェクトを加えます。 --- メソッド： `get_clock()` 。

`form.``add_button`(type, x, y, w, h, name)

  フォームにボタンオブジェクトを加えます。 --- メソッド： `get_button()` 、 `set_button()` 。

`form.``add_lightbutton`(type, x, y, w, h, name)

  フォームにライトボタンオブジェクトを加えます。 --- メソッド： `get_button()` 、 `set_button()` 。

`form.``add_roundbutton`(type, x, y, w, h, name)

  フォームにラウンドボタンオブジェクトを加えます。 --- メソッド： `get_button()` 、 `set_button()` 。

`form.``add_slider`(type, x, y, w, h, name)

  フォームにスライダーオブジェクトを加えます。 --- メソッド： `set_slider_value()` 、 `get_slider_value()` 、 `set_slider_bounds()` 、 `get_slider_bounds()` 、 `set_slider_return()` 、 `set_slider_size()` 、 `set_slider_precision()` 、 `set_slider_step()` 。

`form.``add_valslider`(type, x, y, w, h, name)

  フォームにバリュースライダーオブジェクトを加えます。 --- メソッド： `set_slider_value()` 、 `get_slider_value()` 、 `set_slider_bounds()` 、 `get_slider_bounds()` 、 `set_slider_return()` 、 `set_slider_size()` 、 `set_slider_precision()` 、 `set_slider_step()` 。

`form.``add_dial`(type, x, y, w, h, name)

  フォームにダイアルオブジェクトを加えます。 --- メソッド： `set_dial_value()` 、 `get_dial_value()` 、 `set_dial_bounds()` 、 `get_dial_bounds()` 。

`form.``add_positioner`(type, x, y, w, h, name)

  フォームに 2 次元ポジショナーオブジェクトを加えます。 --- メソッド： `set_positioner_xvalue()` 、 `set_positioner_yvalue()` 、 `set_positioner_xbounds()` 、 `set_positioner_ybounds()` 、 `get_positioner_xvalue()` 、 `get_positioner_yvalue()` 、 `get_positioner_xbounds()` 、 `get_positioner_ybounds()` 。

`form.``add_counter`(type, x, y, w, h, name)

  フォームにカウンタオブジェクトを加えます。 --- メソッド： `set_counter_value()` 、 `get_counter_value()` 、 `set_counter_bounds()` 、 `set_counter_step()` 、 `set_counter_precision()` 、 `set_counter_return()` 。

`form.``add_input`(type, x, y, w, h, name)

  フォームにインプットオブジェクトを加えます。 --- メソッド： `set_input()` 、 `get_input()` 、 `set_input_color()` 、 `set_input_return()` 。

`form.``add_menu`(type, x, y, w, h, name)

  フォームにメニューオブジェクトを加えます。 --- メソッド： `set_menu()` 、 `get_menu()` 、 `addto_menu()` 。

`form.``add_choice`(type, x, y, w, h, name)

  フォームにチョイスオブジェクトを加えます。 --- メソッド： `set_choice()` 、 `get_choice()` 、 `clear_choice()` 、 `addto_choice()` 、 `replace_choice()` 、 `delete_choice()` 、 `get_choice_text()` 、 `set_choice_fontsize()` 、 `set_choice_fontstyle()` 。

`form.``add_browser`(type, x, y, w, h, name)

  フォームにブラウザオブジェクトを加えます。 --- メソッド： `set_browser_topline()` 、 `clear_browser()` 、 `add_browser_line()` 、 `addto_browser()` 、 `insert_browser_line()` 、 `delete_browser_line()` 、 `replace_browser_line()` 、 `get_browser_line()` 、 `load_browser()` 、 `get_browser_maxline()` 、 `select_browser_line()` 、 `deselect_browser_line()` 、 `deselect_browser()` 、 `isselected_browser_line()` 、 `get_browser()` 、 `set_browser_fontsize()` 、 `set_browser_fontstyle()` 、 `set_browser_specialkey()` 。

`form.``add_timer`(type, x, y, w, h, name)

  フォームにタイマーオブジェクトを加えます。 --- メソッド： `set_timer()` 、 `get_timer()` 。

フォームオブジェクトには以下のデータ属性があります；FORMS ドキュメントを参照してください:

名前 | C の型 | 意味
--- | --- | ---
`window` | int (read-only) | GL ウィンドウの id
`w` | float | フォームの幅
`h` | float | フォームの高さ
`x` | float | フォーム左肩の x 座標
`y` | float | フォーム左肩の y 座標
`deactivated` | int | フォームがディアクティベートされているなら非ゼロ
`visible` | int | フォームが可視なら非ゼロ
`frozen` | int | フォームが固定されているなら非ゼロ
`doublebuf` | int | ダブルバッファリングがオンなら非ゼロ

## 39.4.3. FORMS オブジェクト

FORMS オブジェクトの種類ごとに特有のメソッドの他に、全ての FORMS オブジェクトは以下のメソッドも持っています:

`FORMS object.set_call_back(function, argument)`

  オブジェクトのコールバック関数と引数を設定します。オブジェクトがユーザからの応答を必要とするときには、コールバック関数は 2 つの引数、オブジェクトとコールバックの引数とともに呼び出されます。 (コールバック関数のない FORMS オブジェクトは、ユーザからの応答を必要とするときには `fl.do_forms()` あるいは `fl.check_forms()` によって返されます。) 引数なしにこのメソッドを呼び出すと、コールバック関数を削除します。

`FORMS object.delete_object()`

  オブジェクトを削除します。

`FORMS object.show_object()`

  オブジェクトを表示します。

`FORMS object.hide_object()`

  オブジェクトを隠します。

`FORMS object.redraw_object()`

  オブジェクトを再描画します。

`FORMS object.freeze_object()`

  オブジェクトを固定します。

`FORMS object.unfreeze_object()`

  固定したオブジェクトの固定を解除します。

FORMS オブジェクトには以下のデータ属性があります； FORMS ドキュメントを参照してください。

名前 | C の型 | 意味
--- | --- | ---
`objclass` | int (read-only) | オブジェクトクラス
`type` | int (read-only) | オブジェクトタイプ
`boxtype` | int | ボックスタイプ
`x` | float | 左肩の x 座標
`y` | float | 左肩の y 座標
`w` | float | 幅
`h` | float | 高さ
`col1` | int | 第 1 の色
`col2` | int | 第 2 の色
`align` | int | 配置
`lcol` | int | ラベルの色
`lsize` | float | ラベルのフォントサイズ
`label` | string | ラベルの文字列
`lstyle` | int | ラベルのスタイル
`pushed` | int (read-only) | (FORMS ドキュメント参照)
`focus` | int (read-only) | (FORMS ドキュメント参照)
`belowmouse` | int (read-only) | (FORMS ドキュメント参照)
`frozen` | int (read-only) | (FORMS ドキュメント参照)
`active` | int (read-only) | (FORMS ドキュメント参照)
`input` | int (read-only) | (FORMS ドキュメント参照)
`visible` | int (read-only) | (FORMS ドキュメント参照)
`radio` | int (read-only) | (FORMS ドキュメント参照)
`automatic` | int (read-only) | (FORMS ドキュメント参照)

# 39.5. `FL` --- `fl` モジュールで使用される定数

バージョン 2.6 で非推奨: `FL` モジュールは Python 3 で削除されました。

このモジュールには、組み込みモジュール `fl` を使うのに必要なシンボル定数が定義されています (上記参照) ；これらは名前の接頭辞 `FL_` が省かれていることを除いて、C のヘッダファイル `<forms.h>` に定義されているものと同じです。定義されている名称の完全なリストについては、モジュールのソースをご覧ください。お勧めする使い方は以下の通りです：

    import fl
    from FL import *

# 39.6. `flp` --- 保存された FORMS デザインをロードする関数

バージョン 2.6 で非推奨: `flp` モジュールは Python 3 で削除されました。

このモジュールには、FORMS ライブラリ (上記の `fl` モジュールを参照してください) とともに配布される 'フォームデザイナー' (fdesign) プログラムで作られたフォームの定義を読み込む関数が定義されています。

今のところは、詳しくは Python ライブラリソースのディレクトリの中の `flp.doc` を参照してください。

XXX A complete description should be inserted here!