GUI

[Python Tkinter] Entry(テキストボックス)で複数行入力できるようにする方法

PythonのTkinterライブラリで、Entryウィジェットはデフォルトで1行のテキスト入力しかサポートしていません。

複数行の入力を可能にするには、Textウィジェットを使用します。

Textウィジェットは複数行のテキスト入力をサポートしており、Entryウィジェットの代わりに使用できます。

例えば、Text(root, height=10, width=40)のように指定することで、複数行のテキストボックスを作成できます。

Textウィジェットで複数行入力を実現する方法

PythonのTkinterライブラリを使用すると、GUIアプリケーションを簡単に作成できます。

その中でも、Textウィジェットは複数行のテキスト入力を可能にする非常に便利なウィジェットです。

このセクションでは、Textウィジェットの基本的な使い方やオプション設定について解説します。

Textウィジェットの基本的な使い方

Textウィジェットを使用するには、まずTkinterをインポートし、ウィンドウを作成します。

その後、Textウィジェットを作成して配置します。

以下は基本的なサンプルコードです。

import tkinter as tk
# メインウィンドウの作成
root = tk.Tk()
root.title("Textウィジェットの例")
# Textウィジェットの作成
text_widget = tk.Text(root, height=10, width=40)
text_widget.pack()
# メインループの開始
root.mainloop()

このコードを実行すると、10行×40文字のテキストボックスが表示されます。

Textウィジェットのオプション設定

Textウィジェットには、さまざまなオプションを設定することができます。

以下に代表的なオプションを示します。

オプション名説明
heightウィジェットの高さ(行数)
widthウィジェットの幅(文字数)
bg背景色
fg文字色
fontフォントの設定

高さと幅の指定

Textウィジェットの高さと幅は、heightwidthオプションで指定します。

これにより、表示される行数や文字数を調整できます。

text_widget = tk.Text(root, height=15, width=50)

この例では、15行×50文字のテキストボックスが作成されます。

スクロールバーの追加

長いテキストを扱う場合、スクロールバーを追加することが便利です。

以下のように、Textウィジェットとスクロールバーを組み合わせて使用します。

import tkinter as tk
root = tk.Tk()
root.title("スクロールバー付きTextウィジェットの例")
# Textウィジェットの作成
text_widget = tk.Text(root, height=10, width=40)
text_widget.pack(side=tk.LEFT)
# スクロールバーの作成
scrollbar = tk.Scrollbar(root, command=text_widget.yview)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
# Textウィジェットにスクロールバーを関連付け
text_widget.config(yscrollcommand=scrollbar.set)
root.mainloop()

このコードを実行すると、テキストボックスの右側にスクロールバーが表示され、長いテキストをスクロールして閲覧できるようになります。

Textウィジェットからテキストを取得する方法

Textウィジェットに入力されたテキストを取得するには、getメソッドを使用します。

以下のサンプルコードでは、ボタンをクリックするとテキストを取得して表示します。

import tkinter as tk
def show_text():
    text = text_widget.get("1.0", tk.END)  # 1行目から最後まで取得
    print(text)
root = tk.Tk()
text_widget = tk.Text(root, height=10, width=40)
text_widget.pack()
button = tk.Button(root, text="テキストを表示", command=show_text)
button.pack()
root.mainloop()

このコードを実行し、テキストを入力してボタンをクリックすると、コンソールに入力したテキストが表示されます。

Textウィジェットにテキストを挿入する方法

Textウィジェットにテキストを挿入するには、insertメソッドを使用します。

以下のサンプルコードでは、ボタンをクリックすると指定したテキストが挿入されます。

import tkinter as tk
def insert_text():
    text_widget.insert(tk.END, "こんにちは、世界!\n")  # 最後にテキストを挿入
root = tk.Tk()
text_widget = tk.Text(root, height=10, width=40)
text_widget.pack()
button = tk.Button(root, text="テキストを挿入", command=insert_text)
button.pack()
root.mainloop()

このコードを実行し、ボタンをクリックすると、テキストボックスの最後に「こんにちは、世界!」というテキストが追加されます。

Textウィジェットのカスタマイズ

Textウィジェットは、さまざまなカスタマイズが可能です。

フォントや色の変更、テキストの自動改行、選択やコピー・ペーストのサポート、さらには読み取り専用モードの設定など、ユーザーのニーズに応じて柔軟に対応できます。

このセクションでは、これらのカスタマイズ方法について詳しく解説します。

フォントや色の変更

Textウィジェットのフォントや色を変更するには、fontbg(背景色)、fg(文字色)オプションを使用します。

以下のサンプルコードでは、フォントを変更し、背景色と文字色を設定しています。

import tkinter as tk
root = tk.Tk()
text_widget = tk.Text(root, height=10, width=40, font=("Arial", 12), bg="lightyellow", fg="blue")
text_widget.pack()
root.mainloop()

このコードを実行すると、Arialフォントの12ポイントサイズで、背景が薄い黄色、文字が青色のテキストボックスが表示されます。

テキストの自動改行を有効にする

Textウィジェットでは、テキストの自動改行を有効にすることができます。

これにより、入力したテキストがウィジェットの幅を超えた場合に自動的に改行されます。

以下のように、wrapオプションを設定します。

import tkinter as tk
root = tk.Tk()
text_widget = tk.Text(root, height=10, width=40, wrap=tk.WORD)  # WORD単位で自動改行
text_widget.pack()
root.mainloop()

このコードを実行すると、単語単位で自動的に改行されるテキストボックスが表示されます。

テキストの選択やコピー・ペーストをサポートする

Textウィジェットは、テキストの選択やコピー・ペーストをサポートしています。

ユーザーはマウスやキーボードを使ってテキストを選択し、コピーやペーストを行うことができます。

以下のサンプルコードでは、基本的な操作をサポートするTextウィジェットを作成します。

import tkinter as tk
root = tk.Tk()
text_widget = tk.Text(root, height=10, width=40)
text_widget.pack()
# コピー・ペーストのショートカットキーを設定
text_widget.bind("<Control-c>", lambda event: text_widget.event_generate("<<Copy>>"))
text_widget.bind("<Control-v>", lambda event: text_widget.event_generate("<<Paste>>"))
root.mainloop()

このコードを実行すると、テキストを選択してCtrl+Cでコピー、Ctrl+Vでペーストできるようになります。

テキストの読み取り専用モードを設定する

Textウィジェットを読み取り専用モードに設定することで、ユーザーがテキストを編集できないようにすることができます。

これには、stateオプションをtk.DISABLEDに設定します。

以下のサンプルコードでは、読み取り専用のTextウィジェットを作成しています。

import tkinter as tk
root = tk.Tk()
text_widget = tk.Text(root, height=10, width=40)
text_widget.insert(tk.END, "このテキストは読み取り専用です。")
text_widget.config(state=tk.DISABLED)  # 読み取り専用モードに設定
text_widget.pack()
root.mainloop()

このコードを実行すると、テキストボックスに表示された内容は読み取り専用となり、ユーザーは編集できません。

Textウィジェットのイベント処理

Textウィジェットでは、さまざまなイベントを処理することができます。

キーボード入力、テキストの変更、フォーカスの取得や喪失など、ユーザーの操作に応じてアプリケーションの挙動を制御することが可能です。

このセクションでは、これらのイベント処理について詳しく解説します。

キーボード入力イベントの処理

キーボード入力イベントを処理することで、特定のキーが押されたときに特定のアクションを実行することができます。

以下のサンプルコードでは、Enterキーが押されたときにメッセージを表示する処理を実装しています。

import tkinter as tk
def on_key_press(event):
    if event.keysym == "Return":  # Enterキーが押されたとき
        print("Enterキーが押されました。")
root = tk.Tk()
text_widget = tk.Text(root, height=10, width=40)
text_widget.pack()
# キーボード入力イベントのバインド
text_widget.bind("<KeyPress>", on_key_press)
root.mainloop()

このコードを実行し、Textウィジェット内でEnterキーを押すと、コンソールに「Enterキーが押されました。」と表示されます。

テキスト変更イベントの処理

テキストが変更されたときに特定の処理を行うには、<<Modified>>イベントを使用します。

以下のサンプルコードでは、テキストが変更されるたびにメッセージを表示します。

import tkinter as tk
def on_text_change(event):
    print("テキストが変更されました。")
    text_widget.edit_modified(False)  # 変更フラグをリセット
root = tk.Tk()
text_widget = tk.Text(root, height=10, width=40)
text_widget.pack()
# テキスト変更イベントのバインド
text_widget.bind("<<Modified>>", on_text_change)
root.mainloop()

このコードを実行し、Textウィジェット内のテキストを変更すると、コンソールに「テキストが変更されました。」と表示されます。

フォーカスイベントの処理

フォーカスイベントを処理することで、Textウィジェットがフォーカスを取得したときや失ったときに特定のアクションを実行できます。

以下のサンプルコードでは、Textウィジェットがフォーカスを取得したときにメッセージを表示します。

import tkinter as tk
def on_focus_in(event):
    print("Textウィジェットにフォーカスが入りました。")
def on_focus_out(event):
    print("Textウィジェットからフォーカスが外れました。")
root = tk.Tk()
text_widget = tk.Text(root, height=10, width=40)
text_widget.pack()
# フォーカスイベントのバインド
text_widget.bind("<FocusIn>", on_focus_in)
text_widget.bind("<FocusOut>", on_focus_out)
root.mainloop()

このコードを実行し、Textウィジェットをクリックしてフォーカスを入れると「Textウィジェットにフォーカスが入りました。」と表示され、他のウィジェットをクリックしてフォーカスが外れると「Textウィジェットからフォーカスが外れました。」と表示されます。

応用例:Textウィジェットを使った簡易メモ帳の作成

Textウィジェットを使用して、簡易的なメモ帳アプリケーションを作成することができます。

このセクションでは、メモ帳の基本構造から始まり、ファイルの読み込みと保存機能、テキストの検索・置換機能、テキストのフォーマット機能を追加していきます。

メモ帳の基本構造

まずは、メモ帳の基本的な構造を作成します。

メインウィンドウにTextウィジェットを配置し、メニューを追加します。

以下のサンプルコードでは、基本的なメモ帳のレイアウトを作成しています。

import tkinter as tk
from tkinter import Menu
def create_notepad():
    root = tk.Tk()
    root.title("簡易メモ帳")
    # メニューの作成
    menu = Menu(root)
    root.config(menu=menu)
    # Textウィジェットの作成
    text_widget = tk.Text(root, wrap=tk.WORD)
    text_widget.pack(expand=True, fill='both')
    root.mainloop()
create_notepad()

このコードを実行すると、基本的なメモ帳のウィンドウが表示されます。

ファイルの読み込みと保存機能の実装

次に、ファイルの読み込みと保存機能を追加します。

メニューに「開く」と「保存」オプションを追加し、ファイルダイアログを使用してファイルを選択します。

import tkinter as tk
from tkinter import Menu, filedialog
def open_file():
    file_path = filedialog.askopenfilename(defaultextension=".txt",
                                             filetypes=[("Text files", "*.txt"), ("All files", "*.*")])
    if file_path:
        with open(file_path, "r", encoding="utf-8") as file:
            text_widget.delete(1.0, tk.END)  # 既存のテキストをクリア
            text_widget.insert(tk.END, file.read())  # ファイルの内容を挿入
def save_file():
    file_path = filedialog.asksaveasfilename(defaultextension=".txt",
                                               filetypes=[("Text files", "*.txt"), ("All files", "*.*")])
    if file_path:
        with open(file_path, "w", encoding="utf-8") as file:
            file.write(text_widget.get(1.0, tk.END))  # テキストをファイルに保存
def create_notepad():
    global text_widget
    root = tk.Tk()
    root.title("簡易メモ帳")
    # メニューの作成
    menu = Menu(root)
    root.config(menu=menu)
    file_menu = Menu(menu)
    menu.add_cascade(label="ファイル", menu=file_menu)
    file_menu.add_command(label="開く", command=open_file)
    file_menu.add_command(label="保存", command=save_file)
    # Textウィジェットの作成
    text_widget = tk.Text(root, wrap=tk.WORD)
    text_widget.pack(expand=True, fill='both')
    root.mainloop()
create_notepad()

このコードを実行すると、メニューに「開く」と「保存」オプションが追加され、ファイルの読み込みと保存が可能になります。

テキストの検索・置換機能の追加

次に、テキストの検索と置換機能を追加します。

メニューに「検索」と「置換」オプションを追加し、ダイアログを表示してユーザーからの入力を受け取ります。

import tkinter as tk
from tkinter import Menu, filedialog, simpledialog, messagebox
def search_text():
    search_term = simpledialog.askstring("検索", "検索するテキストを入力してください:")
    if search_term:
        start_index = text_widget.search(search_term, "1.0", tk.END)
        if start_index:
            end_index = f"{start_index}+{len(search_term)}c"
            text_widget.tag_add("highlight", start_index, end_index)
            text_widget.mark_set("insert", end_index)
            text_widget.see("insert")
            text_widget.tag_config("highlight", background="yellow")
        else:
            messagebox.showinfo("結果", "テキストが見つかりませんでした。")
def replace_text():
    search_term = simpledialog.askstring("置換", "置換するテキストを入力してください:")
    replace_term = simpledialog.askstring("置換", "新しいテキストを入力してください:")
    if search_term and replace_term:
        content = text_widget.get(1.0, tk.END)
        new_content = content.replace(search_term, replace_term)
        text_widget.delete(1.0, tk.END)
        text_widget.insert(tk.END, new_content)
def create_notepad():
    global text_widget
    root = tk.Tk()
    root.title("簡易メモ帳")
    # メニューの作成
    menu = Menu(root)
    root.config(menu=menu)
    file_menu = Menu(menu)
    menu.add_cascade(label="ファイル", menu=file_menu)
    file_menu.add_command(label="開く", command=open_file)
    file_menu.add_command(label="保存", command=save_file)
    edit_menu = Menu(menu)
    menu.add_cascade(label="編集", menu=edit_menu)
    edit_menu.add_command(label="検索", command=search_text)
    edit_menu.add_command(label="置換", command=replace_text)
    # Textウィジェットの作成
    text_widget = tk.Text(root, wrap=tk.WORD)
    text_widget.pack(expand=True, fill='both')
    root.mainloop()
create_notepad()

このコードを実行すると、メニューに「検索」と「置換」オプションが追加され、指定したテキストを検索したり、置換したりできるようになります。

テキストのフォーマット機能の追加

最後に、テキストのフォーマット機能を追加します。

例えば、フォントサイズやスタイルを変更するオプションをメニューに追加します。

def change_font_size():
    size = simpledialog.askinteger("フォントサイズ", "新しいフォントサイズを入力してください:", minvalue=1)
    if size:
        text_widget.config(font=("Arial", size))
def create_notepad():
    global text_widget
    root = tk.Tk()
    root.title("簡易メモ帳")
    # メニューの作成
    menu = Menu(root)
    root.config(menu=menu)
    file_menu = Menu(menu)
    menu.add_cascade(label="ファイル", menu=file_menu)
    file_menu.add_command(label="開く", command=open_file)
    file_menu.add_command(label="保存", command=save_file)
    edit_menu = Menu(menu)
    menu.add_cascade(label="編集", menu=edit_menu)
    edit_menu.add_command(label="検索", command=search_text)
    edit_menu.add_command(label="置換", command=replace_text)
    format_menu = Menu(menu)
    menu.add_cascade(label="フォーマット", menu=format_menu)
    format_menu.add_command(label="フォントサイズ変更", command=change_font_size)
    # Textウィジェットの作成
    text_widget = tk.Text(root, wrap=tk.WORD)
    text_widget.pack(expand=True, fill='both')
    root.mainloop()
create_notepad()

このコードを実行すると、メニューに「フォーマット」オプションが追加され、フォントサイズを変更する機能が実装されます。

これにより、ユーザーはテキストの見た目をカスタマイズできるようになります。

応用例:Textウィジェットを使ったチャットアプリの作成

Textウィジェットを使用して、シンプルなチャットアプリケーションを作成することができます。

このセクションでは、チャット画面のレイアウト、メッセージの送信と表示、スクロール機能の実装、メッセージの履歴保存機能について解説します。

チャット画面のレイアウト

まずは、チャットアプリの基本的なレイアウトを作成します。

メッセージ表示用のTextウィジェットと、メッセージ入力用のEntryウィジェットを配置します。

import tkinter as tk
def create_chat_app():
    root = tk.Tk()
    root.title("チャットアプリ")
    # メッセージ表示用のTextウィジェット
    text_widget = tk.Text(root, state=tk.DISABLED, wrap=tk.WORD)
    text_widget.pack(expand=True, fill='both')
    # メッセージ入力用のEntryウィジェット
    entry_widget = tk.Entry(root)
    entry_widget.pack(fill='x')
    root.mainloop()
create_chat_app()

このコードを実行すると、メッセージ表示用のテキストボックスとメッセージ入力用のエントリーボックスが表示されます。

メッセージの送信と表示

次に、メッセージを送信して表示する機能を追加します。

Entryウィジェットに入力されたメッセージをTextウィジェットに表示し、送信ボタンを作成します。

def send_message():
    message = entry_widget.get()
    if message:
        text_widget.config(state=tk.NORMAL)  # Textウィジェットを編集可能に
        text_widget.insert(tk.END, f"あなた: {message}\n")  # メッセージを表示
        text_widget.config(state=tk.DISABLED)  # Textウィジェットを読み取り専用に
        entry_widget.delete(0, tk.END)  # Entryウィジェットをクリア
def create_chat_app():
    global text_widget, entry_widget
    root = tk.Tk()
    root.title("チャットアプリ")
    # メッセージ表示用のTextウィジェット
    text_widget = tk.Text(root, state=tk.DISABLED, wrap=tk.WORD)
    text_widget.pack(expand=True, fill='both')
    # メッセージ入力用のEntryウィジェット
    entry_widget = tk.Entry(root)
    entry_widget.pack(fill='x')
    # 送信ボタンの作成
    send_button = tk.Button(root, text="送信", command=send_message)
    send_button.pack()
    root.mainloop()
create_chat_app()

このコードを実行すると、メッセージを入力して送信ボタンをクリックすることで、メッセージが表示されるようになります。

スクロール機能の実装

長いメッセージが表示される場合、スクロール機能を追加することが便利です。

Textウィジェットにスクロールバーを追加し、メッセージが増えたときにスクロールできるようにします。

def create_chat_app():
    global text_widget, entry_widget
    root = tk.Tk()
    root.title("チャットアプリ")
    # フレームの作成
    frame = tk.Frame(root)
    frame.pack(expand=True, fill='both')
    # メッセージ表示用のTextウィジェット
    text_widget = tk.Text(frame, state=tk.DISABLED, wrap=tk.WORD)
    text_widget.pack(side=tk.LEFT, expand=True, fill='both')
    # スクロールバーの作成
    scrollbar = tk.Scrollbar(frame, command=text_widget.yview)
    scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
    text_widget.config(yscrollcommand=scrollbar.set)
    # メッセージ入力用のEntryウィジェット
    entry_widget = tk.Entry(root)
    entry_widget.pack(fill='x')
    # 送信ボタンの作成
    send_button = tk.Button(root, text="送信", command=send_message)
    send_button.pack()
    root.mainloop()
create_chat_app()

このコードを実行すると、メッセージが増えたときにスクロールバーを使ってメッセージをスクロールできるようになります。

メッセージの履歴保存機能

最後に、送信したメッセージの履歴を保存する機能を追加します。

メッセージをファイルに保存するためのボタンを作成し、履歴をテキストファイルに書き出します。

def save_history():
    with open("chat_history.txt", "w", encoding="utf-8") as file:
        file.write(text_widget.get(1.0, tk.END))  # Textウィジェットの内容をファイルに保存
def create_chat_app():
    global text_widget, entry_widget
    root = tk.Tk()
    root.title("チャットアプリ")
    # フレームの作成
    frame = tk.Frame(root)
    frame.pack(expand=True, fill='both')
    # メッセージ表示用のTextウィジェット
    text_widget = tk.Text(frame, state=tk.DISABLED, wrap=tk.WORD)
    text_widget.pack(side=tk.LEFT, expand=True, fill='both')
    # スクロールバーの作成
    scrollbar = tk.Scrollbar(frame, command=text_widget.yview)
    scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
    text_widget.config(yscrollcommand=scrollbar.set)
    # メッセージ入力用のEntryウィジェット
    entry_widget = tk.Entry(root)
    entry_widget.pack(fill='x')
    # 送信ボタンの作成
    send_button = tk.Button(root, text="送信", command=send_message)
    send_button.pack()
    # 履歴保存ボタンの作成
    save_button = tk.Button(root, text="履歴保存", command=save_history)
    save_button.pack()
    root.mainloop()
create_chat_app()

このコードを実行すると、「履歴保存」ボタンをクリックすることで、送信したメッセージの履歴がchat_history.txtというファイルに保存されます。

これにより、チャットの内容を後で確認することができます。

応用例:Textウィジェットを使ったコードエディタの作成

Textウィジェットを使用して、シンプルなコードエディタを作成することができます。

このセクションでは、シンタックスハイライトの実装、行番号の表示、自動インデント機能の追加、ファイルの保存と読み込みについて解説します。

シンタックスハイライトの実装

シンタックスハイライトを実装することで、コードの可読性を向上させることができます。

以下のサンプルコードでは、Pythonのキーワードをハイライトする機能を追加しています。

import tkinter as tk
from tkinter import Text
def highlight_syntax(event=None):
    text_widget.tag_remove("keyword", "1.0", tk.END)  # 既存のハイライトをクリア
    keywords = ["def", "class", "import", "from", "as", "if", "else", "elif", "for", "while", "return"]
    for keyword in keywords:
        start_index = "1.0"
        while True:
            start_index = text_widget.search(keyword, start_index, stopindex=tk.END)
            if not start_index:
                break
            end_index = f"{start_index}+{len(keyword)}c"
            text_widget.tag_add("keyword", start_index, end_index)
            start_index = end_index
    text_widget.tag_config("keyword", foreground="blue")
def create_code_editor():
    global text_widget
    root = tk.Tk()
    root.title("コードエディタ")
    # Textウィジェットの作成
    text_widget = Text(root, wrap=tk.WORD)
    text_widget.pack(expand=True, fill='both')
    # シンタックスハイライトのバインド
    text_widget.bind("<KeyRelease>", highlight_syntax)
    root.mainloop()
create_code_editor()

このコードを実行すると、Pythonのキーワードが青色でハイライトされるコードエディタが表示されます。

行番号の表示

行番号を表示することで、コードの行を簡単に参照できるようになります。

以下のサンプルコードでは、行番号を表示するためのラベルを作成しています。

def update_line_numbers():
    line_numbers = ""
    line_count = int(text_widget.index('end-1c').split('.')[0])
    for i in range(1, line_count + 1):
        line_numbers += f"{i}\n"
    line_number_widget.config(state=tk.NORMAL)
    line_number_widget.delete(1.0, tk.END)
    line_number_widget.insert(tk.END, line_numbers)
    line_number_widget.config(state=tk.DISABLED)
def create_code_editor():
    global text_widget, line_number_widget
    root = tk.Tk()
    root.title("コードエディタ")
    # フレームの作成
    frame = tk.Frame(root)
    frame.pack(expand=True, fill='both')
    # 行番号表示用のTextウィジェット
    line_number_widget = Text(frame, width=4, bg="lightgray", state=tk.DISABLED)
    line_number_widget.pack(side=tk.LEFT, fill='y')
    # コード入力用のTextウィジェット
    text_widget = Text(frame, wrap=tk.WORD)
    text_widget.pack(expand=True, fill='both')
    # 行番号の更新
    text_widget.bind("<KeyRelease>", lambda event: [highlight_syntax(), update_line_numbers()])
    text_widget.bind("<ButtonRelease-1>", update_line_numbers)
    root.mainloop()
create_code_editor()

このコードを実行すると、左側に行番号が表示されるコードエディタが作成されます。

自動インデント機能の追加

自動インデント機能を追加することで、コードの整形が容易になります。

以下のサンプルコードでは、Tabキーを押したときに自動的にインデントを追加する機能を実装しています。

def auto_indent(event):
    if event.keysym == "Tab":
        text_widget.insert(tk.INSERT, "    ")  # 4スペースのインデントを追加
        return "break"  # Tabキーのデフォルト動作を無効にする
def create_code_editor():
    global text_widget, line_number_widget
    root = tk.Tk()
    root.title("コードエディタ")
    # フレームの作成
    frame = tk.Frame(root)
    frame.pack(expand=True, fill='both')
    # 行番号表示用のTextウィジェット
    line_number_widget = Text(frame, width=4, bg="lightgray", state=tk.DISABLED)
    line_number_widget.pack(side=tk.LEFT, fill='y')
    # コード入力用のTextウィジェット
    text_widget = Text(frame, wrap=tk.WORD)
    text_widget.pack(expand=True, fill='both')
    # 行番号の更新
    text_widget.bind("<KeyRelease>", lambda event: [highlight_syntax(), update_line_numbers()])
    text_widget.bind("<ButtonRelease-1>", update_line_numbers())
    text_widget.bind("<Key>", auto_indent)
    root.mainloop()
create_code_editor()

このコードを実行すると、Tabキーを押すと自動的に4スペースのインデントが追加されるようになります。

ファイルの保存と読み込み

最後に、ファイルの保存と読み込み機能を追加します。

メニューに「保存」と「開く」オプションを追加し、ファイルダイアログを使用してファイルを選択します。

from tkinter import filedialog
def open_file():
    file_path = filedialog.askopenfilename(defaultextension=".py",
                                             filetypes=[("Python files", "*.py"), ("All files", "*.*")])
    if file_path:
        with open(file_path, "r", encoding="utf-8") as file:
            text_widget.delete(1.0, tk.END)  # 既存のテキストをクリア
            text_widget.insert(tk.END, file.read())  # ファイルの内容を挿入
        update_line_numbers()  # 行番号を更新
def save_file():
    file_path = filedialog.asksaveasfilename(defaultextension=".py",
                                               filetypes=[("Python files", "*.py"), ("All files", "*.*")])
    if file_path:
        with open(file_path, "w", encoding="utf-8") as file:
            file.write(text_widget.get(1.0, tk.END))  # テキストをファイルに保存
def create_code_editor():
    global text_widget, line_number_widget
    root = tk.Tk()
    root.title("コードエディタ")
    # メニューの作成
    menu = tk.Menu(root)
    root.config(menu=menu)
    file_menu = tk.Menu(menu)
    menu.add_cascade(label="ファイル", menu=file_menu)
    file_menu.add_command(label="開く", command=open_file)
    file_menu.add_command(label="保存", command=save_file)
    # フレームの作成
    frame = tk.Frame(root)
    frame.pack(expand=True, fill='both')
    # 行番号表示用のTextウィジェット
    line_number_widget = Text(frame, width=4, bg="lightgray", state=tk.DISABLED)
    line_number_widget.pack(side=tk.LEFT, fill='y')
    # コード入力用のTextウィジェット
    text_widget = Text(frame, wrap=tk.WORD)
    text_widget.pack(expand=True, fill='both')
    # 行番号の更新
    text_widget.bind("<KeyRelease>", lambda event: [highlight_syntax(), update_line_numbers()])
    text_widget.bind("<ButtonRelease-1>", update_line_numbers())
    text_widget.bind("<Key>", auto_indent)
    root.mainloop()
create_code_editor()

このコードを実行すると、メニューに「開く」と「保存」オプションが追加され、Pythonファイルを読み込んだり保存したりできるようになります。

これにより、シンプルなコードエディタが完成します。

まとめ

この記事では、PythonのTkinterライブラリを使用して、Textウィジェットを活用したさまざまなアプリケーションの作成方法について解説しました。

具体的には、複数行入力が可能なTextウィジェットの基本的な使い方から、カスタマイズ、イベント処理、さらには応用例として簡易メモ帳やチャットアプリ、コードエディタの作成方法に至るまで、幅広く取り上げました。

これを機に、Tkinterを使ったGUIアプリケーションの開発に挑戦し、自分自身のプロジェクトを進めてみてはいかがでしょうか。

関連記事

Back to top button