GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

chriskiehl

Gooey – 任意のPythonコマンドラインプログラムを(ほとんど)1行の完全なGUIアプリケーションに変換する

投稿日:

任意のPythonコマンドラインプログラムを(ほとんど)1行の完全なGUIアプリケーションに変換する

Gooey(Beta)

Python 2または3のコンソールプログラムを(ほとんど)1行のGUIアプリケーションに変換する

GooeyはPython 3をサポートしています!

目次


クイックスタート

インストール手順

Gooeyをインストールする最も簡単な方法はvia pip

pip install Gooey 

または、プロジェクトをローカルディレクトリに複製してGooeyをインストールすることもできます

git clone https://github.com/chriskiehl/Gooey.git

setup.py実行する

python setup.py install

注: Python 2のユーザーは、WxPythonを手動でインストールする必要があります。 残念ながら、これはpipインストールの一部として実行することはできず、 wxPython Webサイトから手動でダウンロードする必要があります。

使用法

Gooeyは、あなたのコードに、単純なデコレータを介して、あなたのargparse宣言(通常はmain )を持つメソッドのどれにでも結び付けられます。

from gooey import Gooey

@Gooey      <--- all it takes! :)
def main():
  parser = ArgumentParser(...)
  # rest of code

引数をデコレータに渡すことによって、異なるスタイルや機能を設定することができます。

# options
@Gooey(advanced=Boolean,          # toggle whether to show advanced config or not 
       language=language_string,  # Translations configurable via json
       show_config=True,          # skip config screens all together
       target=executable_cmd,     # Explicitly set the subprocess executable arguments
       program_name='name',       # Defaults to script name
       program_description,       # Defaults to ArgParse Description
       default_size=(610, 530),   # starting size of the GUI
       required_cols=1,           # number of columns in the "Required" section
       optional_cols=2,           # number of columbs in the "Optional" section
       dump_build_config=False,   # Dump the JSON Gooey uses to configure itself
       load_build_config=None,    # Loads a JSON Gooey-generated configuration
       monospace_display=False)   # Uses a mono-spaced font in the output screen
)
def main():
  parser = ArgumentParser(...)
  # rest of code

各オプションの詳細については、 「どのように動作するのか」を参照してください。

Gooeyは、GUIに表示する賢明なウィジェットのデフォルトを選択するために最善を尽くします。 ただし、さらに細かいチューニングが必要な場合は、 ArgumentParser代わりにドロップイン置換GooeyParserを使用できます。 これにより、GUIに表示されるウィジェットを制御できます。 参照: GooeyParser

from gooey import Gooey, GooeyParser

@Gooey
def main():
  parser = GooeyParser(description="My Cool GUI Program!") 
  parser.add_argument('Filename', widget="FileChooser")
  parser.add_argument('Date', widget="DateChooser")
  ...

Gooeyはダウンロードしてインストールしましたか? すばらしいです! それを実際に見たいですか? サンプル・リポジトリを見て、すぐに使えるサンプル・スクリプトをダウンロードしてください。 彼らはGooeyのさまざまなレイアウト、ウィジェット、および機能を簡単に紹介します。

ダイレクトダウンロード

それは何ですか?

Gooeyは、コンソールアプリケーションをエンドユーザフレンドリなGUIアプリケーションに変換します。 これにより、慣れ親しんだ方法で堅牢な設定可能なプログラムを作成することに集中できます。すべてのプログラムは、平均的なユーザーがどのように表示し、対話するか心配する必要はありません。

どうして?

私たちがコマンドプロンプトを愛するのと同じくらい、他の世界は80年代初めの醜い遺物のように見ています。 その上、プログラムは、単に1つ以上のことをする必要があります。これは、以前はGUIを構築していたか、コンソールアプリケーションに引数を提供する方法を説明していたオプションを与えることを意味します。 Gooeyは(うまくいけば)それらの問題を解決するように作られました。 これは、プログラムを使いやすくして見栄えを良くする!

これは誰ですか?

自分自身や他のプログラマー、あるいは他のコンソールアプリケーション(例えば、* nix philosophy utils)に取り込んでパイプしたい結果をもたらすものを構築する場合、Gooeyはおそらくあなたのためのツールではありません。 しかし、「実行してやる」、つまりオフィススタイルのスクリプト、ポイントAからポイントBまでのビット、または単にプログラマー以外をターゲットとするものをビルドする場合、Gooeyは仕事。 GUIの面を無償で提供しながら、あなたの心が望むような複雑なアプリケーションを構築することができます。

どのように機能するのですか?

Gooeyは、あなたのコードに、単純なデコレータを介して、どちらのメソッドにもあなたのargparse宣言が付いています。

@Gooey
def my_run_func():
  parser = ArgumentParser(...)
  # rest of code

実行時に、Pythonスクリプトを解析してArgumentParserへのすべての参照をArgumentParserます。 (古いoptparseは現在サポートされていません)。これらの参照は抽出され、提供された'action'に基づいてcomponent type割り当てられ、最後にGUIのアセンブルに使用されます。

マッピング:

Gooeyは見つけたオプションに基づいて賢明なデフォルトを選択するのに最善を尽くします。 現在、 ArgumentParser._actionsは次のWXコンポーネントにマップされています。

パーサーのアクション ウィジェット
格納 TextCtrl
store_const CheckBox
store_true CheckBox
store_False CheckBox
追加する TextCtrl
カウント 落ちる
相互排他的グループ ラジオグループ
選択 落ちる

GooeyParser

上記のデフォルトで切り詰められていない場合、ドロップインのArgumentParser置換GooeyParserを使用して正確なウィジェットタイプを制御できます。 これにより、追加のキーワード引数widgetが表示され、表示するコンポーネントの名前を指定することができます。 最良の部分? あなたはそれを使用するためにあなたのargparseコードを変更する必要はありません。 それをドロップすると、あなたは行くのが良いです。

例:

from argparse import ArgumentParser
....

def main(): 
    parser = ArgumentParser(description="My Cool Gooey App!")
    parser.add_argument('filename', help="name of the file to process") 

次に、Gooeyは通常のTextFieldを次のようなウィジェットタイプとして選択します:

ただし、 GooeyParserをドロップしてwidget名を指定すると、はるかに使いやすいFileChooser表示できます

from gooey import GooeyParser
....

def main(): 
    parser = GooeyParser(description="My Cool Gooey App!")
    parser.add_argument('filename', help="name of the file to process", widget='FileChooser') 

カスタムウィジェット:

ウィジェット
DirChooser / FileChooser / MultiFileChooser

DateChooser

パスワードフィールド

リストボックス

国際化

Gooeyは国際的に準備ができており、あなたのホスト言語に簡単に移植されています。 言語はGooeyデコレータの引数で制御されます。

@Gooey(language='russian')
def main(): 
    ... 

すべてのプログラムテキストは、 jsonファイルの外部に保存されます。 したがって、新しいgooey/languages/サポートを追加することは、 gooey/languages/ディレクトリにいくつかのキー/値ペアを貼り付けるのと同じくらい簡単です。

すばらしい貢献者のおかげで、Gooeyには現在、次の言語セットがあらかじめ用意されています。

  • 英語
  • オランダの
  • フランス語
  • ポルトガル

別のものを追加したいですか? プルリクエストを提出してください!


グローバルコンフィグレーション

Gooeyの全体的なルック・アンド・フィールのすべては、デコレータに引数を渡すことでカスタマイズできます。

パラメータ 概要
エンコーディング 文字を表示するときに使用するテキストエンコード(デフォルト: ‘utf-8’)
use_legacy_titles デフォルトのargparseグループ名を “Positional”から “Required”に書き換えます。 これは主に、以前のバージョンのGooey(グループのサポート/意識が乏しく、素朴な議論をしていた)との後方互換性を維持するためのものです。
高度な 「フル」設定画面を表示するか、簡易版を表示するかを切り替えます。
自動スタート 設定をすべてスキップしてすぐにプログラムを実行する
言語 Gooey gooey/languagesディレクトリから読み込む言語をGooeyに伝えます。
ターゲット Gooeyに再呼び出しの方法を伝えます。 デフォルトでは、Gooeyはpythonを見つけるでしょうが、これはあなたがプログラムを指定することを可能にします。
プログラム名 GUIウィンドウのタイトルバーに表示される名前。 指定されていない場合、タイトルはデフォルトでsys.argv[0]から引き出されたスクリプト名になります。
program_description 設定画面の上部パネルに表示されるテキストをSettingsます。 デフォルトでは、 ArgumentParserから引き出された記述になります。
default_size ウィンドウの初期サイズ
required_cols Required Argumentsセクションにある列の数を制御します。
⚠️ 非推奨の通知:現代のレイアウトコントロールのグループパラメータを参照
optional_cols オプションの引数セクションにある列の数を制御します。
⚠️ 非推奨の通知:現代のレイアウトコントロールのグループパラメータを参照
dump_build_config ビルド構成のjsonコピーをディスクに保存して再利用/編集
load_build_config そのビルド構成のjsonコピーをディスクからロードします。
monospace_display モノスペースのフォントを出力画面に使用する
⚠️ 廃止の通知:現代のフォント設定のグループパラメータを参照
image_dir Gooeyがカスタムイメージ/アイコンを探すディレクトリへのパス
language_dir Gooeyがカスタム言語ファイルを探すディレクトリへのパス
disable_stop_button 実行時に[ Stop ]ボタンを無効にする
show_stop_warning ユーザーにプログラムの強制終了を許可する前に警告モーダルを表示する
force_stop_is_error 成功またはエラーの画面を表示して早期終了するかどうかを切り替えます。
show_success_modal 実行に成功した後に要約モーダルを表示するかどうかを切り替えます。
run_validators プログラムを呼び出す前にGooeyが検証を実行するかどうかを制御します。
poll_external_updates (Experimental!)Trueの場合、Gooeyはあなたのコードをgooey-seed-ui CLI引数で呼び出し、その応答を使用してUIの動的値を記入します( 動的値の使用を参照)
return_to_config Trueの場合、Gooeyは実行に成功すると設定の設定ウィンドウに戻ります
progress_regex 実行時の進捗情報をパターン化するために使用されるテキスト正規表現。 参照:詳細な使用方法の進捗状況を表示する
progress_expr progress_regex見つかったすべての一致に適用されるPython式。 参照:詳細な使用方法の進捗状況を表示する
disable_progress_bar_animation 進行状況バーを無効にする
ナビゲーション Gooeyのトップレベルウィンドウの「ナビゲーション」スタイルを設定します。
オプション:

タブ サイドバー
navigation_title サイドバーのナビゲーションペインの上にある見出しのタイトルを制御します。 デフォルトは “アクション”
show_sidebar ナビゲーションモード時にサイドバーを表示/非表示にする== SIDEBAR
body_bg_color メインのGooeyウィンドウのHEX値
header_bg_color ヘッダーの背景のHEX値
header_height ヘッダーのピクセル単位の高さ
header_show_title ヘッダータイトルの表示/非表示
header_show_subtitle ヘッダーサブタイトルの表示/非表示
footer_bg_color フッターの背景のHEX値
サイドバー_bg_color サイドバーの背景の16進数の値
terminal_panel_color 端末のパネルのHEX値
terminal_font_color Gooeyの端末に表示されるフォントのHEX値
terminal_font_family ターミナルで使用するフォントファミリの名前
terminal_font_weight フォントの太さ(NORMAL
terminal_font_size 端末に表示されるフォントのポイントサイズ
error_color 検証エラーが発生したときに表示されるテキストのHEX値

レイアウトのカスタマイズ

いくつかの簡単なカスタマイズを使用することで、Gooeyでかなり柔軟なレイアウトを実現できます。

最高レベルでは、Gooeyデコレータのさまざまな引数によって制御可能ないくつかの全体的なレイアウトオプションがあります。

show_sidebar=True show_sidebar=False navigation='TABBED' tabbed_groups=True

入力のグループ化

デフォルトでは、GooeyでArgparseを使用している場合、入力は2つのバケットに分割されます: positionaloptional ただし、これらはユーザーに提示する最も記述的なグループではありません。 入力を論理グループに任意にバケット化し、それぞれのレイアウトをカスタマイズすることができます。

argparseこれはadd_argument_group()によって行われます。

parser = ArgumentParser()
search_group = parser.add_argument_group(
    "Search Options", 
    "Customize the search options"
)

通常通り、グループに引数を追加できます

search_group.add_argument(
    '--query', 
    help='Base search string'
) 

UI内のグループの一部として表示されます。

グループレイアウトのカスタマイズ

注:レイアウトのカスタマイズを利用する場合は、GooeyParserを使用していることを確認してください。

グループが作成されたら、それをどのように微調整することができるようになりました! GooeyParserGooeyParserのAPIをadd_argument_groupし、追加のキーワード引数add_argument_groupを受け入れます。 それは2つのキーを受け入れる: show_bordercolumns

gooey_options={
    'show_border': Bool,
    'columns': 1-100 
}

show_borderは、親グループ内の密接に関連するアイテムを視覚的につなぎ合わせるのにshow_borderます。 これをtrue設定すると、すべての入力の周りに小さな境界線が描画され、タイトルが上部にネストされます。

columnsは、列内の各行にいくつのアイテムが配置されるかを制御します。

実行モード

Gooeyにはいくつかのプレゼンテーションモードがあり、コンテンツタイプとユーザーのレベルや経験に合わせてレイアウトを調整できます。

上級

デフォルトのビューは、「フル」または「アドバンスド」設定画面です。 ラップするコマンドラインインターフェイスの種類に応じて、2つの異なるレイアウトがあります。 ほとんどのアプリケーションでは、フラットレイアウトは、そのレイアウトがプライマリコマンドのよく知られているCLIスキーマと多くのオプション(Curl、FFMPEGなど)に最もよく一致するため、使い慣れたものになります。

反対側には列レイアウトがあります。 これは、複数のパスを持つCLIや、それぞれ独自の引数とオプションを持つ複数の小さなツールで構成されているCLIに最適です(gitと思う)。 左側の列にはプライマリパス、右側には対応する引数が表示されます。 これは、さまざまな機能を1つのアプリにパッケージングする優れた方法です。

どちらのビューも、各Argument Parserを一意のGUIコンポーネントとしてArgument Parserします。 コマンドラインオプションやコンソールプログラムによく慣れていないユーザーにプログラムを提示するのに理想的です。 ヘルプメッセージは各コンポーネントの横に表示され、各ウィジェットが可能な限り明確に表示します。

レイアウトスタイルを設定する:

現在、TODO!のパラメータを使用してレイアウトを明示的に指定することはできません。 レイアウトは、コードベースで使用されるsubparsersがあるかどうかによってsubparsersされます。 したがって、 Column Layoutをトリガーする場合は、 argparseコードにsubparserを追加する必要があります。

これは、 Gooeyデコレータのadvancedパラメータを使用して切り替えることができます。

@gooey(advanced=True)
def main():
    # rest of code   

ベーシック

基本的なビューは、ユーザーがコンソールアプリケーションに精通しているときに最適ですが、単純な端末よりも少し洗練されたものを提示したい場合もあります。 基本的な表示は、 gooeyデコレータのadvancedパラメータをFalse設定することによってアクセスされます。

@gooey(advanced=False)
def main():
    # rest of code  


構成なし

設定はほとんどありません。設定画面は表示されません。 それはdisplayセクションの右にホップし、ホストプログラムの実行を開始します。 これは、小さなスクリプトの外観を改善するためのものです。


入力検証

⚠️ 注意! この機能は実験的です。 そのAPIは変更または削除することができます。 この機能のフィードバック/考えは大歓迎であり、奨励されています!

Gooeyはオプションで、ユーザー入力に関する基本的な飛行前検証を行うことができます。 内部的には、これらのバリデータ関数を使用して、必要な引数の有無をチェックします。 ただし、 GooeyParserを使用すると、独自の検証ルールでこれらの関数を拡張できます。 これにより、Gooeyはプログラムにコントロールを渡す前に、より多くのユーザーフレンドリーなフィードバックを表示することができます。

バリデータを書く:

バリデータは、 gooey_options利用できるgooey_optionsマップの一部として指定されています。 これは、 validatorという名前のルートキーと2つの内部のペアで構成される単純なマップ構造です。

  • test実行する検証testの内部ボディ
  • 妥当性検査が失敗した場合に表示されるエラーメッセージを表示します。

例えば

gooey_options={
    'validator':{
        'test': 'len(user_input) > 3',
        'message': 'some helpful message'
    }
}

test機能

テスト関数は、有効なPython式で構成できます。 それは、その検証を行うための引数として変数user_inputを受け取ります。 Gooeyから来るすべての値は文字列の形式であるため、検証を実行するために必要に応じてキャストする必要があります。

完全なコードの例

from gooey.python_bindings.gooey_decorator import Gooey
from gooey.python_bindings.gooey_parser import GooeyParser

@Gooey
def main():
    parser = GooeyParser(description='Example validator')
    parser.add_argument(
        'secret',
        metavar='Super Secret Number',
        help='A number specifically between 2 and 14',
        gooey_options={
            'validator': {
                'test': '2 <= int(user_input) <= 14',
                'message': 'Must be between 2 and 14'
            }
        })

    args = parser.parse_args()

    print("Cool! Your secret number is: ", args.secret)

バリデーターがあれば、Gooeyはバリデーターが失敗した場合に、該当する入力フィールドの隣にエラーメッセージを表示できます。


動的値の使用

⚠️ 注意! この機能は実験的です。 そのAPIは変更または削除することができます。 この機能のフィードバックは歓迎され、奨励されています!

Gooey’s Choiceのスタイルフィールド(ドロップダウン、リストボックス)は、 poll_external_updatesオプションを有効にすることで、実行時に動的な値セットを与えることができます。 これにより、ユーザーが設定ページにアクセスするたびにGooeyがプログラムから更新された値を要求します。 これは、たとえば、ユーザーがプログラムを再起動する必要なく、前の実行結果を設定画面に表示するのに使用できます。

どのように機能するのですか?

実行時に、ユーザーが設定画面に達すると、Gooeyは1つのCLI引数gooey-seed-uiプログラムを呼び出します。 これは、プログラムのUIの更新された値の要求です。 これに応答して、 stdoutでは、プログラムはcli-inputsをオプションのリストにマッピングするJSON文字列を返さなければなりません。

たとえば、ユーザーファイルをリストするドロップダウンがあるセットアップを想定します。

 ...
 parser.add_argument(
        '--load',
        metavar='Load Previous Save',
        help='Load a Previous save file',
        dest='filename',
        widget='Dropdown',
        choices=list_savefiles(),
    )

ここに入力する入力は--loadです。 したがって、 --load gooey-seed-uiリクエストに応じて、 gooey-seed-ui --loadをキーとしてJSON文字列を--load 、値としてユーザーに表示したい文字列のリストを返します。 例えば

{"--load": ["Filename_1.txt", "filename_2.txt", ..., "filename_n.txt]}

サンプル・リポジトリーの完全なサンプル・コードを調べてください または、この機能を生み出したばかげた小さなツールで、より大きな例をチェックアウトする: SavingOverIt


アイコンのカスタマイズ

Gooeyには、6つのデフォルトアイコンのセットが付属しています。 Gooeyに初期化時に追加のディレクトリを検索するように指示することで、これらは独自のカスタムイメージ/アイコンで上書きすることができます。 これはGoeeyデコレータのimage_dir引数でimage_dirます。

@Gooey(program_name='Custom icon demo', image_dir='/path/to/my/image/directory')
def main():
    # rest of program

画像はファイル名に基づいてGooeyによって検出されます たとえば、カスタム設定アイコンを提供するには、画像ディレクトリにconfig_icon.pngというファイル名の画像を置くだけです。 これらは上書きできるファイル名です:

  • program_icon.ico
  • success_icon.png
  • running_icon.png
  • loading_icon.gif
  • config_icon.png
  • error_icon.png

パッケージング

素晴らしい貢献者のおかげで、Gooeyを実行ファイルとしてパッケージングするのは簡単です。

tl; dr pyinstallerのバージョンでは、このbuild.specをアプリケーションのルートディレクトリにドロップします。 applicationnameがプロジェクトに関連するようにその内容を編集し、 pyinstaller build.specを実行して、実行可能な実行可能ファイルにアプリケーションをバンドルします。

詳細な手順についてはこちらをご覧ください

スクリーンショット

フラットレイアウト 列のレイアウト 成功のスクリーン エラー画面 警告ダイアログ
カスタムグループ タブ付きグループ タブ付きナビゲーション サイドバーナビゲーション 入力検証

助けたい?

コード、翻訳、グラフィック? プルのリクエストは大歓迎です。







-chriskiehl

執筆者: