WhatsAppログ分割ツールにドラッグアンドドロップ機能の追加

WhatsAppログ分割ツールについて

「WhatsAppログ分割ツール」は、WhatsAppのチャットログを日付ごとに分割して保存するツールです。現在は「参照…」ボタンをクリックしてファイルを選ぶ必要がありますが、ドラッグアンドドロップ機能を追加することで、より使いやすくなります。

解説:どのような変更を加えたか

  1. ライブラリのインポート:tkinterdnd2ライブラリを追加しました。
  2. ドラッグアンドドロップの設定:ウィンドウがファイルのドロップを受け付けるように設定し、ドロップされたときに呼び出される関数を登録しました。
  3. ドロップ処理関数の追加:ファイルがドロップされたときにファイルパスを取得し、入力フィールドに設定する関数を追加しました。
  4. 視覚的なヒント:ユーザーに「ここにファイルをドラッグ&ドロップできる」ことを知らせるラベルを追加しました。
  5. tkinterの初期化方法の変更:通常のtkではなく、TkinterDnD.Tkを使用するように変更しました。

完全なコード

上記の変更を適用した完全なコードは以下のようになります:

ドラッグアンドドロップ機能の追加方法

Tkinterでドラッグアンドドロップを実装するには、ウィンドウにドラッグアンドドロップイベントを関連付ける必要があります。以下に手順を説明します。

1. ドラッグアンドドロップのための準備

まず、tkinterでドラッグアンドドロップを扱うための準備をします。以下のコードをWhatsAppLogSplitterAppクラスの__init__メソッドの最後に追加します。

# ドラッグアンドドロップの設定
self.root.drop_target_register(tk.DND_FILES)
self.root.dnd_bind('<<Drop>>', self.handle_drop)
Code language: PHP (php)

しかし、このコードを追加する前に、tkinterのドラッグアンドドロップ機能を利用するために、TkDNDというライブラリをインポートする必要があります。

2. 必要なライブラリのインポート

コードの先頭に以下のインポート文を追加します:

import os
import re
import zipfile
import tkinter as tk
from tkinter import filedialog, ttk, messagebox
from collections import defaultdict
import threading
import shutil
import tempfile
# TkDNDをインポートする
from tkinterdnd2 import DND_FILES, TkinterDnD
Code language: PHP (php)

3. ドロップされたファイルを処理する関数の追加

次に、ファイルがドロップされた時に呼び出される関数を追加します。WhatsAppLogSplitterAppクラスに以下のメソッドを追加します:

def handle_drop(self, event):
    """ドラッグ&ドロップされたファイルを処理する"""
    # ドロップされたファイルのパスを取得
    file_path = event.data
    
    # WindowsやMacでの特殊な形式に対応
    if file_path.startswith('{') and file_path.endswith('}'):
        file_path = file_path[1:-1]
    
    # 前後の空白や引用符を削除
    file_path = file_path.strip('" ')
    
    # ファイルパスを設定
    self.file_path_var.set(file_path)
Code language: PHP (php)

4. main関数の修正

最後にmain関数を修正して、TkinterDnDを使うようにします:

def main():
    # TkinterDnDを使用
    root = TkinterDnD.Tk()
    app = WhatsAppLogSplitterApp(root)
    
    # アプリ終了時のクリーンアップ処理
    def on_closing():
        app.cleanup()
        root.destroy()
    
    root.protocol("WM_DELETE_WINDOW", on_closing)
    root.mainloop()
Code language: PHP (php)

5. ドラッグアンドドロップの視覚的な補助

ユーザーがドラッグアンドドロップできることが分かりやすいように、視覚的なヒントを追加しましょう。setup_uiメソッドの中で、ファイル選択部分の後に以下のコードを追加します:

# ドラッグ&ドロップの案内ラベル
drop_label = ttk.Label(file_frame, text="ここにファイルをドラッグ&ドロップすることもできます")
drop_label.grid(row=1, column=0, columnspan=2, padx=5, pady=5)
Code language: PHP (php)

tkinterdnd2ライブラリの導入について

上記のコードを実行するには、tkinterdnd2というライブラリが必要です。このライブラリはtkinterでドラッグアンドドロップ機能を実現するためのものです。

Python3と仮想環境を使った導入方法

仮想環境の作成と有効化

まず、プロジェクト用の仮想環境を作成することをおすすめします。仮想環境を使うと、プロジェクトごとに独立した環境を作れるので、依存関係の管理が楽になります。

Windowsの場合:

python3 -m venv myenv
myenv\Scripts\activate

MacやLinuxの場合:

python3 -m venv myenv
source myenv/bin/activate

仮想環境が有効になると、コマンドプロンプトやターミナルの行頭に (myenv) のように表示されます。

tkinterdnd2のインストール

仮想環境が有効になったら、以下のコマンドでtkinterdnd2をインストールします:

pip3 install tkinterdnd2

プログラムの実行

ライブラリをインストールしたら、以下のコマンドでプログラムを実行できます:

python3 your_program_name.py
Code language: CSS (css)
  1. プログラムを起動すると、ウィンドウが表示されます。
  2. WhatsAppのログファイル(またはログファイルを含むZIPファイル)をウィンドウにドラッグし、ドロップします。
  3. 「実行」ボタンをクリックすると、ログが解析され、指定した出力ディレクトリに保存されます。

仮想環境の終了

作業が終わったら、以下のコマンドで仮想環境を終了できます:

Windows、MacやLinux:

deactivate

注意点

  1. システムによっては、tkinterdnd2のインストールに追加の依存関係が必要な場合があります。
  2. MacやLinuxでは、tkinterを使うために追加のパッケージが必要な場合があります。例えば、Ubuntuの場合は以下のコマンドでインストールできます: sudo apt-get install python3-tk
  3. 仮想環境を使う場合、tkinterはシステムにインストールされているPythonから参照されることがあります。その場合は、仮想環境作成時に--system-site-packagesオプションを使うとよいでしょう: python3 -m venv myenv --system-site-packages

以上の手順で、Python3と仮想環境を使ってtkinterdnd2を導入し、WhatsAppログ分割ツールを実行できます。