Open2
【Tkinter】各種機能紹介
概要
はい、いいえを選択できるボックス
ちょっとした案内の情報を表示する。
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()
概要
入力したサービスを停止する。
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 で表示されるものは操作できる模様。)