Open2

【Tkinter】各種機能紹介

qa_devqa_dev

概要

はい、いいえを選択できるボックス
ちょっとした案内の情報を表示する。

import tkinter as tk
from tkinter import messagebox

class ToolTip:
    def __init__(self, widget, text):
        self.widget = widget
        self.text = text
        self.tipwindow = None
        widget.bind("<Enter>", self.show_tip)
        widget.bind("<Leave>", self.hide_tip)

    def show_tip(self, event=None):
        if self.tipwindow or not self.text:
            return
        x, y, cx, cy = self.widget.bbox("insert")
        x = x + self.widget.winfo_rootx() + 30
        y = y + self.widget.winfo_rooty() + 30
        self.tipwindow = tw = tk.Toplevel(self.widget)
        tw.wm_overrideredirect(True)
        tw.wm_geometry(f"+{x}+{y}")
        label = tk.Label(
            tw, text=self.text, justify="left",
            background="#ffffe0", relief="solid", borderwidth=1,
            font=("Arial", 10)
        )
        label.pack(ipadx=5, ipady=2)

    def hide_tip(self, event=None):
        tw = self.tipwindow
        self.tipwindow = None
        if tw:
            tw.destroy()

def on_yes():
    root.destroy()

def on_no():
    messagebox.showinfo("選択", "「いいえ」が選択されました")

root = tk.Tk()
root.title("はい・いいえ選択")

label = tk.Label(root, text="はい、いいえを選択してください。", font=("Arial", 12))
label.pack(padx=20, pady=15)

frame = tk.Frame(root)
frame.pack(pady=10)

btn_yes = tk.Button(frame, text="はい", width=10, command=on_yes)
btn_yes.pack(side="left", padx=10)
ToolTip(btn_yes, "はいを選択すると閉じます。")

btn_no = tk.Button(frame, text="いいえ", width=10, command=on_no)
btn_no.pack(side="left", padx=10)

root.mainloop()

qa_devqa_dev

概要

入力したサービスを停止する。

import tkinter as tk
from tkinter import messagebox
import subprocess

def start_service():
    service = service_var.get().strip()
    if not service:
        messagebox.showerror("エラー", "サービス名を入力してください。")
        return
    try:
        result = subprocess.run(["sc", "start", service], capture_output=True, text=True, shell=True)
        if result.returncode == 0:
            messagebox.showinfo("成功", f"{service} を開始しました。")
        else:
            messagebox.showerror("失敗", f"開始できませんでした:\n{result.stderr}")
    except Exception as e:
        messagebox.showerror("エラー", str(e))

def stop_service():
    service = service_var.get().strip()
    if not service:
        messagebox.showerror("エラー", "サービス名を入力してください。")
        return
    try:
        result = subprocess.run(["sc", "stop", service], capture_output=True, text=True, shell=True)
        if result.returncode == 0:
            messagebox.showinfo("成功", f"{service} を停止しました。")
        else:
            extra = ""
            if "service cannot be stopped" in result.stderr.lower() or "アクセスが拒否されました" in result.stderr or "cannot be stopped" in result.stderr.lower():
                extra = "\nこのサービスは停止できない設定になっている可能性があります。"
            messagebox.showerror("失敗", f"停止できませんでした:\n{result.stderr}{extra}")
    except Exception as e:
        messagebox.showerror("エラー", str(e))

root = tk.Tk()
root.title("サービス制御ツール")

tk.Label(root, text="サービス名:").grid(row=0, column=0, padx=5, pady=5, sticky="e")
service_var = tk.StringVar()
tk.Entry(root, textvariable=service_var, width=30).grid(row=0, column=1, padx=5, pady=5)

tk.Button(root, text="開始", command=start_service, width=10).grid(row=1, column=0, padx=5, pady=10)
tk.Button(root, text="停止", command=stop_service, width=10).grid(row=1, column=1, padx=5, pady=10)

root.mainloop()

補足

・一部のサービスはコードから実行できないようでエラーになる。
(cmdでsc query で表示されるものは操作できる模様。)