PostIt風メモ

投稿者: | 2023-02-05

目次

TODO

  • 画面のリサイズはできるが、入力画面が広がるわけではないので修正要 →済み
  • フォントやサイズは変えたい
  • 右クリックメニューの設定がまだ

備忘

  • Multiline中でEnterキーを押すと event が発生する方法がわからなかった
  • 方法
    • Multiline において、enter_submits=True
    • Button において、bind_return_key=True、で双方が連携する
ポイントは囲み箇所

MLの画面サイズと入力サイズを可変へ

  • resizable=True, finalize=True
window = sg.Window(〜
      resizable=True, finalize=True)
# MLなどの画面サイズと合わせて入力サイズも変更したいときはこの2つはセットにある

Scripts

  • ▼Ver3
import PySimpleGUI as sg
from datetime import datetime
import pathlib

c = '#FFFF88'

sg.set_options(font='default 14', keep_on_top=True)

# 保存ファイルPATH
text_p = r"/~~~/memo.txt"

def write_text(s):
    """
    テキストファイルの先頭に追加保存する関数

    Para    :s      str
    Returns :None
    """
    now = datetime.now().strftime('%y/%m/%d-%H:%M:%S')
    p = pathlib.Path(text_p)
    if p.exists():
        past_text = p.read_text()
        add_text = '\n\n' + now + '\n' + '-'*50 + '\n' + s + past_text
        p.write_text(add_text)
    else:
        new_text = '\n\n' + now + '\n' + '-'*50 + '\n' + s
        p.write_text(new_text)

def clear_text():
    p = pathlib.Path(text_p)
    is_Yes = sg.popup_yes_no("バックアップファイルをクリアします。\n本当によろしいですか?", title="削除の確認")
    print(is_Yes)
    if is_Yes == 'Yes':
        p.write_text("")
    else:
        pass


def make_window():

    layout = [[sg.Multiline("", size=(30, 5), k='-ML-',
                            enter_submits=True, pad=(10, 5), background_color=c, border_width=0, no_scrollbar=True)],
              [sg.B("", k='-Enter-', bind_return_key=True, button_color=c, border_width=0, font=('default 1'))] # 最小の非表示ボタン
             ]

    
    window = sg.Window( "", layout, location=(1600, 100),
                        no_titlebar=False, # <- Mac:Trueだと入力不可のためFalseへ(WinはTrue可)
                        resizable=True, alpha_channel=0.8,
                        margins=(0, 0), background_color=c,
                        grab_anywhere=True, 
                        # 右クリックメニュー、アプリ化→設定ファイルで保存する?
                        right_click_menu=[[''],
                                            ['Timer', ['未実装'],
                                            'Alpha', [str(x) for x in range(1, 11)],
                                            'Delete File',
                                            'Save', ['未実装'],
                                            'Exit']]
                        )

    return window

def main():

    window = make_window()

    while True:
        event, values = window.read()
        print(event, values)
        if event in (sg.WIN_CLOSED, "Exit"):
            break

        elif event == '-Enter-':
            text = values['-ML-']
            write_text(text)

        elif event in [str(x) for x in range(1,11)]:
            window.set_alpha(int(event)/10)

        elif event == 'Delete File':
            clear_text()

    window.close()

if __name__ == '__main__':
    main()
  • ▼Ver2
    • 全体的に書き換え
    • バックアップファイルへの追記をファイルの先頭にできるようにした
    • データをクリアする機能
    • 右クリックメニューは未実装
import PySimpleGUI as sg
from datetime import datetime
import pathlib

c = '#FFFF88'

sg.set_options(font='default 14', keep_on_top=True)

# 保存ファイルPATH
text_p = r"/Users/mbp441/Desktop/memo.txt"

def write_text(s):
    """
    テキストファイルの先頭に追加保存する関数

    Para    :s      str
    Returns :None
    """
    now = datetime.now().strftime('%y/%m/%d-%H:%M:%S')
    p = pathlib.Path(text_p)
    past_text = p.read_text()
    add_text = '\n\n' + now + '\n' + '-'*50 + '\n' + s + past_text
    p.write_text(add_text)

def clear_text():
    p = pathlib.Path(text_p)
    is_Yes = sg.popup_yes_no("バックアップファイルをクリアします。\n本当によろしいですか?", title="削除の確認")
    print(is_Yes)
    if is_Yes == 'Yes':
        p.write_text("")
    else:
        pass


def make_window():

    layout = [[sg.Multiline("", size=(30, 5), k='-ML-',
                            enter_submits=True, pad=(10, 5), background_color=c, border_width=0, no_scrollbar=True)],
              [sg.B("", k='-Enter-', bind_return_key=True, button_color=c, border_width=0, font=('default 1'))] # 最小の非表示ボタン
             ]

    
    window = sg.Window( "", layout, location=(1600, 100),
                        no_titlebar=False, # <- Mac:Trueだと入力不可のためFalseへ(WinはTrue可)
                        resizable=True, alpha_channel=0.8,
                        margins=(0, 0), background_color=c,
                        grab_anywhere=True, 
                        # 右クリックメニュー、アプリ化→設定ファイルで保存する?
                        right_click_menu=[[''],
                                            ['Timer', ['未実装'],
                                            'Alpha', [str(x) for x in range(1, 11)],
                                            'Delete File',
                                            'Save', ['未実装'],
                                            'Exit']]
                        )

    return window

def main():

    window = make_window()

    while True:
        event, values = window.read()
        print(event, values)
        if event in (sg.WIN_CLOSED, "Exit"):
            break

        if event == '-Enter-':
            text = values['-ML-']
            write_text(text)

        if event in [str(x) for x in range(1,11)]:
            window.set_alpha(int(event)/10)

        if event == 'Delete File':
            clear_text()

    window.close()

if __name__ == '__main__':
    main()
  • ▼初回Ver
    • これだとMacで文字入力が不可であった
    • 理由:no_titlebar=True だとMacでは文字が入力できない
import PySimpleGUI as sg
from datetime import datetime

"""
post_memo.py

- PostIt系の軽量メモ帳。Enterで指定のテキストファイルに保存可能(日付あり)
"""

# 保存ファイルPATH
text_p = r"C:\Users\yoshi\OneDrive\デスクトップ\memo.txt"

def write_text(s):
    now = datetime.now().strftime('%y/%m/%d-%H:%M:%S')
    with open(text_p, mode='a') as f:
        f.write('\n\n')
        f.write(f"{now}\n")
        f.write(f"{'-'*50}\n")
        f.write(s)

# ----- Make the window -----
def make_window(loc):

    font = "Meiryou, 16"
    alpha = sg.user_settings_get_entry('-alpha-', 1.0)
    c = '#FFFF88'

    # enter_submits=True → bind_return_key=True の2つが連携することで event が発生する
    layout =  [[sg.T("", background_color=c)],
               [sg.Multiline(key='-ML-', size=(30, 5), enter_submits=True, pad=(10, 0), background_color=c, border_width=0, no_scrollbar=True)],
               [sg.B("Enter", bind_return_key=True, button_color=c, border_width=0)],
               [sg.Sizegrip(background_color=c)]
              ]

    window = sg.Window('', layout, no_titlebar=True,
                        grab_anywhere=True, margins=(0, 0), background_color=c,
                        element_padding=(0, 0), location=loc,
                        right_click_menu=[[''], ['Alpha', [str(x) for x in range(1, 11)], 'Choose Title', 'Exit', ]],
                        keep_on_top=True, font=font, resizable=True,
                        finalize=True, alpha_channel=alpha
                      )

    window.set_min_size(window.size)

    return window


def main():
    loc =  sg.user_settings_get_entry('-location-', (None, None))
    window = make_window(loc)

    while True:
        event, values = window.read()
        print(event, values)

        if event in (sg.WIN_CLOSED, 'Exit'):
            if event == 'Exit':
                sg.user_settings_set_entry('-location-', window.current_location())
            break

        # MLでEnterキーを押すとテキストファイルに追加モードで保存
        elif event == 'Enter':
            write_text(values['-ML-'])

        elif event in [str(x) for x in range(1,11)]:
            window.set_alpha(int(event)/10)
            sg.user_settings_set_entry('-alpha-', int(event)/10)

        elif event == 'Choose Title':
            new_title = sg.popup_get_text('Choose a title for your date', default_text="", location=window.current_location(), keep_on_top=True)
            if new_title is not None:
                window['-TITLE-'].update(new_title)
                sg.user_settings_set_entry('-title-', new_title)

    window.close()


if __name__ == '__main__':
    main()
カテゴリー: GUI