which_my_toast/jp.py
2024-05-12 21:47:43 +09:00

463 lines
No EOL
24 KiB
Python

import tkinter as tk
from tkinter import messagebox
import customtkinter
import os
from PIL import Image
from winotify import Notification, audio
from plyer import notification
from windows_toasts import Toast, ToastDisplayImage, WindowsToaster, InteractableWindowsToaster, AudioSource, ToastAudio, ToastDuration, ToastScenario
version = "0.2"
builddate = "2023/8/12"
class App(customtkinter.CTk):
def __init__(self):
super().__init__()
self.title("which_my_toast")
self.iconbitmap(r".\lib\logo.ico")
self.geometry("820x330")
#1055x330 アクション欄想定
self.resizable(height=False, width=False)
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(1, weight=1)
image_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "lib")
self.logo = customtkinter.CTkImage(Image.open(os.path.join(image_path, "logo.png")), size=(59, 54))
self.title_font = customtkinter.CTkFont(family="meiryo", size=20, weight="bold")
self.info_font = customtkinter.CTkFont(family="meiryo", size=14)
self.ui_font = customtkinter.CTkFont(family="meiryo", size=12)
self.button_font = customtkinter.CTkFont(family="meiryo", size=14, weight="bold")
self.frame = customtkinter.CTkFrame(self, corner_radius=0)
self.frame.grid(row=0, column=0, sticky="nsew")
self.frame.grid_columnconfigure(6, weight=1)
self.frame_label = customtkinter.CTkLabel(self.frame, text=" which_my_toast", image=self.logo, compound="left", font=customtkinter.CTkFont(size=15, weight="bold"))
self.frame_label.grid(row=0, column=0, padx=20, pady=20)
self.library_text = customtkinter.CTkLabel(self.frame, text="ライブラリ", compound="left", font=self.ui_font)
self.library_text.grid(row=1, column=0, sticky="ew")
self.winotify_button = customtkinter.CTkButton(self.frame, height=40, border_spacing=10, text="Winotify", fg_color="transparent", text_color=("gray10", "gray90"), hover_color=("gray70", "gray30"), anchor="w", command=self.frame_select_winotify, font=self.ui_font)
self.winotify_button.grid(row=2, column=0, sticky="ew")
self.plyer_button = customtkinter.CTkButton(self.frame, height=40, border_spacing=10, text="Plyer", fg_color="transparent", text_color=("gray10", "gray90"), hover_color=("gray70", "gray30"), anchor="w", command=self.frame_select_plyer, font=self.ui_font)
self.plyer_button.grid(row=3, column=0, sticky="ew")
self.wintoasts_button = customtkinter.CTkButton(self.frame, height=40, border_spacing=10, text="Windows-Toasts", fg_color="transparent", text_color=("gray10", "gray90"), hover_color=("gray70", "gray30"), anchor="w", command=self.frame_select_wintoasts, font=self.ui_font)
self.wintoasts_button.grid(row=4, column=0, sticky="ew")
self.tkmsg_button = customtkinter.CTkButton(self.frame, height=40, border_spacing=10, text="Tkinter_messagebox", fg_color="transparent", text_color=("gray10", "gray90"), hover_color=("gray70", "gray30"), anchor="w", command=self.frame_select_tkmsg, font=self.ui_font)
self.tkmsg_button.grid(row=5, column=0, sticky="ew")
self.info_button = customtkinter.CTkButton(self.frame,height=40, border_spacing=10, text="バージョン情報", fg_color="transparent", text_color=("gray10", "gray90"), hover_color=("gray70", "gray30"), anchor="w", command=self.which_info, font=self.ui_font)
self.info_button.grid(row=6, column=0, sticky="ew")
#winotify欄
self.winotify_frame = customtkinter.CTkFrame(self, fg_color="transparent")
self.winotify_frame.grid_rowconfigure(5,weight=1)
self.winotify_frame.grid_columnconfigure(5, weight=1)
self.wn_app_textbox = customtkinter.CTkEntry(self.winotify_frame, placeholder_text="アプリ名を入力...", width=520, font=self.ui_font)
self.wn_app_textbox.grid(row=0, column=0, padx=24, pady=15)
self.wn_title_textbox = customtkinter.CTkEntry(self.winotify_frame, placeholder_text="タイトルを入力...", width=520, font=self.ui_font)
self.wn_title_textbox.grid(row=1, column=0, padx=24, pady=15)
self.wn_msg_textbox = customtkinter.CTkEntry(self.winotify_frame, placeholder_text="メッセージを入力...", width=520, font=self.ui_font)
self.wn_msg_textbox.grid(row=2, column=0, padx=24, pady=15)
self.wn_icon_textbox = customtkinter.CTkEntry(self.winotify_frame, placeholder_text="メッセージに使うアイコンのパスを入力... 未入力の場合はアイコンなし", width=520, font=self.ui_font)
self.wn_icon_textbox.grid(row=3, column=0, padx=24, pady=15)
self.wn_control_frame = customtkinter.CTkFrame(self.winotify_frame, fg_color="transparent")
self.wn_control_frame.grid(row=4, column=0)
self.wn_control_frame.grid_rowconfigure(4, weight=1)
self.wn_control_frame.grid_columnconfigure(1, weight=1)
self.wn_audio_switch = customtkinter.CTkSwitch(self.wn_control_frame, text="通知音を再生", font=self.ui_font)
self.wn_audio_switch.grid(row=1, column=0, padx=15, pady=15)
self.wn_audio_text = customtkinter.CTkLabel(self.wn_control_frame, text="通知音を選択", font=self.ui_font)
self.wn_audio_text.grid(row=1, column=1, padx=4, pady=15)
self.wn_audio_select = customtkinter.CTkComboBox(self.wn_control_frame, values=["Default", "Mail", "Reminder", "SMS"], font=self.ui_font, dropdown_font=self.ui_font)
self.wn_audio_select.grid(row=1, column=2, padx=4, pady=4)
self.wn_icon_button = customtkinter.CTkButton(self.wn_control_frame, text="アイコン選択", command=self.winotify_icon_select, font=self.button_font)
self.wn_icon_button.grid(row=0, column=3, padx=15,pady=4)
"""self.action_frame = customtkinter.CTkFrame(self.winotify_frame)
self.action_frame.grid(row=0, column=1, padx=0, pady=15)
self.action_frame.grid_rowconfigure(5, weight=1)
self.action_frame.grid_columnconfigure(0, weight=1)
self.action_button = customtkinter.CTkSwitch(self.action_frame, text="ボタンを追加する", font=self.ui_font)
self.action_button.grid(padx=4, pady=15)
self.action_text1 = customtkinter.CTkEntry(self.action_frame, placeholder_text="ボタンのタイトルを入力...", font=self.ui_font)
self.action_text1.grid(row=1, pady=15)"""
self.wn_send_button = customtkinter.CTkButton(self.wn_control_frame, text="送信", command=self.winotify_send, font=self.button_font)
self.wn_send_button.grid(row=1, column=3, padx=15, pady=15)
#Plyer欄
self.plyer_frame = customtkinter.CTkFrame(self, fg_color="transparent")
self.plyer_frame.grid_rowconfigure(4, weight=1)
self.plyer_frame.grid_columnconfigure(2, weight=1)
self.plyer_info1_label = customtkinter.CTkLabel(self.plyer_frame, text="Plyerを用いて通知を送信します。Windows 7などレガシーOS向けです。", font=self.info_font)
self.plyer_info1_label.grid(row=0, column=0, padx=24, pady=15)
self.plyer_title_textbox = customtkinter.CTkEntry(self.plyer_frame, placeholder_text="タイトルを入力...", width=520, font=self.ui_font)
self.plyer_title_textbox.grid(row=1, column=0, padx=24, pady=15)
self.plyer_msg_textbox = customtkinter.CTkEntry(self.plyer_frame, placeholder_text="メッセージを入力...", width=520, font=self.ui_font)
self.plyer_msg_textbox.grid(row=2, column=0, padx=24, pady=15)
self.plyer_icon_textbox = customtkinter.CTkEntry(self.plyer_frame, placeholder_text="アイコンのパスを入力... 未入力の場合はアイコンなし", width=520, font=self.ui_font)
self.plyer_icon_textbox.grid(row=3, column=0, padx=24, pady=15)
self.plyer_control_frame = customtkinter.CTkFrame(self.plyer_frame, fg_color="transparent")
self.plyer_control_frame.grid(row=4)
self.plyer_control_frame.grid_rowconfigure(0, weight=1)
self.plyer_control_frame.grid_columnconfigure(1, weight=1)
self.plyer_icon_button = customtkinter.CTkButton(self.plyer_control_frame, text="アイコン選択", command=self.plyer_icon_select, font=self.button_font)
self.plyer_icon_button.grid(row=0, column=0, padx=20, pady=15)
self.plyer_send_button = customtkinter.CTkButton(self.plyer_control_frame, text="送信", command=self.plyer_send, font=self.button_font)
self.plyer_send_button.grid(row=0, column=1, padx=20, pady=15)
#windows_toasts欄
self.wintoasts_frame = customtkinter.CTkFrame(self, fg_color="transparent")
self.wintoasts_frame.grid_rowconfigure(5,weight=1)
self.wintoasts_frame.grid_columnconfigure(5, weight=1)
self.wintoasts_app_textbox = customtkinter.CTkEntry(self.wintoasts_frame, placeholder_text="アプリ名を入力...", width=520, font=self.ui_font)
self.wintoasts_app_textbox.grid(row=0, column=0, padx=15, pady=15)
self.wintoasts_title_textbox = customtkinter.CTkEntry(self.wintoasts_frame, placeholder_text="タイトルを入力...", width=520, font=self.ui_font)
self.wintoasts_title_textbox.grid(row=1, column=0, padx=15, pady=15)
self.wintoasts_msg_textbox = customtkinter.CTkEntry(self.wintoasts_frame, placeholder_text="メッセージを入力...", width=520, font=self.ui_font)
self.wintoasts_msg_textbox.grid(row=2, column=0, padx=15, pady=15)
self.wintoasts_icon_textbox = customtkinter.CTkEntry(self.wintoasts_frame, placeholder_text="メッセージに使うアイコンのパスを入力... 未入力の場合はアイコンなし", width=520, font=self.ui_font)
self.wintoasts_icon_textbox.grid(row=3, column=0, padx=15, pady=15)
self.wintoasts_control_frame = customtkinter.CTkFrame(self.wintoasts_frame, fg_color="transparent")
self.wintoasts_control_frame.grid(row=4, column=0)
self.wintoasts_control_frame.grid_rowconfigure(4, weight=1)
self.wintoasts_control_frame.grid_columnconfigure(1, weight=1)
self.wintoasts_audio_switch = customtkinter.CTkSwitch(self.wintoasts_control_frame, text="通知音を再生", font=self.ui_font)
self.wintoasts_audio_switch.grid(row=1, column=0, padx=1, pady=4)
self.wintoasts_scene_text = customtkinter.CTkLabel(self.wintoasts_control_frame, text="シーンと表示時間", font=self.ui_font)
self.wintoasts_scene_text.grid(row=0, column=0, padx=4, pady=4)
self.wintoasts_scene_select = customtkinter.CTkComboBox(self.wintoasts_control_frame, values=["Default", "alarm", "reminder", "incomingCall", "urgent"], font=self.ui_font, dropdown_font=self.ui_font)
self.wintoasts_scene_select.grid(row=0, column=1, padx=4, pady=4)
self.wintoasts_audio_text = customtkinter.CTkLabel(self.wintoasts_control_frame, text="通知音を選択", font=self.ui_font)
self.wintoasts_audio_text.grid(row=1, column=1, padx=4, pady=4)
self.wintoasts_audio_select = customtkinter.CTkComboBox(self.wintoasts_control_frame, values=["Default", "Mail", "SMS"], font=self.ui_font, dropdown_font=self.ui_font)
self.wintoasts_audio_select.grid(row=1, column=2, padx=4, pady=4)
self.wintoasts_icon_button = customtkinter.CTkButton(self.wintoasts_control_frame, text="アイコン選択", command=self.wintoasts_icon_select, font=self.button_font)
self.wintoasts_icon_button.grid(row=0, column=3, padx=4,pady=4)
self.wintoasts_duration_select = customtkinter.CTkComboBox(self.wintoasts_control_frame, values=["標準", "短め", "長め"], font=self.ui_font, dropdown_font=self.ui_font)
self.wintoasts_duration_select.grid(row=0, column=2, padx=4, pady=4)
self.wintoasts_send_button = customtkinter.CTkButton(self.wintoasts_control_frame, text="送信", command=self.wintoasts_send, font=self.button_font)
self.wintoasts_send_button.grid(row=1, column=3, padx=15, pady=15)
#tkinter_messagebox欄
self.tkmsg_frame = customtkinter.CTkFrame(self, fg_color="transparent")
self.tkmsg_frame.grid_rowconfigure(5,weight=1)
self.tkmsg_frame.grid_columnconfigure(5, weight=1)
self.tkmsg_title_textbox = customtkinter.CTkEntry(self.tkmsg_frame, placeholder_text="タイトルを入力...", width=520, font=self.ui_font)
self.tkmsg_title_textbox.grid(row=0, column=0, padx=15, pady=15)
self.tkmsg_msg_textbox = customtkinter.CTkEntry(self.tkmsg_frame, placeholder_text="メッセージを入力...", width=520, font=self.ui_font)
self.tkmsg_msg_textbox.grid(row=1, column=0, padx=15, pady=15)
self.tkmsg_control_frame = customtkinter.CTkFrame(self.tkmsg_frame, fg_color="transparent")
self.tkmsg_control_frame.grid(row=3, column=0)
self.tkmsg_control_frame.grid_rowconfigure(4, weight=1)
self.tkmsg_control_frame.grid_columnconfigure(1, weight=1)
self.tkmsg_scene_text = customtkinter.CTkLabel(self.tkmsg_control_frame, text="シーン", font=self.ui_font)
self.tkmsg_scene_text.grid(row=0, column=0, padx=4, pady=4)
self.tkmsg_scene_select = customtkinter.CTkComboBox(self.tkmsg_control_frame, values=["showerror", "showwarning", "showinfo", "askquestion", "askokcancel", "askretrycancel", "askyesno", "askyesnocancel"], font=self.ui_font, dropdown_font=self.ui_font)
self.tkmsg_scene_select.grid(row=0, column=1, padx=4, pady=4)
self.tkmsg_icon_text = customtkinter.CTkLabel(self.tkmsg_control_frame, text="アイコンを上書き", font=self.ui_font)
self.tkmsg_icon_text.grid(row=1, column=0, padx=4, pady=4)
self.tkmsg_icon_select = customtkinter.CTkComboBox(self.tkmsg_control_frame, values=["error", "info", "question", "warning"], font=self.ui_font, dropdown_font=self.ui_font)
self.tkmsg_icon_select.grid(row=1, column=1, padx=4, pady=4)
self.tkmsg_send_button = customtkinter.CTkButton(self.tkmsg_control_frame, text="送信", command=self.tkmsg_send, font=self.button_font)
self.tkmsg_send_button.grid(row=1, column=4, padx=60, pady=15)
self.select_frame_name("winotify_frame")
def select_frame_name(self, name):
self.winotify_button.configure(fg_color=("gray75", "gray25") if name == "winotify_frame" else "transparent")
self.plyer_button.configure(fg_color=("gray75", "gray25") if name == "plyer_frame" else "transparent")
self.wintoasts_button.configure(fg_color=("gray75", "gray25") if name == "wintoasts_frame" else "transparent")
self.tkmsg_button.configure(fg_color=("gray75", "gray25") if name == "tkmsg_frame" else "transparent")
if name == "winotify_frame":
self.winotify_frame.grid(row=0, column=1, sticky="nsew")
else:
self.winotify_frame.grid_forget()
if name == "plyer_frame":
self.plyer_frame.grid(row=0, column=1, sticky="nsew")
else:
self.plyer_frame.grid_forget()
if name == "wintoasts_frame":
self.wintoasts_frame.grid(row=0, column=1, sticky="nsew")
else:
self.wintoasts_frame.grid_forget()
if name == "tkmsg_frame":
self.tkmsg_frame.grid(row=0, column=1, sticky="nsew")
else:
self.tkmsg_frame.grid_forget()
def frame_select_winotify(self):
self.select_frame_name("winotify_frame")
def frame_select_plyer(self):
self.select_frame_name("plyer_frame")
def frame_select_wintoasts(self):
self.select_frame_name("wintoasts_frame")
def frame_select_tkmsg(self):
self.select_frame_name("tkmsg_frame")
def winotify_icon_select(self):
wn_icon_type = [('画像ファイル','*.png *.jpg *.ico')]
wn_icon_path = tk.filedialog.askopenfilename(title="アイコンを選択...", filetypes = wn_icon_type, initialdir = r".\icon")
self.wn_icon_textbox.delete(0, tk.END)
self.wn_icon_textbox.insert(0, wn_icon_path)
def plyer_icon_select(self):
pl_icon_type = [('アイコンファイル','*.ico')]
pl_icon_path = tk.filedialog.askopenfilename(title="アイコンを選択...", filetypes = pl_icon_type, initialdir = r".\icon")
self.plyer_icon_textbox.delete(0, tk.END)
self.plyer_icon_textbox.insert(0, pl_icon_path)
def wintoasts_icon_select(self):
wintoasts_icon_type = [('画像ファイル','*.png *.jpg *.ico')]
wintoasts_icon_path = tk.filedialog.askopenfilename(title="アイコンを選択...", filetypes = wintoasts_icon_type, initialdir = r".\icon")
self.wintoasts_icon_textbox.delete(0, tk.END)
self.wintoasts_icon_textbox.insert(0, wintoasts_icon_path)
#通知送信部
def winotify_send(self):
winotify_notification = Notification(
app_id = self.wn_app_textbox.get(),
title = self.wn_title_textbox.get(),
msg = self.wn_msg_textbox.get(),
icon = self.wn_icon_textbox.get()
)
winotify_audio_check = self.wn_audio_switch.get()
if winotify_audio_check == 1:
wn_audio_check_name = self.wn_audio_select.get()
if wn_audio_check_name == "Default":
winotify_notification.set_audio(audio.Default, loop=False)
if wn_audio_check_name == "Mail":
winotify_notification.set_audio(audio.Mail, loop=False)
if wn_audio_check_name == "Reminder":
winotify_notification.set_audio(audio.Reminder, loop=False)
if wn_audio_check_name == "SMS":
winotify_notification.set_audio(audio.SMS, loop=False)
winotify_notification.show()
def plyer_send(self):
notification.notify(
title = self.plyer_title_textbox.get(),
message = self.plyer_msg_textbox.get(),
app_icon = self.plyer_icon_textbox.get()
)
def wintoasts_send(self):
if self.wintoasts_icon_textbox.get() == "":
wintoasts_text_notification = InteractableWindowsToaster(self.wintoasts_msg_textbox.get())
wintoasts_text_notification_base = Toast()
wintoasts_text_notification_base.SetBody(self.wintoasts_title_textbox.get())
wintoasts_audio_check = self.wintoasts_audio_switch.get()
#通知音
if wintoasts_audio_check == 1:
wintoasts_audio_check_name = self.wintoasts_audio_select.get()
if wintoasts_audio_check_name == "Default":
wintoasts_text_notification_base.SetAudio(ToastAudio(AudioSource.Default))
if wintoasts_audio_check_name == "Mail":
wintoasts_text_notification_base.SetAudio(ToastAudio(AudioSource.Mail))
if wintoasts_audio_check_name == "SMS":
wintoasts_text_notification_base.SetAudio(ToastAudio(AudioSource.SMS))
else:
wintoasts_text_notification_base.SetAudio(ToastAudio(silent=True))
#表示時間(11だと変わらん)
wintoasts_duration_check = self.wintoasts_duration_select.get()
if wintoasts_duration_check == "標準":
wintoasts_text_notification_base.SetDuration(ToastDuration("Default"))
if wintoasts_duration_check == "短め":
wintoasts_text_notification_base.SetDuration(ToastDuration("short"))
if wintoasts_duration_check == "長め":
wintoasts_text_notification_base.SetDuration(ToastDuration("long"))
#シーン
wintoasts_scene_check = self.wintoasts_scene_select.get()
if wintoasts_scene_check == "Default":
pass
else:
wintoasts_text_notification_base.SetScenario(ToastScenario(wintoasts_scene_check))
wintoasts_text_notification.show_toast(wintoasts_text_notification_base)
else:
wintoasts_img_notification = WindowsToaster(self.wintoasts_app_textbox.get())
wintoasts_img_notification_base = Toast()
wintoasts_img_notification_base.SetHeadline(self.wintoasts_title_textbox.get())
wintoasts_img_notification_base.SetBody(self.wintoasts_msg_textbox.get())
wintoasts_img_notification_base.AddImage(ToastDisplayImage.fromPath(self.wintoasts_icon_textbox.get()))
#通知音
wintoasts_audio_check = self.wintoasts_audio_switch.get()
if wintoasts_audio_check == 1:
wintoasts_audio_check_name = self.wintoasts_audio_select.get()
if wintoasts_audio_check_name == "Default":
wintoasts_img_notification_base.SetAudio(ToastAudio(AudioSource.Default))
if wintoasts_audio_check_name == "Mail":
wintoasts_img_notification_base.SetAudio(ToastAudio(AudioSource.Mail))
if wintoasts_audio_check_name == "SMS":
wintoasts_img_notification_base.SetAudio(ToastAudio(AudioSource.SMS))
else:
wintoasts_img_notification_base.SetAudio(ToastAudio(silent=True))
#表示時間
wintoasts_duration_check = self.wintoasts_duration_select.get()
if wintoasts_duration_check == "標準":
wintoasts_img_notification_base.SetDuration(ToastDuration("Default"))
if wintoasts_duration_check == "短め":
wintoasts_img_notification_base.SetDuration(ToastDuration("short"))
if wintoasts_duration_check == "長め":
wintoasts_img_notification_base.SetDuration(ToastDuration("long"))
#シーン
wintoasts_scene_check = self.wintoasts_scene_select.get()
if wintoasts_scene_check == "Default":
pass
else:
wintoasts_img_notification_base.SetScenario(ToastScenario(wintoasts_scene_check))
wintoasts_img_notification.show_toast(wintoasts_img_notification_base)
def tkmsg_send(self):
tkmsg_scene_check = self.tkmsg_scene_select.get()
if tkmsg_scene_check == "showerror":
messagebox.showerror(
title = self.tkmsg_title_textbox.get(),
message = self.tkmsg_msg_textbox.get(),
icon = self.tkmsg_icon_select.get(),
)
elif tkmsg_scene_check == "showwarning":
messagebox.showwarning(
title = self.tkmsg_title_textbox.get(),
message = self.tkmsg_msg_textbox.get(),
icon = self.tkmsg_icon_select.get(),
)
elif tkmsg_scene_check == "showinfo":
messagebox.showinfo(
title = self.tkmsg_title_textbox.get(),
message = self.tkmsg_msg_textbox.get(),
icon = self.tkmsg_icon_select.get(),
)
elif tkmsg_scene_check == "askquestion":
messagebox.askquestion(
title = self.tkmsg_title_textbox.get(),
message = self.tkmsg_msg_textbox.get(),
icon = self.tkmsg_icon_select.get(),
)
elif tkmsg_scene_check == "askokcancel":
messagebox.askokcancel(
title = self.tkmsg_title_textbox.get(),
message = self.tkmsg_msg_textbox.get(),
icon = self.tkmsg_icon_select.get(),
)
elif tkmsg_scene_check == "askretrycancel":
messagebox.askretrycancel(
title = self.tkmsg_title_textbox.get(),
message = self.tkmsg_msg_textbox.get(),
icon = self.tkmsg_icon_select.get(),
)
elif tkmsg_scene_check == "askyesno":
messagebox.askyesno(
title = self.tkmsg_title_textbox.get(),
message = self.tkmsg_msg_textbox.get(),
icon = self.tkmsg_icon_select.get(),
)
elif tkmsg_scene_check == "askyesnocancel":
messagebox.askyesnocancel(
title = self.tkmsg_title_textbox.get(),
message = self.tkmsg_msg_textbox.get(),
icon = self.tkmsg_icon_select.get(),
)
def which_info(self):
print(version)
which_info_msg_base = "which_my_toast バージョン {} \nビルド日時 {}"
notification.notify(
title = "このアプリについて",
message = which_info_msg_base.format(version,builddate),
app_icon = r"lib\logo.ico"
)
if __name__ == "__main__":
app = App()
app.mainloop()