本ブログで紹介するツールも増えてきたので、それらを簡単に起動できるプログラムランチャーを作ることにしました。
プログラムの登録方法は、タイトルとコマンドをカンマ区切りで列挙するだの仕様仕様で、Windows上のあらゆるプログラムを登録することができます。
いちいちコマンドプロンプトを操作して実行するのが面倒だと思われる方は、是非このプログラムランチャーをお使いください。
自作ツールを作るためのポイントと今後公開予定の自作ツール一覧を「【実践】Pythonで事務処理向け自作ツールを作ろう!」で紹介していますので、併せてご覧ください。
プログラム・ランチャーの概要
回紹介するプログラム・ランチャーは、メニューと設定の2画面構成で、次の特徴があります。
- メニュー画面と設定画面が簡単に切り替え可能です。
- 登録できるプログラム数は、メモリの許す限り無制限です。
- 登録は、タイトルとコマンドをカンマ区切りで列挙するだけの簡単仕様です。
- 設定画面に入力した内容は、画面を閉じる際に自動でjsonファイルに保存されます。
プログラム・ランチャーの使い方
画面項目の説明
画面項目 | 説明 |
---|---|
画面切り替えボタン | メニュー画面と設定画面を切り替えます |
メニュー表示エリア | 設定画面で登録されたタイトルがボタンとして一覧表示されます。 |
タイトル・コマンド登録エリア | メニューに表示したいタイトルと、ボタンをクリックされた時に実行したいコマンドを登録します。 |
編集内容を画面に反映ボタン | タイトル・コマンド登録エリアの内容に従って、メニューを再構成します。 |
プログラムの実行
メニュー画面に表示されているタイトルから、実行したいものを選んでクリックします。
お使いの環境によっては、プログラム・ランチャー起動後、最初のクリックからプログラムが立ち上がるまでに、数秒~十数秒くらい掛かるかもしれません。
これはPython自身と各種ライブラリをストレージから読み込むために掛かる時間であり、2回目以降は速くなります。
タイトルとプログラムの登録
メニューに表示したいタイトルと、実行したいコマンドをカンマ区切りで記述します。コマンドは '&' で区切ることで、いくつでも記述できます。
尚、1行につき1つのボタンがメニューに生成されるため、途中で改行はしないでください。
タイトル , コマンド1&コマンド2&コマンド3・・・
例えば、「フォルダコピー」というメニューに対して、次の2つのコマンドを実行する場合、
①1つ上の階層にあるfolder_copy フォルダに移動(cd ..\folder_copy)
②Python の引数に ui.py を指定して実行(python ui.py)
下記の様に2つのコマンドを&で区切って記述できます。
フォルダコピー,cd ..\folder_copy&python ui.py
縦スクロールは可能ですが、横スクロールはできません。タイトルが長い場合や、複数のコマンドを実行する場合は1行が長くなり、途中で折り返されてしまいます。この場合は、ウィンドウサイズを広げると見やすくなります。
メニューとコマンドの登録が完了すると、「編集内容を画面に反映」ボタンをクリックしてください。
プログラムのダウンロードと動作環境の設定
事前に、Pythonのインストールが必要です。既に構築済みの方は読み飛ばしてください。詳細は下記の個別記事をご確認ください。
自作ツールのためのポータブルPython開発・実行環境を作ろう! | プログラム実行時に必要 |
WinPythonにVSCode Portable版を入れよう! | プログラム修正時に必要 |
Python 環境に下記のライブラリをインストールします。 command.bat を実行後、下記のコマンドを実行します。
pip install customtkinter
pip install tkinterdnd2
プログラム・ランチャーと共通パッケージの2つをダウンロードし、2つのフォルダが同一階層になるように解凍してください。
プログラム・ランチャー
実行方法
次の手順で実行してください。
- WinPython のインストールフォルダ内にある command.bat を実行
- ダウンロードしたプログラムファイルをコピーした場所にカレントディレクトリを移動
- Python launcher.py を実行
Python launcher.py
しばらくすると下記の画面が表示されます。「設定」をクリックし、メニューとコマンドを登録してください。
マウス操作でプログラム・ランチャーを起動するには
プログラム・ランチャーを起動するためのバッチファイルを作成し、そのショートカットをデスクトップに置くことで、簡単に起動できるようになります。
まず最初に、ポータブルPython開発・実行環境をインストールしたフォルダ直下に、下記の内容で launcher.bat を作成します。
@echo off
CD scripts
call env_for_icons.bat %*
SET PATH=%PATH%;%WINPYDIRBASE%\ffmpeg\bin
cd ..\PyTools\launcher
python launcher.py
次に、PyTools というフォルダを作成し、そこに ダウンロードしたZipファイルを解凍してください。具体的には、次のフォルダ構成になっていればOKです。
最後に、launcher.bat のショートカットを作成し、デスクトップに置けば完了です。
他の自作ツールを登録して使うには
本ブログで紹介した自作ツールは、launcher フォルダ と同じ階層に全て置いてください。そして、設定画面に下記の内容を貼り付け、「編集内容を画面に反映」ボタンをクリックします。
フォルダコピー,cd ..\folder_copy&python ui.py
動画の音声書き換え,cd ..\audio_replace&python main.py
動画の背景切り抜き,cd ..\bgremove&python ui.py
CSV結合,cd ..\joincsv&python ui.py
CSV分割,cd ..\splitcsv&python ui.py
PDF結合,cd ..\pdfjoiner&python main.py
PDF分割,cd ..\pdfspliter&python main.py
YouTubeダウンローダー,cd ..\youtube&python ui.py
動画⇔画像変換,cd ..\movie_photo_conv&python main.py
動画分割・結合,cd ..\movie_clip&python movie_clip.py
プログラム・ランチャーの仕様
プログラムの構成
main.py の中で画面の表示と動画音声入れ替えボタンのイベント処理を記述しています。イベント処理の中で直接音声入れ替え処理を記述しても良いのですが、再利用しやすいよう audio_replace.py に処理をまとめています。
モジュール名 | 役割 |
---|---|
lancure.py | メニュー画面と設定画面の処理 |
appconfig.py | 画面に入力された値をJson形式のファイルに保存/読込する |
ソースコード
launcher.py
テーマの色や画面サイズ、フォント名やフォントサイズ、メニューボタンの高さを変更する場合、20行目あたり~35行目あたりにかけて定義していますので、ここを修正してください。
import os
import sys
import shutil
sys.path.append(os.path.join(os.path. dirname(__file__), '../libs'))
from appconfig import AppConfig
import customtkinter as ctk
import subprocess
# ウィンドウを閉じる時に呼ばれる関数
def close_window():
# テキストボックスの内容を保存
conf.set("textbox",textbox.get('1.0', 'end-1c'))
conf.write()
# プログラムの終了
root.quit()
# 入力データ保存・復帰用クラスのインスタンス生成
conf = AppConfig("./config.json")
# CustomTkinterの初期設定
ctk.set_appearance_mode("System") # テーマ設定: "System"または"Dark"または"Light"
ctk.set_default_color_theme("blue") # カラーテーマの設定
# メインウィンドウの作成
root = ctk.CTk()
root.title("プログラム・ランチャー")
root.geometry("500x400")
# フォントの設定
app_font=ctk.CTkFont(size=14,family="Meiryo")
textbox_font=ctk.CTkFont(size=13,family="Meiryo")
menu_button_font=ctk.CTkFont(size=14,family="Meiryo")
# メニューボタンの高さ
menu_button_height = 40
# ウィンドウ終了時に呼び出す関数の登録
root.protocol("WM_DELETE_WINDOW", close_window)
# タブの作成
tabview = ctk.CTkTabview(root)
tabview.pack(expand=True, fill='both')
# 1つ目のタブ(メニュー表示用タブ)を追加
tab1 = tabview.add("メニュー")
tab1_frame = ctk.CTkFrame(tab1)
tab1_frame.pack(expand=True, fill='both')
# スクロール可能なキャンバスの作成
canvas = ctk.CTkCanvas(tab1_frame)
canvas.pack(side="left", fill="both", expand=True)
scrollbar = ctk.CTkScrollbar(tab1_frame, orientation='vertical', command=canvas.yview)
scrollbar.pack(side="right", fill="y")
canvas.configure(yscrollcommand=scrollbar.set)
# スクロール可能なフレームをキャンバス内に配置
scrollable_frame = ctk.CTkFrame(canvas)
scroll_window = canvas.create_window((0, 0), window=scrollable_frame, anchor="nw")
# スクロール可能なフレームの幅をキャンバスに合わせて拡大
def configure_canvas(event):
canvas.configure(scrollregion=canvas.bbox("all"))
canvas.itemconfig(scroll_window, width=canvas.winfo_width())
scrollable_frame.bind("<Configure>", configure_canvas)
# ウィンドウがリサイズされるたびに呼ばれる
def on_resize(event):
canvas.itemconfig(scroll_window, width=canvas.winfo_width())
root.bind("<Configure>", on_resize)
# フレームがウィンドウ全体に広がるように設定
scrollable_frame.grid_columnconfigure(0, weight=1)
# 2つ目のタブ(メニュータイトルと実行プログラムの編集)を追加
tab2 = tabview.add("設定")
textbox = ctk.CTkTextbox(tab2, height=10, width=50,font=textbox_font)
textbox.pack(expand=True, fill='both')
# テキストボックスの内容に基づいて、メニューを生成
def add_buttons():
for widget in scrollable_frame.winfo_children():
widget.destroy()
commands = textbox.get("1.0", "end-1c").strip().split('\n')
for idx, command in enumerate(commands):
if ',' in command:
title, cmd = command.split(',', 1)
button = ctk.CTkButton(scrollable_frame, text=title.strip(), command=lambda c=cmd: run_command(c))
button.configure(height=menu_button_height, font=menu_button_font) # ボタンの高さとフォント名、フォントサイズを設定
button.grid(row=idx, column=0, sticky="ew", padx=5, pady=5) # ボタンをグリッド内で左右に広げる
# コマンド実行関数
def run_command(cmd):
subprocess.Popen(cmd.strip(), shell=True)
# メニュー生成ボタンの定義
generate_button = ctk.CTkButton(tab2, text="編集内容を画面に反映", font=app_font,command=add_buttons)
generate_button.pack()
# テキストボックスの内容を復活
conf.read()
txt = conf.get("textbox","")
textbox.delete("1.0", ctk.END)
textbox.insert(ctk.END,txt)
# テキストボックスの内容を元にボタンを生成
add_buttons()
# アプリケーションのメインループを開始
root.mainloop()
まとめ
今回は、「プログラム・ランチャー」について、環境構築の手順と使い方、ソースコードを紹介しました。
いざツールを使おうとしたとき、いちいちポータブルPython開発・実行環境内の command.bat を実行し、カレントディレクトリを移動し、コマンドプロンプトからツールを起動する・・・という一連の操作は、けっこう面倒なものです。
また、ツールの数が増えると、どのツールがどのフォルダ名で格納されているかを覚えておくことも難しくなります。
本ツールは非常に簡単なものですが、これらの操作性を向上させるには、かなり有効です。
ウィンドウのサイズやメニューのフォントは、ソースの該当箇所を少し変更するだけで簡単にカスタマイズできるので、是非ご活用ください。
コメント