Windowsのメモ帳をつくってみる(2)

はじめに

本記事は、下記記事の続きです。 agepan.hatenablog.com

メニューバーの作成

GUIテキストエディターを作成するにあたって、メニューバーは必要だなということで作成していきます。 今回は見た目のみで処理は別途考えることにします(Exit実行時プログラムを終了するようにだけしました)。

tk.Menu()によりメニューバーを定義します。

add_cascade()を使用して、メニューバーのデフォルトで表示されているメニューを記述します。 この時文字列はlabelを用いて指定します。

add_command()を使用して、cascade()で宣言した配下にさらに詳細メニューを作成することができます。 こちらも文字列は同様にlabelを用いて指定します。

command()を使用することで、add_command()をクリックした際の処理を指定することができます。

import tkinter as tk
import sys

class Textarea(tk.Frame):
    def __init__(self, master=None):
        # 親フレームの引継ぎ
        tk.Frame.__init__(self, master)
        # タイトル定義
        master.title('test')
        # Windowの大きさの定義
        master.geometry('1280x720')
        # Textareaの定義
        self.text = tk.Text(master)
        #scrollbar
        self.scrollx = tk.Scrollbar(master, orient=tk.HORIZONTAL)
        self.scrolly = tk.Scrollbar(master, orient=tk.VERTICAL)
        self.scrollx.pack(side="bottom", fill="x")
        self.scrolly.pack(side="right", fill="y")
        # Textareaの表示
        self.text.pack(fill="both", expand=True)
        # scrollbarとTextareaの同期
        self.text["yscrollcommand"] = self.scrolly.set
        self.text["xscrollcommand"] = self.scrollx.set
        self.text["wrap"] = "none"

        # menubar
        men = tk.Menu(master)
        master.config(menu=men)
        menu_file = tk.Menu(men,tearoff=0)
        menu_edit = tk.Menu(men,tearoff=0)
        menu_format = tk.Menu(men,tearoff=0)
        menu_view = tk.Menu(men,tearoff=0)
        menu_help = tk.Menu(men,tearoff=0)
        men.add_cascade(label="file", menu=menu_file)
        menu_file.add_command(label='New', under=0)
        menu_file.add_command(label='Open...', under=0)
        menu_file.add_command(label='Save', under=0)
        menu_file.add_command(label='Save As...', under=0)
        menu_file.add_separator()
        menu_file.add_command(label='Page Setup...', under=0)
        menu_file.add_command(label='Print...', under=0)
        menu_file.add_separator()
        menu_file.add_command(label='Exit', under=0, command=sys.exit)
        men.add_cascade(label='Edit',menu=menu_edit)
        men.add_cascade(label='Format',menu=menu_format)
        men.add_cascade(label='View',menu=menu_view)
        men.add_cascade(label='Help',menu=menu_help)

if __name__ == "__main__":
    root = tk.Tk()
    textarea = Textarea(root)
    root.mainloop()

これを実行すると以下のようにメニューバーを表示することができます。 f:id:agepan4869:20211114122907p:plain

Tab文字をスペースに

ふと、タブを入力したら、タブ文字で入力されていて、個人的に嫌だったのでスペースでのタブに変更します。

タブ関数と、バインドのショートカットを作成します。 タブ関数では、スペースを4つ入力するように処理を記述します。

また、が入力された際の処理を作成したタブ関数に変更します。

実際に作成したコードが以下になります。

class Textarea(tk.Frame):
    def tab(self, *args):
        self.text.insert(tk.INSERT, ' ' * 4)
        return 'break'

    def bind_shortcuts(self, *args):
        text = self.text
        text.bind('<Tab>', self.tab)

これで無事タブを4スペースで入力されるのでうれしくなれました。

さいごに

今回は、ちょっとした実装のみを行いました。 次は、行番号の表示に挑戦してみたいと思います。