Tkinterで簡単なログ取りを作成

学部生時代に自分の学習用に作ったログ取りプログラムを突貫工事で作ってみました。

昔（学部２年時）はC++(Qt)を使って作成しましたが、今回は面倒だったのでPythonのTkinterを使って作ってみました。

# 開発環境
MacOS High Sierra 10.13.2

Python  3.6.4

tkinter

# どんなものを作る？
昔作ったときのコンセプトとしては、

- 一言のメモをどんどん蓄積していく
- 時系列順（年月日秒）にログが残っていく
- 邪魔にならないような小さいウィンドウ
- クロスプラットフォーム

こんな感じでした。
WebのURLと一言コメントを一緒に残したり、教授がぼそっと言った言葉なんかを拾い上げてました。

# Tkinterとは
いろいろな方が説明されているので、ここでは省きます。
ものすごく簡単に言えば、PythonでGUIを作ることができるキットです。

# 実装
起動時処理としては、
1. ログを保存する場所を決める(初回のみ)
2. メニューとテキストフィールドを用意する
3. キーバインドとコールバック関数の設定
となっております。

## ログを保存する場所を決める(初回のみ)
```python
def initProcess(self):
        """
        初期化処理
        コンフィグファイルから設定を読み込み、Logger/[年]/[月日].txtを作る
        """
        self.checkExistFile(CONFIGFILE_NAME) #コンフィグファイルの存在を確認

        with open(CONFIGFILE_NAME) as f:
            self.rootDirPath = f.read() # Logを保存するディレクトリパスを取得

        if self.rootDirPath == "": # ディレクトリパスが無かったら、新しく設定する
            self.selectRootDir()
            with open(CONFIGFILE_NAME,'w') as f:
                f.write(self.rootDirPath)

        if os.path.isdir(self.rootDirPath + LOGDIR_NAME) == False: # Logディレクトリが無かったら新しく作成する
            print(self.rootDirPath+LOGDIR_NAME)
            os.mkdir(self.rootDirPath+LOGDIR_NAME)

def selectRootDir(self):
        """
        ログを保存するディレクトリを選択するダイアログを出す
        """
        root = tkinter.Tk()
        root.withdraw()

        root.overrideredirect(True)
        root.geometry('0x0+0+0')

        root.deiconify()
        root.lift()
        root.focus_force()

        self.rootDirPath = tkFileDialog.askdirectory(parent=root)
        root.destroy()
```

## メニューとテキストフィールドを用意する
```python
def __init__(self,master=None):
        """
        コンストラクタ
        初期化処理を行う
        """
        tkinter.Frame.__init__(self,master)  # Logger本体のフレームを初期化
        self.font = 'メイリオ'                # フォント設定
        self.master.title("Logger")          # フレームタイトルの設定
        self.config(width=20,height=20)      # フレームサイズの設定

        self.fileMgr = FileManager()         # ファイル管理クラスインスタンスを作成

        # ログ書き込み部とメニュー部の初期化
        self.createTextField()
        self.createMenu()
        self.master.configure(menu=self.menu)

        self.pack()

    def createTextField(self):
        """
        テキストフィールドを作成する
        """
        self.txt = tkinter.scrolledtext.ScrolledText(self.master,width=30, height=10, font=(self.font, '15'))
        self.txt.pack(fill=tkinter.BOTH, expand=1)

    def createMenu(self):
        """
        メニューを作成する
        """
        self.menu = tkinter.Menu(self.master)
        me = tkinter.Menu(self.master)
        me.add_command(label='new')
        self.menu.add_cascade(menu=me,label='file')
```

## キーバインドとコールバック関数の設定
```python
def __init__(self,master=None):
        """
        コンストラクタ
        初期化処理を行う
        """
        tkinter.Frame.__init__(self,master)  # Logger本体のフレームを初期化
        self.font = 'メイリオ'                # フォント設定
        self.master.title("Logger")          # フレームタイトルの設定
        self.config(width=20,height=20)      # フレームサイズの設定

        self.fileMgr = FileManager()         # ファイル管理クラスインスタンスを作成

        # ログ書き込み部とメニュー部の初期化
        self.createTextField()
        self.createMenu()
        self.master.configure(menu=self.menu)

        # キーバインド設定
        self.master.bind("<Control-Key-s>",self.save)
        self.master.bind("<Control-Key-r>",self.changeRootDir)

        self.pack()

def save(self,event):
        """
        コールバック関数
        テキストフィールドにある文字列を保存する
        """
        self.fileMgr.write(self.txt.get('1.0', tk.END))
        self.txt.delete('1.0',tk.END)

    def changeRootDir(self,event):
        self.fileMgr.changeRootDirPath()
```

# ソースコード
ちょっとしたソースコードですが一応公開しておきます．[こちら](https://github.com/T-Sumida/Logger)


# 最後に・・・
本当にメモが大事だということに気づいて、必死に作った思い出。
懐かしく思ったが、昔のはもうちょっと機能をもたせていた気がする・・・。
PyInstallerとか使えばバイナリ化できるし、なんとか会社で使ってみようと思います。

「お、日本語が入力できんがな！」となって原因調べようと思ったけど、英語の勉強にはちょうどいいので放置しました。