pythonで簡易メモ帳の作成

<h2>pythonで簡易的なメモ帳を作る方法</h2>
今回は名前を付けて保存と入力テキスト内の文字をクリアにする機能を付けたいと思います。
<h3>必要なものimport</h3>
メモ帳を作る際の土台である、tkinterとfiledialogをimportします。
こちらのtkinterはpythonダウンロードでデフォルトで入っています。

```py
import tkinter as tk
from tkinter import filedialog as fd
```

ここでtkinterは長いので、asでtkという名前に置き換えています。
後半から必要になるfiledialogもfdという短い名前で置き換えます。

<h3>メモ帳ウィンドウの表示</h3>

```py
#tk.Tk()をrootに設定
root=tk.Tk()
#タイトルを決める
root.title('memo')
#テキストが入力できるようにする
text=tk.Text(root)
text.pack()

#ウィンドウ表示
root.mainloop()
```
tk.(asで置き換えたtkinter)Tk()は頻繁に使用するのでrootに置き換えます。
root.title('')でメモ帳のタイトルをmemoに設定します。

root.mainloopでテキストウィンドウを表示できます。
ウィンドウ表示は最後の行に書きますので、root.mainloopとtext.packの間にボタン設定を入れていきます。

このソースコードを実行すると画像のようなウィンドウが表示されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832955/776d98c0-7b94-7bbc-7908-83ceb312c72b.png" width=400>

これが表示されれば、ここまでのソースコードは正しいということになります。

<h3>空ボタンの作り方</h3>
先に空のボタンを右下に表示するように記述していきます。

```py
save_button=tk.Button(root,text='save as',command='')
save_button.pack(side=tk.RIGHT)

clean_button=tk.Button(root,text='clean',command='')
clean_button.pack(side=tk.RIGHT)
```

save_bottonは、「名前を付けて保存」ボタンです。text=で名前を「save as」にしています。
下のclaen_bottonは、「クリア」ボタンです。text=で名前を「claen」にしています。
※ボタンの機能を実行する際にcommandを使うので、今は「''」に設定します。
save_botton.pack(side=tk.右側)に設定しています。（ここをLEFTにすると、左に設定できます。）

このソースコードを実行するとこのように表示されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832955/d598ae08-22ac-75c6-a913-72e7716a0684.png" width=400>

黄色いラインの箇所にcleanボタンとsave asボタンが表示されました。
こちらは、空で機能を付けていないので押しても何も起こりません。

<h3>名前を付けて保存ボタンの機能を設定</h3>
名前を付けて保存の機能をdefで定義します。

```py
def save_text():
    #ファイル名を.txtに設定する(他のメモソフトでも開けるようにする)
    #askssavesfilenameで、「名前を付けて保存が可能」
    filename=fd.asksaveasfilename(defaultextension='.txt',filetypes=[('テキストファイル','*.txt')])
    #上記の設定したfilenameに入力したテキストを1.0からendまでutf-8で取得する
    if filename:
        with open(filename,'w',encoding='utf-8') as f:
            f.write(text.get(1.0,'end'))
```

まず、保存するときのファイル名を設定します。
最初にimportしたfd(filedialog)を使い、asksavesfilnameで名前を付けて保存ができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832955/8a9c39c3-e976-eecf-45eb-d8a7e37b9af0.png" width=500>
<br>※後で実行するとこうなる

if filenameの部分は、.txtで設定した場合のファイルにwith open...as f:でファイルにutf-8(日本語)で書くように設定して、1.0(テキストの最初)~end(終わり)までを取得する。

これを先ほどのcommandの中にdefで作った関数をいれる。

```py
save_button=tk.Button(root,text='save as',command='')
```
↓
```py
save_button=tk.Button(root,text='save as',command=save_text)
```
※''はいらない

<h3>クリアボタンの機能を設定</h3>

次に入力されたテキスト内の文字をクリアにします。

```py
def clean_text():
    #入力したテキスト内の1.0からendまでをdeleteする
    text.delete(1.0,'end')
```

ここはシンプルでtext.deleteで()のなかで指定した範囲を削除します。
これも、clean_textという関数で定義します。

save_textの時と同じようにclean_buttonのcommandに関数を入れていきます。

```py
clean_button=tk.Button(root,text='clean',command='')
```
↓
```py
clean_button=tk.Button(root,text='clean',command=clean_text)
```
※''いらない

ここまで出来たら、完成です。

<h3>全体のソースコード</h3>

```py
import tkinter as tk
from tkinter import filedialog as fd

#tk.Tk()をrootに設定
root=tk.Tk()
#タイトルを決める
root.title('memo')
#テキストが入力できるようにする
text=tk.Text(root)
text.pack()

#save asの機能をsave_text関数で定義する
def save_text():
    #ファイル名を.txtに設定する(他のメモソフトでも開けるようにする)
    #askssavesfilenameで、「名前を付けて保存が可能」
    filename=fd.asksaveasfilename(defaultextension='.txt',filetypes=[('テキストファイル','*.txt')])
    #上記の設定したfilenameに入力したテキストを1.0からendまでutf-8で取得する
    if filename:
        with open(filename,'w',encoding='utf-8') as f:
            f.write(text.get(1.0,'end'))

#名前を付けて保存のボタンを右側に着ける　commandで先ほど定義したsave_textを指定する
save_button=tk.Button(root,text='save as',command=save_text)
save_button.pack(side=tk.RIGHT)

#メモ帳内のテキストをクリアにする処理の関数を定義する
def clean_text():
#入力したテキスト内の1.0からendまでをdeleteする
    text.delete(1.0,'end')

#clean_textのボタンを右側に作る　commandでclean_textを指定する
clean_button=tk.Button(root,text='clean',command=clean_text)
clean_button.pack(side=tk.RIGHT)

#ウィンドウ表示
root.mainloop()
```

<h4>まとめ</h4>

学校のpythonの自由課題作成でメモ帳を初めて作成しました。
作成方法を検索し、眺めているだけではとても難しく感じましたが実際作成してコードを読み解くと非常にわかりやすい仕組みとなっていました。
今回は二つの機能しかつけませんでしたが、もっと自分自身が便利に使えるよう機能を追加していきたいです。
また、背景色の変更やボタンの色変更にも挑戦したいと思います。