tksimple_gui.py ライブラリの技術ドキュメント

ライブラリの機能や目的

tksimple_gui.py は、Pythonの標準GUIライブラリである tkinter を使用したグラフィカルユーザーインターフェース(GUI)の作成を簡素化するためのユーティリティライブラリです。特に、GUIウィジェットの定義と管理、ユーザー入力とプログラム変数の連携、および基本的なGUIレイアウトの構築を容易にすることを目的としています。

主な機能は以下の通りです。

  • 宣言的なウィジェット定義: 辞書のリストを用いて、EntryButtonLabelListboxComboboxCheckboxRadiobutton、ファイルパス選択などの様々なウィジェットを容易に定義し、配置できます。

  • 変数との自動連携: 定義したウィジェットとプログラム内の変数を、ウィジェットタイプに応じて StringVarIntVarDoubleVarBooleanVar などの tkinter 変数を通して自動的に連携させ、ウィジェットからの入力をプログラム変数に反映させることが可能です。

  • カスタムダイアログの簡素化: tkinter.simpledialog.Dialog を拡張し、宣言的に定義されたウィジェットリストに基づいてカスタム設定ダイアログを簡単に作成できます。

  • 基本的なレイアウト補助: ツールバー、ペイン分割(PanedWindow)、タブ付きインターフェース(Notebook)といった一般的なGUIレイアウトの構築を補助する機能を提供します。

  • スクロール可能なリストボックス: 標準の Listbox にスクロール機能を追加した tkScrolledListbox を提供します。

このライブラリは、複雑な tkinter のAPIを直接操作することなく、構造化された方法でGUIを構築したい開発者にとって有用です。特に、設定画面やデータ入力フォームなど、定型的なGUI要素を迅速に作成する場合に、コードの記述量を減らし、可読性を向上させることを目指しています。

importする方法

このライブラリを他のPythonプログラムから利用するには、通常のモジュールimport文を使用します。

import tksimple_gui

# ライブラリ内の関数やクラスを使用する例
# 例えば、tkWidgets クラスを利用する場合:
# from tksimple_gui import tkWidgets

必要な非標準ライブラリとインストール方法

このライブラリは tklib という非標準ライブラリに依存しています。 tkinter 自体はPythonの標準ライブラリですが、tksimple_gui.pytklib.tkimport を介して tkinter をロードしています。

tklibpip コマンドでインストールできます。

pip install tklib

importできる変数と関数

以下は、tksimple_gui.py モジュールから直接インポートできる主要な変数、関数、およびクラスです。


関数

get_window_from_plt(plt)

  • 動作: matplotlib.pyplot オブジェクトから、関連する tkinter ウィンドウオブジェクトを取得します。これは、matplotlib のプロットを tkinter アプリケーションに組み込む際に、ルートウィンドウへの参照が必要な場合に役立ちます。

  • 引数:

    • plt (module): matplotlib.pyplot モジュール、または matplotlib.figure.Figure のマネージャーオブジェクトにアクセスできるオブジェクト。

  • 戻り値: tkinter のルートウィンドウオブジェクト。

show_varibles(config)

  • 動作: 指定された config オブジェクトの属性のうち、アンダースコア (_) で始まらず、かつcallable(関数やメソッド)ではない、そしてリストやタプルではない属性のキー、値、型を標準出力に表示します。デバッグや設定内容の確認に有用です。

  • 引数:

    • config (object): 表示する属性を持つ任意のオブジェクト(通常は tkParams のインスタンス)。

  • 戻り値: None

update_variables(config, vars)

  • 動作: add_widgets 関数によって config オブジェクトに格納された tkinter 変数(例えば tk.StringVar, tk.IntVar など、var_ プレフィックスを持つ属性)から現在の値を取得し、その値を対応する vars オブジェクトの属性に設定します。これにより、GUIウィジェットでのユーザー入力をプログラム内の変数に反映させることができます。

  • 引数:

    • config (object): add_widgets によって生成されたウィジェット変数を持つ設定オブジェクト。

    • vars (object): ウィジェットから取得した値を設定する変数オブジェクト。

  • 戻り値: None

add_widgets(parent, widgets, vars=None, config=None, **kwargs)

  • 動作: Tkinterの親ウィジェット (parent) 内に、widgets の定義に従って複数のGUIウィジェットを動的に追加します。ウィジェットは、辞書のリストで定義され、フレームごとにグループ化されます。vars が提供された場合、vars オブジェクトのメンバ変数の値がウィジェットの初期値として設定されます。config オブジェクトは、作成されたフレーム、ウィジェットオブジェクト、およびそれらに関連する tkinter 変数を保持するために使用されます。

  • 引数:

    • parent (tk.Widget): ウィジェットを追加する親Tkinterウィジェット(例: tk.Frame, tk.Tk)。

    • widgets (list of list of dict): 追加するウィジェットの定義の多次元リスト。外側のリストはフレームを表し、内側のリストは各フレーム内のウィジェットの定義辞書を含みます。各ウィジェット定義辞書は、以下のキーを持つことができます:

      • "type" (str, 必須): ウィジェットのタイプ("widget", "button", "label", "entry", "listbox", "combobox", "checkbox", "radiobutton", "path")。

      • "widget_type" (str, オプション, デフォルト: "widget"): type"widget" の場合に、config に格納される属性名のプレフィックス。

      • "varname" (str, オプション): ウィジェットに関連付けられる変数の名前。config オブジェクト内では var_{varname} として、vars オブジェクト内では {varname} としてアクセスされます。

      • "vartype" (str, オプション, デフォルト: "str"): entry ウィジェットで変数を作成する際の変数の型("str", "float", "int", "bool")。

      • "value" (any, オプション): ウィジェットの初期値。

      • "label" (str, オプション, デフォルト: "no text"): label ウィジェットのテキスト。

      • "text" (str, オプション, デフォルト: "no text"): button, checkbox ウィジェットのテキスト。

      • "width" (int, オプション): ウィジェットの幅。

      • "height" (int, オプション): ウィジェットの高さ。

      • "command" (callable, オプション): button ウィジェットでクリック時に実行される関数、または path ウィジェットのボタンコマンド。

      • "options" (list, オプション): listbox, combobox, radiobutton ウィジェットの選択肢。

      • "sel" (int or str, オプション): listbox, combobox, radiobutton の初期選択。

      • "state" (str, オプション): entry ウィジェットの状態(例: "readonly", "disabled")。

      • "save_dialog" (bool, オプション, デフォルト: False): path ウィジェットでファイル選択ダイアログを保存用にするか開く用にするか。

      • "file_types" (list of tuple, オプション, デフォルト: [("all", "*")]): path ウィジェットのファイル選択ダイアログで表示するファイルタイプ。

      • "initial_dir" (str, オプション, デフォルト: .): path ウィジェットのファイル選択ダイアログの初期ディレクトリ。

      • "title" (str, オプション, デフォルト: "Choose file"): path ウィジェットのファイル選択ダイアログのタイトル。

      • "side" (str, オプション, デフォルト: "left"): pack メソッドの side 引数。

      • "anchor" (str, オプション): pack メソッドの anchor 引数。

      • "expand" (bool, オプション): pack メソッドの expand 引数。

      • "fill" (str, オプション): pack メソッドの fill 引数。

    • vars (object, オプション): ウィジェットの初期値として使われ、ウィジェットからの入力が格納される変数オブジェクト。デフォルトは config と同じ。

    • config (tkParams, オプション): 作成されたウィジェットや関連する tkinter 変数を格納するための設定オブジェクト。デフォルトは新しい tkParams オブジェクト。

    • **kwargs: top_frame.pack() に渡される追加のキーワード引数。

  • 戻り値:

    • top_frame (tk.Frame): 全てのウィジェットを格納する最上位のフレーム。

    • config (tkParams): ウィジェットの参照(例: button_{name})、ウィジェットに関連付けられた tkinter 変数(例: var_{varname})、およびフレームのリスト (config.frames) を含む設定オブジェクト。


クラス

tkScrolledListbox

  • 目的: tkinter.Listbox に垂直スクロールバーの機能を追加したカスタムウィジェットです。

  • 継承: tk.Listbox

  • 初期化メソッド: __init__(self, master, **key)

    • 引数:

      • master (tk.Widget): このリストボックスの親ウィジェット。

      • **key: tkinter.Listbox のコンストラクタに渡される任意のキーワード引数。

  • メソッド:

    • clear(self)

      • 動作: リストボックス内の全ての項目を削除します。

      • 引数: なし

      • 戻り値: なし

CustomDialog_with_config

  • 目的: tkinter.simpledialog.Dialog を拡張し、add_widgets 関数を使用して宣言的に定義されたウィジェットに基づいて、設定入力用のカスタムダイアログを作成します。

  • 継承: tkinter.simpledialog.Dialog

  • 初期化メソッド: __init__(self, master, config, vars, title = None)

    • 3重引用符内ドキュメント: 「A custom dialog class that extends the simpledialog.Dialog class using config. Args: master: The parent widget for the dialog. config: An object representing the configuration. config.widgets: A list of widgets to display in the dialog. The list is a list of dictionalies of widget configurations, which refer to the variable names, types and values in vars. vars: An object of variables. title: The title of the dialog (optional).」

    • 引数:

      • master (tk.Widget): ダイアログの親ウィジェット。

      • config (object): 設定オブジェクト。このオブジェクトの config.widgets 属性には、add_widgets 関数で定義されるウィジェットのリストが含まれている必要があります。

      • vars (object): ウィジェットからの入力値を格納するための変数オブジェクト。

      • title (str, オプション): ダイアログのタイトル。

  • メソッド:

    • body(self, master)

      • 動作: ダイアログの本体部分を構築します。add_widgets 関数を呼び出し、self.config.widgets に基づいてウィジェットを配置します。

      • 引数:

        • master (tk.Widget): ダイアログのボディとなるフレーム。

      • 戻り値: なし

    • apply(self)

      • 動作: ダイアログが「OK」ボタンなどで閉じられた際に呼び出され、ダイアログ内のウィジェット(特に entry タイプ)から現在の値を取得し、self.vars オブジェクトの対応する属性に更新します。型変換には tklib.tkutils.pconv_by_type が使用されます。

      • 引数: なし

      • 戻り値: なし(self.config.retTrue に設定)。

tkWidgets

  • 目的: Tkinter GUIの構築をより高レベルで抽象化し、構造化された方法でコンポーネントを追加するためのヘルパークラスです。tkParams オブジェクトを使用して設定と変数を管理します。

  • 継承: tklib.tkobject.tkObject

  • 初期化メソッド: __init__(self, parent = None, plt = None, config = None, vars = None)

    • 引数:

      • parent (tk.Widget, オプション): このウィジェット群が配置される親ウィジェット。

      • plt (module, オプション): matplotlib.pyplot モジュールへの参照(get_window_from_plt で使用)。

      • config (tkParams, オプション): 設定を保持するための tkParams オブジェクト。デフォルトは新しい tkParams インスタンス。

      • vars (tkParams, オプション): 変数を保持するための tkParams オブジェクト。デフォルトは新しい tkParams インスタンス。

  • メソッド:

    • set_font(self, family = "Helvetica", size = 10, weight = "normal")

      • 動作: 親ウィジェットとその全ての子ウィジェットのデフォルトフォントを設定します。

      • 引数:

        • family (str, オプション, デフォルト: "Helvetica"): フォントファミリー。

        • size (int, オプション, デフォルト: 10): フォントサイズ。

        • weight (str, オプション, デフォルト: "normal"): フォントの太さ("normal" または "bold")。

      • 戻り値: なし

    • add_toolbar(self, parent = None)

      • 動作: ツールバーとして使用できる tk.Frame を追加し、上部にパックします。

      • 引数:

        • parent (tk.Widget, オプション): ツールバーを追加する親ウィジェット。指定がない場合は、インスタンスの self.parent を使用します。

      • 戻り値: tk.Frame: 作成されたツールバーフレーム。

    • add_paned_window(self, parent = None, width = None, sashwidth = 2)

      • 動作: 左右に分割された tk.PanedWindow を追加し、その中に2つの tkinter.ttk.Notebook ウィジェットを配置します。これにより、分割されたレイアウトでタブ付きインターフェースを簡単に構築できます。

      • 引数:

        • parent (tk.Widget, オプション): ペインウィンドウを追加する親ウィジェット。指定がない場合は、インスタンスの self.parent を使用します。

        • width (int, オプション): 左側のノートブックの幅。

        • sashwidth (int, オプション, デフォルト: 2): ペインの分割線(サッシュ)の幅。

      • 戻り値:

        • main_pane (tk.PanedWindow): メインのペインウィンドウ。

        • left_notebook (ttk.Notebook): 左側のノートブックウィジェット。

        • right_notebook (ttk.Notebook): 右側のノートブックウィジェット。

    • add_tab(self, parent = None)

      • 動作: タブ付きインターフェースとして使用できる tkinter.ttk.Notebook ウィジェットを親ウィジェットに追加します。

      • 引数:

        • parent (tk.Widget, オプション): ノートブックを追加する親ウィジェット。指定がない場合は、インスタンスの self.parent を使用します。

      • 戻り値: ttk.Notebook: 作成されたノートブックウィジェット。

    • add_page(self, notebook = None, title = "main", bg = 'dim gray')

      • 動作: 指定された notebook ウィジェットに新しいページ(タブ)を追加し、そのページ用の tk.Frame を返します。

      • 引数:

        • notebook (ttk.Notebook, オプション): ページを追加するノートブックウィジェット。指定がない場合は、インスタンスの self.notebook を使用します。

        • title (str, オプション, デフォルト: "main"): ページのタブに表示されるタイトル。

        • bg (str, オプション, デフォルト: 'dim gray'): ページフレームの背景色。

      • 戻り値: tk.Frame: 新しく作成されたページフレーム。

    • get_window_from_plt(self, plt)

      • 動作: matplotlib.pyplot オブジェクトから、関連する tkinter ウィンドウオブジェクトを取得し、それをインスタンスの self.plt に設定します。これは、グローバル関数 get_window_from_plt のラッパーです。

      • 引数:

        • plt (module): matplotlib.pyplot モジュール、または matplotlib.figure.Figure のマネージャーオブジェクトにアクセスできるオブジェクト。

      • 戻り値: tkinter のルートウィンドウオブジェクト。

    • add_widgets(self, parent, widgets, vars = None, config = None, **kwargs)

      • 動作: グローバル関数 add_widgets のラッパーです。ウィジェットを追加する際に、インスタンスの self.configself.vars をデフォルト値として使用できるようにします。

      • 引数:

        • parent (tk.Widget): ウィジェットを追加する親Tkinterウィジェット。

        • widgets (list of list of dict): 追加するウィジェットの定義の多次元リスト。add_widgets 関数の説明を参照してください。

        • vars (object, オプション): add_widgets に渡す変数オブジェクト。デフォルトはインスタンスの self.vars

        • config (tkParams, オプション): add_widgets に渡す設定オブジェクト。デフォルトはインスタンスの self.config

        • **kwargs: add_widgets に渡される追加のキーワード引数。

      • 戻り値: add_widgets 関数と同じく、top_frameconfig オブジェクト。

    • show_varibles(self, vars, heading = None)

      • 動作: グローバル関数 show_varibles のラッパーです。指定された vars オブジェクトの属性を表示します。

      • 引数:

        • vars (object): 表示する属性を持つ任意のオブジェクト。

        • heading (str, オプション): 表示の前に出力される見出しテキスト。

      • 戻り値: なし

    • update_variables(self, config = None, vars = None)

      • 動作: グローバル関数 update_variables のラッパーです。ウィジェットの値をプログラム変数に更新する際に、インスタンスの self.configself.vars をデフォルト値として使用できるようにします。

      • 引数:

        • config (object, オプション): update_variables に渡す設定オブジェクト。デフォルトはインスタンスの self.config

        • vars (object, オプション): update_variables に渡す変数オブジェクト。デフォルトはインスタンスの self.vars

      • 戻り値: なし


main scriptとして実行したときの動作

tksimple_gui.py には if __name__ == "__main__": ブロックが存在しないため、このファイルを直接Pythonインタプリタで実行しても、特別な動作は定義されていません。このファイルは、他のPythonスクリプトからインポートして利用されるライブラリとして設計されています。