🙄

【Python】tkinterでプログラムを実行するボタンを実装する。

に公開

【Python】tkinterでプログラムを実行するボタンを実装する。

概要

毎度同じ処理を手作業で・・・・。
でもGUIで簡単にボタンを押してできれば楽と思いませんか。
そこで、ボタンを押せば 指定したパスのプログラムを実行できるプログラムを作成しました。

サンプルコード

import os
os.environ["TK_SILENCE_DEPRECATION"] = "1"

import tkinter as tk
from tkinter import messagebox
import subprocess
import sys

# あいうえお

def run_bat():
    # Windows: batファイル, Mac: shファイル
    if sys.platform.startswith("win"):
        bat_path = r"C:\path\to\your_script.bat"
        subprocess.Popen([bat_path], shell=True)
    else:
        sh_path = "/path/to/your_script.sh"
        subprocess.Popen(["sh", sh_path])

def run_powershell():
    # Windows: PowerShell, Mac: shファイル
    if sys.platform.startswith("win"):
        ps_path = r"C:\path\to\your_script.ps1"
        subprocess.Popen(["powershell", "-ExecutionPolicy", "Bypass", "-File", ps_path])
    else:
        sh_path = "/path/to/your_script.sh"
        subprocess.Popen(["sh", sh_path])

def run_python():
    # Windows/Mac共通: Pythonスクリプト
    py_path = "./your_script.py"
    subprocess.Popen([sys.executable, py_path])

def button_clicked(n):
    messagebox.showinfo("ボタン", f"ボタン{n}が押されました")

root = tk.Tk()
root.title("選択ダイアログ")

frame = tk.Frame(root)
frame.pack(padx=20, pady=20)

# OK/いいえボタン
def on_ok():
    print("OKが選択されました")
    root.quit()

def on_no():
    print("いいえが選択されました")
    root.quit()

btn_ok = tk.Button(frame, text="OK", width=10, command=on_ok)
btn_ok.grid(row=0, column=0, padx=5, pady=5)

btn_no = tk.Button(frame, text="いいえ", width=10, command=on_no)
btn_no.grid(row=0, column=1, padx=5, pady=5)

# ボタン1~10
btn1 = tk.Button(frame, text="ボタン1", width=10, command=run_bat)
btn1.grid(row=1, column=0, padx=5, pady=5)

btn2 = tk.Button(frame, text="ボタン2", width=10, command=run_powershell)
btn2.grid(row=1, column=1, padx=5, pady=5)

btn3 = tk.Button(frame, text="ボタン3", width=10, command=run_python)
btn3.grid(row=1, column=2, padx=5, pady=5)

# ボタン4~10はダミー
for i in range(4, 11):
    btn = tk.Button(frame, text=f"ボタン{i}", width=10, command=lambda n=i: button_clicked(n))
    btn.grid(row=2 + (i-4)//4, column=(i-4)%4, padx=5, pady=5)

root.mainloop()

実行例

(.venv) $ python gui_01.py

環境

M1 Mac

追記

入力フォームから指定したパスのプログラムを実行する機能
ダミーボタンに機能追加
その他、Moromoro

import os
os.environ["TK_SILENCE_DEPRECATION"] = "1"

import tkinter as tk
from tkinter import messagebox
import subprocess
import sys

# あいうえお

def run_bat():
    # Windows: batファイル, Mac: shファイル
    if sys.platform.startswith("win"):
        bat_path = r"C:\path\to\your_script.bat"
        subprocess.Popen([bat_path], shell=True)
    else:
        sh_path = "/path/to/your_script.sh"
        subprocess.Popen(["sh", sh_path])

def run_powershell():
    # Windows: PowerShell, Mac: shファイル
    if sys.platform.startswith("win"):
        ps_path = r"C:\path\to\your_script.ps1"
        subprocess.Popen(["powershell", "-ExecutionPolicy", "Bypass", "-File", ps_path])
    else:
        sh_path = "/path/to/your_script.sh"
        subprocess.Popen(["sh", sh_path])

def run_python():
    # Windows/Mac共通: Pythonスクリプト
    py_path = "./your_script.py"
    subprocess.Popen([sys.executable, py_path])

def run_custom():
    path = entry_path.get()
    if not path:
        messagebox.showwarning("警告", "パスを入力してください")
        return
    if not os.path.exists(path):
        messagebox.showerror("エラー", "指定したパスが存在しません")
        return
    # 拡張子で実行方法を分岐
    ext = os.path.splitext(path)[1].lower()
    try:
        if ext == ".py":
            subprocess.Popen([sys.executable, path])
        elif ext == ".bat" and sys.platform.startswith("win"):
            subprocess.Popen([path], shell=True)
        elif ext == ".ps1" and sys.platform.startswith("win"):
            subprocess.Popen(["powershell", "-ExecutionPolicy", "Bypass", "-File", path])
        elif ext == ".sh" and not sys.platform.startswith("win"):
            subprocess.Popen(["sh", path])
        else:
            subprocess.Popen([path])
    except Exception as e:
        messagebox.showerror("実行エラー", str(e))

def button_clicked(n):
    messagebox.showinfo("ボタン", f"ボタン{n}が押されました")

def popup_notify():
    messagebox.showinfo("通知", "これはポップアップ通知です")

def show_input_form():
    def on_submit():
        val = entry.get()
        messagebox.showinfo("入力結果", f"あなたが入力した値: {val}")
        input_win.destroy()
    input_win = tk.Toplevel(root)
    input_win.title("入力フォーム")
    tk.Label(input_win, text="何か入力してください:").pack(padx=10, pady=5)
    entry = tk.Entry(input_win)
    entry.pack(padx=10, pady=5)
    tk.Button(input_win, text="送信", command=on_submit).pack(padx=10, pady=10)

def show_warning():
    messagebox.showwarning("警告", "これは警告メッセージです")

def show_error():
    messagebox.showerror("エラー", "これはエラーメッセージです")

def ask_yes_no():
    res = messagebox.askyesno("質問", "はい/いいえを選択してください")
    messagebox.showinfo("結果", f"選択: {'はい' if res else 'いいえ'}")

def ask_ok_cancel():
    res = messagebox.askokcancel("確認", "OK/キャンセルを選択してください")
    messagebox.showinfo("結果", f"選択: {'OK' if res else 'キャンセル'}")

def dummy_action(n):
    messagebox.showinfo("ダミー", f"ボタン{n}はダミーです")

root = tk.Tk()
root.title("選択ダイアログ")

frame = tk.Frame(root)
frame.pack(padx=20, pady=20)

# OK/いいえボタン
def on_ok():
    print("OKが選択されました")
    root.quit()

def on_no():
    print("いいえが選択されました")
    root.quit()

btn_ok = tk.Button(frame, text="OK", width=10, command=on_ok)
btn_ok.grid(row=0, column=0, padx=5, pady=5)

btn_no = tk.Button(frame, text="いいえ", width=10, command=on_no)
btn_no.grid(row=0, column=1, padx=5, pady=5)

# ボタン1~10
btn1 = tk.Button(frame, text="ボタン1", width=10, command=run_bat)
btn1.grid(row=1, column=0, padx=5, pady=5)

btn2 = tk.Button(frame, text="ボタン2", width=10, command=run_powershell)
btn2.grid(row=1, column=1, padx=5, pady=5)

btn3 = tk.Button(frame, text="ボタン3", width=10, command=run_python)
btn3.grid(row=1, column=2, padx=5, pady=5)

# ボタン4~10に機能を割り当て
btn4 = tk.Button(frame, text="ボタン4", width=10, command=popup_notify)
btn4.grid(row=2, column=0, padx=5, pady=5)

btn5 = tk.Button(frame, text="ボタン5", width=10, command=show_input_form)
btn5.grid(row=2, column=1, padx=5, pady=5)

btn6 = tk.Button(frame, text="ボタン6", width=10, command=show_warning)
btn6.grid(row=2, column=2, padx=5, pady=5)

btn7 = tk.Button(frame, text="ボタン7", width=10, command=show_error)
btn7.grid(row=2, column=3, padx=5, pady=5)

btn8 = tk.Button(frame, text="ボタン8", width=10, command=ask_yes_no)
btn8.grid(row=3, column=0, padx=5, pady=5)

btn9 = tk.Button(frame, text="ボタン9", width=10, command=ask_ok_cancel)
btn9.grid(row=3, column=1, padx=5, pady=5)

btn10 = tk.Button(frame, text="ボタン10", width=10, command=lambda: dummy_action(10))
btn10.grid(row=3, column=2, padx=5, pady=5)

# 入力フォーム追加(packで下部に表示)
input_frame = tk.Frame(root)
input_frame.pack(padx=20, pady=(0, 20), fill="x")

label = tk.Label(
    input_frame,
    text="実行したいプログラムのパス:",
    font=("Arial", 12, "bold"),
    fg="black"
)
label.pack(side="left", padx=5)
entry_path = tk.Entry(
    input_frame,
    width=40,
    bg="#ffffff",
    fg="#000000",
    insertbackground="#000000",
    highlightthickness=2,
    highlightbackground="#888888",
    highlightcolor="#000000",
    relief="solid",
    font=("Arial", 14),
    borderwidth=2
)
entry_path.pack(side="left", padx=5, pady=5, ipady=4)
btn_run_custom = tk.Button(
    input_frame,
    text="パスのプログラムを実行",
    width=20,
    command=run_custom,
    font=("Arial", 12)
)
btn_run_custom.pack(side="left", padx=5)

root.mainloop()

Discussion