コーヒーとトネリコ

いいアイデアだと思って書いてみたら、先週上司に説教された内容そのままだった。めげずに生きていきたい

Windowsで思いつきをパッとメモするPythonプログラム

以前、「UBUNTUで思いつきをパッとメモするスクリプト」という記事を書きました。

こちらのスクリプトがとても使い勝手が良い。なにかメモしたりコピペした文章を控えておきたいときに、ホームポジションから手を離さずに記入できるのです。

since1972.hatenablog.com

こんな仕組みです。

  • コントロール+シフト+Jを押す
  • 入力画面が出る
  • 文章を入力するか貼り付けるかする
  • OKボタンを押す/Enterキーを押す
  • 所定の場所の「日付.拡張子」ファイルに上記内容が、入力日時とともに追記される
  • 「日付.拡張子」ファイルがない場合は新規作成する

で、プログラムの勉強を兼ねて、ubuntu向けのbashで書いた上記のスクリプトを、パイソンに移行しました。

bashだと17行で済んだファイルが、パイソンだと65行になった。俺の手腕に起因するのかもしれないが、まあこんなものだろう。

で、これをWindowsに移せたらいいな、と思ってあれこれやったわけです。

ハマったのは、「日付.拡張子」ファイルへのパス。Ubuntuだとスラッシュでつないでディレクトリを表現すればいいのだけれど、Windowsだとそうはいかない。うまく動かない。

試行錯誤してわかったことは、「Windowsの場合はディレクトリをスラッシュで表現するのだけれど、その前にエスケープ文字のバックスラッシュを入れる必要がある」でした。確かそうでした。そうだっと思います。

あと、文字化けしたので入力する部分に明示的にエンコーディングを入れました。"endcoding-'utf-8'"みたいなやつを入れました。

まあこれは文字化けしているからなんかエンコーディングをいじればいいんだな、ということで早く解決できたけれど、パスの表記はわかりやすいエラーが出ず、半日くらいあれこれ検索していたような気がします。仕事中だったような気がするけど、たぶんそうではないと思います。

自分の場合は「日付.拡張子」が「yyyy-mm-dd.md」というマークダウンファイルになっていて、「日付+時間(太字)+入力内容」という形で追記しています。

で、Winhotokeyというフリーソフトを入れて、上記内容のパイソンファイルを「コントロール+シフト+J」に割り当てて、グローバルホットキーとして機能するように設定しています。

こんな画面が出現します。

ショートカットキーを押すと、一瞬コマンドプロンプトの画面が出現しますが、その後パイソンで設定した上記の入力ウインドウが出現。入力したらタブキーでOKボタンに移動して、Enterキーで入力完了です。

マークダウンファイルにはこんな感じにどんどん追記されます。

以下がプログラムの内容です。

#!/usr/bin/env python3
# -*- coding: utf8 -*-
# jot.py : テキストを追記するプログラム
# 
# #ライブラリをインポート
import os
import datetime
import sys

from tkinter import *
from tkinter import ttk

# 日付を「yyyy-MM-dd_hh:mm:ss」形式で取得する
now = datetime.datetime.today().strftime('%Y-%m-%d %H:%M:%S')

#ファイル名用の日付の取得
filename = datetime.date.today().strftime('%Y-%m-%d')

#ファイルの有無を確認してなければ作成
if os.path.exists('ファイルが入ってるディレクトリへのパス' + filename + '.md') == False:
    dailynote = 'ファイルが入ってるディレクトリへのパス' + filename + '.md'

#関数
def append_to_dailynote(event=None):
  #ここで,valueにEntryの中身が入る
  value = EntryText_entry.get()
  #ファイルに「改行+日時(太字)+入力内容」を追記してウインドウを閉じる
  with open('ファイルが入ってるディレクトリへのパス' + filename + '.md', 'a') as f:
    f.write('\n\***' + now +'***'+ '\n\n' + value+'\n')
  root.destroy()

#ウインドウの設計
root = Tk()
root.title('ウインドウのタイトル')
root.resizable(False, False)
frame1 = ttk.Frame(root, padding=(16))
frame1.grid()

label1 = ttk.Label(frame1, text='入力窓のラベル', padding=(5, 2))
label1.grid(row=0, column=0, sticky=E)

# 入力画面
EntryText = StringVar()
EntryText_entry = ttk.Entry(
    frame1,
    width=60)
EntryText_entry.grid(row=0, column=1)
EntryText_entry.focus()

frame2 = ttk.Frame(frame1, padding=(0, 5))
frame2.grid(row=2, column=1, sticky=W)

#ボタン
button1 = ttk.Button(
    frame2, text='OK',
    command=append_to_dailynote)
button1.pack(side=LEFT)
button1.bind('<Return>',append_to_dailynote)

button2 = ttk.Button(frame2, text='Cancel', command=quit)
button2.pack(side=LEFT)
button2.bind('<Return>',quit)
root.mainloop()

ぜひご活用ください。