1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

関西弁翻訳ツール

Posted at

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

完成品

image.png
image.png

コード

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

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

2. class

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

3. super()

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

4. self

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

5. re.sub

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

6. ttk.Label

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

7. tk.Text

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

8. ttk.Button

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

9. get

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

10. insert

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

11. if __name__ == "__main__":

  • 説明: このスクリプトが直接実行された場合にのみ実行されるコードブロックを指定する
  • :
    if __name__ == "__main__":
        app = KansaiBenApp()
        app.mainloop()
    

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

参考資料

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?