tkapplication_gui.py 技術ドキュメント
ライブラリの機能や目的
tkapplication_gui.py は、tklib.tkapplication.tkApplication を基盤として、Tkinterを用いたグラフィカルユーザーインターフェース(GUI)アプリケーションを構築するための高レベルな機能を提供するライブラリです。
このライブラリの主な目的は以下の通りです。
GUIアプリケーションの基盤提供: Tkinterウィンドウ、メニュー、ツールバー、ペイン分割といった基本的なGUI要素の作成・管理を簡素化します。
設定管理の統合: ユーザー設定やアプリケーションパラメータを効率的に管理し、GUIを通じて設定を変更・保存する機能を提供します。
開発・デバッグ支援: アプリケーションの内部状態(設定パラメータ、Tkinter変数、環境変数など)をGUI上で確認できる開発者向けのタブや、コードをインタラクティブに実行できるエディタ機能を提供します。
外部アプリケーション連携: システムにインストールされているエディタ、シェル、ファイルマネージャーなどの外部アプリケーションのパスを自動的に検出し、連携を容易にします。
一貫したユーザーエクスペリエンス: 終了確認ダイアログや設定ダイアログなど、一般的なGUIアプリケーションで必要とされる機能を提供し、一貫したユーザーエクスペリエンスの実現をサポートします。
これにより、開発者はTkinterアプリケーションの定型的なコード記述を減らし、アプリケーションの主要なロジックに集中できるようになります。
importする方法
このライブラリの tkApplication_GUI クラスを他のPythonプログラムからインポートするには、以下のいずれかの方法を使用します。
# 1. クラス名を直接インポートする場合
from tkapplication_gui import tkApplication_GUI
# 2. モジュール全体をインポートし、モジュール名経由でアクセスする場合
import tkapplication_gui
必要な非標準ライブラリとインストール方法
tkapplication_gui.py を使用するために必要な非標準ライブラリと、そのインストール方法を以下に示します。
matplotlib:目的: グラフ描画機能を提供します(
matplotlib.use('TkAgg')が使用されているため、Tkinterバックエンドで描画するために必要です)。インストール方法:
pipコマンドでインストールできます。pip install matplotlib
tklib:目的: このライブラリの基盤となる
tkApplicationクラスや、Tkinterユーティリティ (tktkinter)、パラメータ管理 (tkParams) など、共通のユーティリティ機能を提供します。インストール方法:
tklibは一般的なPyPIパッケージではない可能性があります。もしプロジェクト内で提供されるカスタムライブラリである場合は、tkapplication_gui.pyと同じ環境で利用できるようにパスを設定するか、プロジェクトの指示に従ってインストールしてください。もしpipでインストール可能な場合は、以下のコマンドでインストールできます。pip install tklib
補足:
tkinterとtkinter.ttkはPythonの標準ライブラリに含まれています。ただし、OSによってはTkinterをサポートするための追加パッケージ(例: Linuxのpython3-tk)のインストールが必要な場合があります。
importできる変数と関数
tkapplication_gui.py モジュールから直接インポートして利用できる主要なエンティティは、tkApplication_GUI クラスのみです。このクラスは tkApplication を継承しており、GUI関連の追加機能を提供します。
クラス: tkApplication_GUI
tkApplication クラスを継承し、TkinterベースのGUIアプリケーション構築のための機能を提供します。
クラス属性:
tkvars:tkParamsのインスタンス。Tkinterウィジェットに関連付けられたtkinter.StringVar,tkinter.IntVarなどの変数を管理します。これらの変数はGUIの状態とデータのバインディングに使用されます。
メソッド:
__init__(self, usage_str="", _globals=None, locals=None, use_user_inifile=False, **args)動作:
tkApplication_GUIクラスのコンストラクタです。親クラスtkApplicationのコンストラクタを呼び出し、GUIに関連する初期設定(self.tkvarsの初期化など)を行います。引数:
usage_str(str, optional): アプリケーションの利用方法を示す文字列。デフォルトは空文字列。_globals(dict, optional): グローバル変数の辞書。通常はglobals()を渡します。locals(dict, optional): ローカル変数の辞書。通常はlocals()を渡します。use_user_inifile(bool, optional): ユーザー設定ファイルを使用するかどうか。デフォルトはFalse。**args: 親クラスtkApplicationに渡される任意のキーワード引数。
戻り値: なし。
__del__(self)動作: デストラクタです。親クラスのデストラクタを呼び出します。
引数: なし。
戻り値: なし。
__str__(self)動作: オブジェクトの文字列表現を返します。
引数: なし。
戻り値:
self.ClassPath()メソッドによって生成されたクラスのパス (str)。
get_tkvars_dict(self)動作:
self.tkvarsに格納されているTkinter変数を通常のPython辞書として取得します。引数: なし。
戻り値: Tkinter変数のキーと値のペアを含む辞書 (dict)。
get_tkvar(self, key, defval=None)動作: 指定されたキーに対応するTkinter変数 (
self.tkvars内) を取得します。もし変数が存在しない場合は、defvalで初期化して設定し、その新しい変数を返します。引数:
key(str): 取得または設定する変数名。defval(any, optional): 変数が存在しない場合に設定するデフォルト値。デフォルトはNone。
戻り値:
self.tkvarsから取得または設定された変数オブジェクト。
mainloop(self)動作: Tkinterイベントループを開始します。これにより、GUIアプリケーションがユーザーからの入力に応答できるようになります。
引数: なし。
戻り値: なし。
get_screen_size(self)動作: メインウィンドウ (
self.root_window) のスクリーンサイズ(幅と高さ)を取得します。引数: なし。
戻り値: スクリーン幅 (int) とスクリーン高さ (int) のタプル。
注: コード内の
winfo_screenhightはwinfo_screenheightのタイプミスの可能性がありますが、ドキュメントは提供されたコードに忠実です。
get_geometry(self, window=None)動作: 指定されたウィンドウ、またはデフォルトでメインウィンドウのジオメトリ文字列と個別の幅、高さ、X座標、Y座標を取得します。
引数:
window(tkinter.Widget, optional): ジオメトリを取得する対象のウィンドウ。デフォルトはself.root_window。
戻り値: ジオメトリ文字列 (str)、幅 (str)、高さ (str)、X座標 (strまたはNone)、Y座標 (strまたはNone) のタプル。
set_geometry(self, window=None, geo=None, w=None, h=None, x0=None, y0=None)動作: 指定されたウィンドウ、またはデフォルトでメインウィンドウのジオメトリを設定します。ジオメトリは完全な文字列
geoで指定することも、個別の幅w、高さh、X座標x0、Y座標y0で指定することもできます。引数:
window(tkinter.Widget, optional): ジオメトリを設定する対象のウィンドウ。デフォルトはself.root_window。geo(str, optional):WxH+X+Y形式の完全なジオメトリ文字列。w(int, optional): 幅。h(int, optional): 高さ。x0(int, optional): X座標。y0(int, optional): Y座標。
戻り値: なし。
注: コード内の
set_geometoryはset_geometryのタイプミスの可能性がありますが、ドキュメントは提供されたコードに忠実です。
dialog_setup(self, title='Setup', parent=None, entry_width=30, button_width=4, edit_button_width=2, shell_button_width=0, widgets='editor_path|confirm_on_exit|debug_mode', font_size=10, is_print=False)動作: アプリケーションの設定(エディタパス、終了確認、デバッグモードなど)を編集するための設定ダイアログを表示します。
引数:
title(str, optional): ダイアログのタイトル。デフォルトは'Setup'。parent(tkinter.Widget, optional): ダイアログの親ウィンドウ。デフォルトはself.root_window。entry_width(int, optional): 入力フィールドの幅。デフォルトは30。button_width(int, optional): ボタンの幅。デフォルトは4。edit_button_width(int, optional): 編集ボタンの幅。デフォルトは2。shell_button_width(int, optional): シェルボタンの幅。デフォルトは0。widgets(str, optional): ダイアログに表示するウィジェットをパイプ (|) で区切った文字列。デフォルトは'editor_path|confirm_on_exit|debug_mode'。font_size(int, optional): フォントサイズ。デフォルトは10。is_print(bool, optional): 設定の変更をコンソールに出力するかどうか。デフォルトはFalse。
戻り値: なし。
on_closing(self, do_confirm=None)動作: ウィンドウが閉じられようとしているときに呼び出されるイベントハンドラです。終了確認ダイアログを表示し、ユーザーの選択に応じてアプリケーションを終了します。
引数:
do_confirm(bool, optional): 終了確認ダイアログを表示するかどうかを明示的に指定します。Noneの場合、self.configparams.confirm_on_exitの設定を使用します。
戻り値: なし。
PanedWindow1(self, main_pane_args={})動作: ルートウィンドウ内に単一の
tkinter.PanedWindowを作成し、それをアプリケーションのメインペインとして設定します。引数:
main_pane_args(dict, optional): メインペインに渡す追加の引数。例えば{'sashwidth': 2}など。
戻り値: 作成された
tkinter.PanedWindowインスタンス。
PanedWindow2(self, main_pane_args={}, left_pane_args={}, right_pane_args={})動作: ルートウィンドウ内に
tkinter.PanedWindowを作成し、その中に左右2つのtkinter.ttk.Notebookを配置します。これは一般的な2ペインレイアウトを作成するために使用されます。引数:
main_pane_args(dict, optional): メインペインに渡す追加の引数。left_pane_args(dict, optional): 左側のノートブックに渡す追加の引数。right_pane_args(dict, optional): 右側のノートブックに渡す追加の引数。
戻り値: 作成された [メインペイン (tkinter.PanedWindow), 左ノートブック (tkinter.ttk.Notebook), 右ノートブック (tkinter.ttk.Notebook)] のリスト。
add_root_panes(self, root=None, type='', sashwidth=2, left_pane_width=50)動作: ルートウィンドウに指定されたタイプのペインレイアウトを追加します。
引数:
root(tkinter.Widget, optional): ペインを追加するルートウィジェット。デフォルトはself.root_window。type(str, optional): 作成するペインのタイプ。''(空文字列): ルートウィンドウ自体を返します。'pane1': 単一のtkinter.ttk.Notebookを作成し、これをルートペインとします。'pane2': 2ペインのPanedWindowレイアウト (左右のノートブック) を作成します。
sashwidth(int, optional): ペインのサッシの幅。デフォルトは2。left_pane_width(int, optional):'pane2'タイプの場合の左ペインの初期幅。デフォルトは50。
戻り値: 作成されたペインウィジェットのリスト。
move_top(self, f=True)動作: アプリケーションのメインウィンドウを最前面に移動するかどうかを設定します。
引数:
f(bool, optional):Trueの場合、ウィンドウを最前面に表示します。Falseの場合、通常の表示に戻します。デフォルトはTrue。
戻り値: なし。
create_subwindow(self)動作: メインウィンドウの子ウィンドウとして新しいToplevelウィンドウを作成します。
引数: なし。
戻り値: 作成された
tkinter.Toplevelインスタンス。
create_window(self, title=None, type='', geometry=None, minsize=None, iconfile=None, sashwidth=2, left_pane_width=50, icon_path=None, relief='ridge', borderwidth=2, bg='white', default_font=None)動作: アプリケーションのメインとなるTkinterウィンドウを作成し、その設定(タイトル、ジオメトリ、アイコン、フォントなど)を行います。
引数:
title(str, optional): ウィンドウのタイトル。type(str, optional): 現在使用されていませんが、将来的な拡張のためのプレースホルダーかもしれません。geometry(str, optional):WxH+X+Y形式の初期ジオメトリ文字列。minsize(tuple, optional): ウィンドウの最小サイズ (幅, 高さ)。iconfile(str, optional): ウィンドウのアイコンファイルへのパス。sashwidth(int, optional): ペインのサッシの幅 (未実装の引数)。left_pane_width(int, optional): 左ペインの初期幅 (未実装の引数)。icon_path(str, optional): ウィンドウのアイコンファイルへのパス(iconfileと同様の機能)。relief(str, optional): ウィンドウのボーダーリリーフスタイル。デフォルトは'ridge'。borderwidth(int, optional): ウィンドウのボーダー幅。デフォルトは2。bg(str, optional): ウィンドウの背景色。デフォルトは'white'。default_font(tuple, optional): ウィンドウ内のウィジェットに適用されるデフォルトのフォント設定 (フォント名, サイズ)。
戻り値: 作成された
tkinter.Tkインスタンス (ルートウィンドウ)。
create_menu(self, **kwargs)動作: ルートウィンドウにメニューバーを作成します。
引数:
**kwargs:tkinter.Menuコンストラクタに渡される任意のキーワード引数。
戻り値: 作成された
tkinter.Menuインスタンス。
create_toolbar(self, **kwargs)動作: ルートウィンドウにツールバーフレームを作成します。
引数:
**kwargs:tkinter.Frameコンストラクタに渡される任意のキーワード引数。
戻り値: 作成された
tkinter.Frameインスタンス。
get_editor(self)動作: 設定済みのエディタパス、または環境変数から検出されたエディタパスを取得します。
引数: なし。
戻り値: 検出されたエディタの実行可能ファイルのパス (str)。見つからない場合は空文字列。
print_tkvars_info(app, cparams, tkvars)動作:
self.tkvarsに格納されているTkinter変数の情報を、アプリケーションの警告出力機能 (app.print_warning) を使用して表示します。引数:
app(tkApplication_GUI):tkApplication_GUIのインスタンス。通常、このメソッドはselfとして呼び出されます。cparams(tkParams): 設定パラメータのインスタンス。tkvars(dict):self.tkvars.get_param_dict()から取得されるTkinter変数の辞書。
戻り値: なし。
print_cparams_info(app, cparams, tkvars, copy_tkvars=None)動作:
cparams(アプリケーションのパラメータ) の情報を警告出力機能を使用して表示します。オプションでtkvarsからcparamsへのコピー関数を実行できます。引数:
app(tkApplication_GUI):tkApplication_GUIのインスタンス。cparams(tkParams): 設定パラメータのインスタンス。tkvars(dict): Tkinter変数の辞書。copy_tkvars(callable, optional):tkvarsからcparamsに値をコピーするための関数。
戻り値: なし。
print_config_info(app, config, tkvars, copy_tkvars=None)動作:
config(アプリケーションの設定) の情報を警告出力機能を使用して表示します。オプションでtkvarsからconfigへのコピー関数を実行できます。引数:
app(tkApplication_GUI):tkApplication_GUIのインスタンス。config(tkParams): 設定のインスタンス。tkvars(dict): Tkinter変数の辞書。copy_tkvars(callable, optional):tkvarsからconfigに値をコピーするための関数。
戻り値: なし。
create_editor_frame(app, frame, head_label_args={}, entry_width=60, eval_button_args=[], show_path_select=True)動作: 指定されたフレーム内に、テキスト編集エリア、パス入力、実行ボタンを備えたエディタフレームを作成します。ユーザーはここにコードを入力して実行できます。
引数:
app(tkApplication_GUI):tkApplication_GUIのインスタンス。frame(tkinter.Frame): エディタフレームを配置する親フレーム。head_label_args(dict, optional): ヘッダーラベルに渡す引数。デフォルトは{'text': 'Path:'}。entry_width(int, optional): パス入力エントリーの幅。デフォルトは60。eval_button_args(dict, optional): 実行ボタンに渡す引数。デフォルトは空のリストですが、実際は辞書が期待されます(例:{'text': 'eval', 'width': 4})。show_path_select(bool, optional): パス選択ボタンとエントリーを表示するかどうか。デフォルトはTrue。
戻り値: エディタフレーム (tkinter.Frame)。
create_editor_tab(app, config, cparams, pane, title, entry_width=60, eval_button_args={})動作: 指定されたノートブックペインに、エディタ機能を備えた新しいタブを作成します。
引数:
app(tkApplication_GUI):tkApplication_GUIのインスタンス。config(tkParams): アプリケーションの設定オブジェクト。cparams(tkParams): アプリケーションのパラメータオブジェクト。pane(tkinter.ttk.Notebook): タブを追加するノートブックウィジェット。title(str): タブのタイトル。entry_width(int, optional): エディタ内のエントリーウィジェットの幅。デフォルトは60。eval_button_args(dict, optional): 実行ボタンに渡す追加の引数。
戻り値: 作成されたエディタフレーム (tkinter.Frame)。
create_development_tab(app, config, cparams, parent_notebook, copy_tkvars=None)動作: アプリケーションの開発・デバッグを支援するための特別なタブを作成します。このタブには、スクリプトパスの表示、ライブラリパスの表示、アプリケーションの状態(
app、cparams、tkvars、config、環境変数など)を表示するボタン、およびインタラクティブなコードエディタが含まれます。引数:
app(tkApplication_GUI):tkApplication_GUIのインスタンス。config(tkParams): アプリケーションの設定オブジェクト。cparams(tkParams): アプリケーションのパラメータオブジェクト。parent_notebook(tkinter.ttk.Notebook): 開発タブを追加するノートブックウィジェット。copy_tkvars(callable, optional):tkvarsから他のパラメータオブジェクトに値をコピーするための関数。
戻り値: 作成されたノートブックフレーム (tkinter.Frame)。
get_editors(self, additional_list=[], filename_only=False)動作: 一般的に使用されるエディタの実行可能ファイルのパスをシステムから検出してリストで返します。
引数:
additional_list(list, optional): 検出対象に追加するエディタ名のリスト。filename_only(bool, optional): ファイル名のみを返すかどうか。デフォルトはFalse(フルパスを返す)。
戻り値: 検出されたエディタの実行可能ファイルのパスのリスト (list of str)。
get_start_apps(self, additional_list=[], filename_only=False)動作: ファイルを開くための一般的なアプリケーション(例:
startコマンド、xdg-open)の実行可能ファイルのパスを検出してリストで返します。引数:
additional_list(list, optional): 検出対象に追加するアプリケーション名のリスト。filename_only(bool, optional): ファイル名のみを返すかどうか。デフォルトはFalse。
戻り値: 検出されたアプリケーションの実行可能ファイルのパスのリスト (list of str)。
get_shells(self, additional_list=[], filename_only=False)動作: 一般的に使用されるシェルの実行可能ファイルのパスをシステムから検出してリストで返します。
引数:
additional_list(list, optional): 検出対象に追加するシェル名のリスト。filename_only(bool, optional): ファイル名のみを返すかどうか。デフォルトはFalse。
戻り値: 検出されたシェルの実行可能ファイルのパスのリスト (list of str)。
get_filers(self, additional_list=[], filename_only=False)動作: 一般的に使用されるファイルマネージャー(ファイラー)の実行可能ファイルのパスをシステムから検出してリストで返します。
引数:
additional_list(list, optional): 検出対象に追加するファイラー名のリスト。filename_only(bool, optional): ファイル名のみを返すかどうか。デフォルトはFalse。
戻り値: 検出されたファイラーの実行可能ファイルのパスのリスト (list of str)。
get_external_apps(self, paths, use_default=True, filename_only=False)動作: 指定されたパスのリスト、およびデフォルトの一般的な外部アプリケーション(エディタ、シェルなど)の実行可能ファイルのパスをシステムから検出してリストで返します。
引数:
paths(list): 検出対象に追加するアプリケーション名のリスト。use_default(bool, optional): デフォルトの一般的なアプリケーションも検出対象に含めるかどうか。デフォルトはTrue。filename_only(bool, optional): ファイル名のみを返すかどうか。デフォルトはFalse。
戻り値: 検出された外部アプリケーションの実行可能ファイルのパスのリスト (list of str)。
main scriptとして実行したときの動作
tkapplication_gui.py ファイルを直接Pythonインタプリタで実行した場合、if __name__ == "__main__": ブロック内の main() 関数が呼び出されます。
main() 関数は以下のメッセージを標準出力に出力し、その後プログラムを終了します。
This is library, not runnable
この動作から、tkapplication_gui.py は単体で実行されることを意図したスクリプトではなく、他のアプリケーションからインポートされて利用されるライブラリとして設計されていることがわかります。