自作した絵文字検索ツール(仮)の埋葬

Posted on 2024年02月28日 (水) in 自作ツール

アイキャッチ

もともと Yukis Army knife に組み込む予定で「絵文字検索ツール」を作りましたが、本実装を諦めたのでここにコードを埋葬します。

import tkinter as tk
import tkinter.ttk as ttk
import unicodedata
import pyperclip as clip
from functools import partial
from tkinter import messagebox
import csv
import threading

def list_to_csv(data, filename):
    with open(filename, 'w', newline='',encoding="utf-8") as csvfile:
        writer = csv.writer(csvfile)
        writer.writerows(data)

def csv_to_list(filename):
    data = []
    with open(filename, 'r',encoding="utf-8") as csvfile:
        reader = csv.reader(csvfile)
        for row in reader:
            data.append(row)
    return data

def get_emoji_names():
    emoji_names = []
    ranges = [(0x1F300, 0x1F5FF), (0x1F600, 0x1F64F), (0x1F680, 0x1F6FF), (0x1F900, 0x1F9FF)]
    for start, end in ranges:
        for code_point in range(start, end):
            char = chr(code_point)
            name = unicodedata.name(char, "Unknown")
            emoji_names.append((char, name))
    return emoji_names


class ScrollableFrame(ttk.Frame):
    def __init__(self, container, bar_x=True, bar_y=True):
        super().__init__(container)
        self.canvas = tk.Canvas(self)
        self.scrollable_frame = ttk.Frame(self.canvas)
        self.scrollable_frame.bind(
            "<Configure>",
            lambda e: self.canvas.configure(
                scrollregion=self.canvas.bbox("all")
            )
        )
        self.canvas.create_window((0, 0), window=self.scrollable_frame, anchor="nw")
        if bar_y:
            self.scrollbar_y = ttk.Scrollbar(self, orient="vertical", command=self.canvas.yview)
            self.scrollbar_y.pack(side=tk.RIGHT, fill="y")
            self.canvas.configure(yscrollcommand=self.scrollbar_y.set)
        if bar_x:
            self.scrollbar_x = ttk.Scrollbar(self, orient="horizontal", command=self.canvas.xview)
            self.scrollbar_x.pack(side=tk.BOTTOM, fill="x")
            self.canvas.configure(xscrollcommand=self.scrollbar_x.set)
        self.canvas.bind_all("<MouseWheel>", self._on_mousewheel)
        self.canvas.pack(side=tk.LEFT, fill="both", expand=True)

    def _on_mousewheel(self, event):
        self.canvas.yview_scroll(int(-1*(event.delta/120)), "units")

    def scroll_to_top(self):
        self.canvas.yview_moveto(0)

def remove_all_children(widget):
    for child in widget.winfo_children():
        child.destroy()

def show_name(event, name):
    name1=name.title()
    name2=name1.replace("_", " ")
    messagebox.showinfo("絵文字の名前", name2)

def serach_emoji():
    serach_text=entry.get().upper()
    if not serach_text:
        frame.scroll_to_top()
        set_emoji()
        return
    remove_all_children(frame.scrollable_frame)
    num=0
    frame.scroll_to_top()
    for emoji, name in emoji_list:
        if serach_text in name:
            i=num//4
            j=num%4
            al=tk.Button(frame.scrollable_frame, width=5,font=("Arial", 20),command=partial(clip.copy,emoji))
            al.grid(row=i, column=j)
            al.configure(text=emoji)
            al.bind("<Button-2>", partial(show_name, name=name))
            num+=1

def set_emoji():
    num=0
    for emoji, name in emoji_list:
        i=num//4
        j=num%4
        al=tk.Button(frame.scrollable_frame, width=5,font=("Arial", 20),command=partial(clip.copy,emoji))
        al.grid(row=i, column=j)
        al.configure(text=emoji)
        al.bind("<Button-2>", partial(show_name, name=name))
        num+=1

root = tk.Tk()
root.title("絵文字検索")
entry=ttk.Entry(root, width=50)
button=ttk.Button(root,text="検索",command=serach_emoji)
frame = ScrollableFrame(root)
emoji_list = get_emoji_names()
t=threading.Thread(target=set_emoji,daemon=True)
t.start()

entry.pack()
button.pack()
frame.pack(expand=True, fill="both")

root.mainloop()

このソフトの欠点はいくつかあり、

  • 起動が致命的に遅い(表示を後回しにすることで対策したがそれでも遅い)

  • 名前参照の検索精度がゴミ(自分でインデックスを作るのは時間がかかりすぎる)

  • 多分 Microsoft IME で代用できる(致命的。これでやる気なくした)

これが原因で搭載を諦めました。

でもせっかく作ったのに捨てるのももったいないのでここに埋葬しておきます。