見出し画像

自動読み込みと自動保存

(Python学習初心者の試行錯誤・備忘録です)
 アプリ起動時、および終了時に、データの読み込み、書き出しを自動的に行いたいな…と思いました。

 たとえば、
・「メモ帳」のようなアプリで何か書く。
・プログラムを終了するときに、書いていた内容を自動的に保存する。
・次回アプリを起動したときに、内容を読みだして続きから作業できる。
…みたいな感じです。

 前回、PySimpleGUIからTkEasyGUIに乗り換えたと書きました。

ですが、今回の検討は、乗り換え前にやっていた内容なので、PySimpleGUIのままです。

まず骨組み。

import PySimpleGUI as sg

# GUI定義
layout = [
     [sg.Text("メモ")],
     [sg.Multiline(size=(50,10))]
]
window = sg.Window("メモ帳", layout)

# イベント処理
while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED:
        break 
window.close()

これを実行すると

メモ帳みたいなウインドウがでます。右上の「×」をクリックすると閉じます。もちろんこれだけでは、メモの中に何か書いていても、アプリを閉じると消えてしまいます。「保存して終了」するボタン付けてみます。

import PySimpleGUI as sg

# GUI定義
layout = [
     [sg.Text("メモ")],
     [sg.Multiline(size=(50,10),key="-multiline-")],
     [sg.Button("保存して終了",key="-saveandquit-")]
]
window = sg.Window("メモ帳", layout)

# イベント処理
while True:
    event, value = window.read()
    if event == sg.WIN_CLOSED:
        break 
    if event == "-saveandquit-":
        with open("data.txt","w",encoding="utf-8") as f:
            f.write(value["-multiline-"])
        break
window.close()

 これで、「保存して終了」をクリックすれば、data.txtと言う名称で保存されるようになりました。但し、右上の「×」をクリックしたときは保存されません。次のようにやったらいけるかと思ったんですが

#抜粋
while True:
    event, value = window.read()
    if event == sg.WIN_CLOSED:
        with open("data.txt","w",encoding="utf-8") as f:
            f.write(value["-multiline-"])
        break
    if event == "-saveandquit-":
        with open("data.txt","w",encoding="utf-8") as f:
            f.write(value["-multiline-"])
        break
window.close()

これですと「×」をクリックすると f.write(value["-multiline-"]) のところでエラーになります。value["-multiline-"] が無いようです。
 「×」をクリックした時の動作を変更したいのですがやり方が分からなかったので、「何も起こらない」ようにします。(アプリを終了するには「保存して終了」をクリックするしかないようにする。)
AI (MicrosoftのCOPILOT) に教わりながら次のように書き換えたところ、「×をクリック」して閉じる動作が無効になりました。

import PySimpleGUI as sg

# GUI定義
layout = [
     [sg.Text("メモ")],
     [sg.Multiline(size=(50,10),key="-multiline-")],
     [sg.Button("保存して終了",key="-saveandquit-")]
]
window = sg.Window("メモ帳", layout, finalize=True)
window.TKroot.protocol('WM_DELETE_WINDOW', lambda: None)
# イベント処理
while True:
    event, value = window.read()
    if event == sg.WIN_CLOSED:
        break
    if event == "-saveandquit-":
        with open("data.txt","w",encoding="utf-8") as f:
            f.write(value["-multiline-"])
        break
window.close()

あとは起動時に data.txtの読み込みを試みるようにします。

import PySimpleGUI as sg

with open("data.txt","r",encoding="utf-8") as f:
    multilinetext=f.read()

# GUI定義
layout = [
     [sg.Text("メモ")],
     [sg.Multiline(default_text=multilinetext ,size=(50,10),key="-multiline-")],
     [sg.Button("保存して終了",key="-saveandquit-")]
]
window = sg.Window("メモ帳", layout, finalize=True)
window.TKroot.protocol('WM_DELETE_WINDOW', lambda: None)
# イベント処理
while True:
    event, value = window.read()
    if event == sg.WIN_CLOSED:
        break
    if event == "-saveandquit-":
        with open("data.txt","w",encoding="utf-8") as f:
            f.write(value["-multiline-"])
        break
window.close()

これで希望した動作が実現できました。

さて、ここで、PySimpleGUI を TkEasyGUIに置き換えて同じことができるか?試してみたところ

    window.TKroot.protocol('WM_DELETE_WINDOW', lambda: None)
    ^^^^^^^^^^^^^
AttributeError: 'Window' object has no attribute 'TKroot'

となってしまいました。

window.TKroot.protocol('WM_DELETE_WINDOW', lambda: None)

のところをコメントアウトすれば

「×」で閉じるのが無効化できていない以外は、問題なく動作しました。


いいなと思ったら応援しよう!