関西弁翻訳ツール

日経ソフトウエア 2024年5月号に`関西弁翻訳ツール`なるものがあった。
この記事ではWebアプリとして作成されていたので、今回は、デスクトップアプリにしてみようと思う。

完成品
---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840203/3704842d-fe1d-6e94-6d43-763ea4dd18c0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840203/fd92085c-3395-9c57-ca4a-40535232b453.png)

## コード

```python
import re
import tkinter as tk
from tkinter import ttk

# 標準語 -> 関西弁 の変換ルール
def replace_text(input_text):
    transformations = {
        r'こんにちは': 'まいど',
        r'ありがとうございます': 'おおきに',
        r'おはようございます': 'おはようさん',
        r'こんばんは': 'ばんは',
        r'すみません': 'すんまへん',
        r'本当': 'ほんま',
        r'そうです': 'せやねん',
        r'違います': 'ちゃうねん',
        r'とても': 'めっちゃ',
        r'私': 'わて',
        r'あなた': 'あんさん',
        r'です。|だ。|である。': 'でんがな。',
        r'ます。': 'まんがな。',
        r'た。': 'たがな。',
    }
    
    replaced_text = input_text
    for pattern, replacement in transformations.items():
        replaced_text = re.sub(pattern, replacement, replaced_text)
    
    return replaced_text

# Tkinterアプリの作成
class KansaiBenApp(tk.Tk):
    def __init__(self):
        super().__init__()
        
        self.title("関西弁翻訳ツール")
        self.geometry("400x300")

        self.label_input = ttk.Label(self, text="標準語の文章を入力してください:")
        self.label_input.pack(pady=10)

        self.input_text = tk.Text(self, height=5, width=40)
        self.input_text.pack(pady=5)

        self.button_translate = ttk.Button(self, text="関西弁に変換", command=self.translate_text)
        self.button_translate.pack(pady=10)
        
        self.label_output = ttk.Label(self, text="関西弁翻訳結果:")
        self.label_output.pack(pady=10)

        self.output_text = tk.Text(self, height=5, width=40, state='disabled')
        self.output_text.pack(pady=5)
        
    def translate_text(self):

        input_text = self.input_text.get("1.0", tk.END).strip()
        

        result = replace_text(input_text)

        self.output_text.config(state='normal')
        self.output_text.delete("1.0", tk.END) 
        self.output_text.insert(tk.END, result) 
        self.output_text.config(state='disabled')  

if __name__ == "__main__":
    app = KansaiBenApp()
    app.mainloop()
```

## コードの解説
### 1. **`re`**
  ```python
  import re
  ```
  - `re`: 正規表現を扱うPythonの標準ライブラリ。
  - 正規表現: `re`モジュールを使用して、特定の文字列パターンを検索、置換、操作する方法。
  - `replace_text`関数内で使用
- **例**:
  ```python
  transformations = {
      r'こんにちは': 'まいど',
      r'ありがとうございます': 'おおきに',
      r'です。|だ。|である。': 'でんがな。',
  }
  ```
  - ここでは、標準語を関西弁に置き換えるための正規表現パターンを定義した

### 2. **`class`**
- **説明**: クラスを定義するための予約語。クラスはオブジェクト指向プログラミングでオブジェクトを作るための設計図
- **例**:
  ```python
  class KansaiBenApp(tk.Tk):
  ```
  - `KansaiBenApp`は`Tk`クラスを継承しているクラス。`Tk`は`Tkinter`アプリケーションのウィンドウを表している

### 3. **`super()`**
- **説明**: 親クラス（ここでは`Tk`）のメソッドを呼び出すために使う
- **例**:
  ```python
  super().__init__()
  ```
  - `Tk`クラスのコンストラクタを呼び出し、アプリケーションウィンドウを初期化する


### 4. **`self`**
- **説明**: クラス内でインスタンス自身を指すための予約語。クラス内のメソッドでは、`self`を使ってインスタンス変数や他のメソッドにアクセスする
- **例**:
  ```python
  self.label_input = ttk.Label(self, text="標準語の文章を入力してください:")
  ```
  - `self.label_input`はクラス内のインスタンス変数

### 5. **`re.sub`**
- **説明**: 正規表現に基づいて文字列を置換するために使う関数
- **例**:
  ```python
  replaced_text = re.sub(pattern, replacement, replaced_text)
  ```
  - `pattern`: 置換対象となる正規表現のパターン
  - `replacement`: 置換後の文字列
  - `replaced_text`: 置換対象の文字列

### 6. **`ttk.Label`**
- **説明**: `Tkinter`の`ttk`モジュールにある、テキストを表示するためのウィジェット
- **例**:
  ```python
  self.label_input = ttk.Label(self, text="標準語の文章を入力してください:")
  ```
  - ラベルウィジェットを作成し、指定したテキストを表示する

### 7. **`tk.Text`**
- **説明**: 複数行のテキストを入力または表示するためのウィジェット
- **例**:
  ```python
  self.input_text = tk.Text(self, height=5, width=40)
  ```
  - テキストボックスを作成し、入力用や表示用に使う

### 8. **`ttk.Button`**
- **説明**: ボタンウィジェットを作成する。クリックできるボタンを作成し、コマンドを指定することで機能を実行できる
- **例**:
  ```python
  self.button_translate = ttk.Button(self, text="関西弁に変換", command=self.translate_text)
  ```
  - ここでは「関西弁に変換」というテキストのボタンを作成し、クリック時に`translate_text`関数を呼び出す

### 9. **`get`**
- **説明**: `Text`ウィジェットからテキストを取得するメソッド
- **例**:
  ```python
  input_text = self.input_text.get("1.0", tk.END).strip()
  ```
  - ここでは`Text`ウィジェットから、テキストを最初の行から最後まで取得している
  - `strip`は前後の空白を除去する

---

### 10. **`insert`**
- **説明**: `Text`ウィジェットにテキストを挿入するメソッド
- **例**:
  ```python
  self.output_text.insert(tk.END, result)
  ```
  - 結果のテキストをテキストウィジェットに表示するために使う。
  - `tk.END`はテキストの最後に挿入する

### 11. **`if __name__ == "__main__":`**
- **説明**: このスクリプトが直接実行された場合にのみ実行されるコードブロックを指定する
- **例**:
  ```python
  if __name__ == "__main__":
      app = KansaiBenApp()
      app.mainloop()
  ```
  - この条件が満たされると、`KansaiBenApp`クラスのインスタンスを作成し、アプリケーションが動作を開始する
  - ここに関しては、下記の記事が参考になる
https://qiita.com/soicchi/items/45ac8e2006361126b023

---

今後は`結果をコピー`,`入力欄をクリア`などを実装していこうと思う。

## 参考資料
日経ソフトウエア 2024年5月号:
https://info.nikkeibp.co.jp/media/NSW/atcl/mag/031500053/
Pythonで使用する if __name__ == '__main__': の意味:
https://qiita.com/soicchi/items/45ac8e2006361126b023