こんにちは、のちたままです。
はてなブログ自動投稿プログラム作成第4回です。
前回を見ていない方は先にご覧ください。
今回は少しずれてユーザ情報についての話です。
IDや日付、時刻など何度も同じものを入力するのは非常に手間なので、前回入力した情報を保存しておいて起動時に同じ値が使えるようにしておくと便利です。
今回はそんな話です。
(GUIを完成させるにはこの話をしておかなければいけないのを忘れていました。)
user.jsonについて
前回、プログラムの構成について話をしたと思います。
その時に、GUIからuser.jsonというところに矢印が相互についていたと思います。
あのuser.jsonのお話です。
自分はよくユーザ情報の保存に使っています。
本来は.iniとか使った方がよいと思いますが、使い勝手が良いのでこちらを使っています。
というか趣味で作っているものなので別に形式は問わないといったスタンスです。
細かく言うと異なるのですが、keyと値を使うのは共通しています。
実際に作成したjsonファイルを以下に載せておきます。
{ "Id": "", "Check": { "Id": true, "Day": true, "Time": false}, "Daytime": { "Year": "", "Month": "", "Day": "", "Time": "", "Minutes": "" } }
このようにKeyと値で構成されるのでpythonを触っている人は扱いやすいと思います。
pythonでjsonを使う方法
ここでは簡単にpythonでjson形式のファイルを扱う方法を紹介します。
必要がなければGUIの修正の方まで飛ばしてください。
jsonの読み込み
pythonではありがたいことにjsonのライブラリが標準で存在します。
以下のプログラムで指定したファイルを読み込むことができます。
import json f=open('user.json','r') j=json.load(f) print(j) f.close()
{'Id': '', 'Check': {'Id': True, 'Day': True, 'Time': False}, 'Daytime': {'Year': '', 'Month': '', 'Day': '', 'Time': '', 'Minutes': ''}}
{'Check': {'Day': True, 'Id': True, 'Time': False}, 'Daytime': {'Day': '', 'Minutes': '', 'Month': '', 'Time': '', 'Year': ''}, 'Id': ''}
辞書型と同じで順番に出てくれるわけではないみたいですね。
今回はf=open()
という書き方をしましたが、文字コードの指定など細かい設定が必要ならwith open()
を使う方がよいと思います。
使い方はここでは割愛します。
jsonへの書き込み
書き込みも読み込みとあまり差はありません。
唯一の違いはjson形式のファイルで出力するにはjson.dumpが必要ということでしょうか。
import json f2=open('user.json','w') j["Id"]='nochitamama' json.dump(j,f2) f2.close()
{'Check': {'Day': True, 'Id': True, 'Time': False}, 'Daytime': {'Day': '', 'Minutes': '', 'Month': '', 'Time': '', 'Year': ''}, 'Id': ''}
{'Check': {'Day': True, 'Id': True, 'Time': False}, 'Daytime': {'Day': '', 'Minutes': '', 'Month': '', 'Time': '', 'Year': ''}, 'Id': 'nochitamama'}
この読み込み、書き込みのやり方さえ覚えれば今回の内容は理解できますのでご安心ください。
それではGUIのコードに組み込んでいきましょう。
GUIのコードに組み込む
それではまずGUI側のコードにjsonファイルを読み込み処理を加えます。
def main(): dict1={1:'公開',2:'予約投稿',3:'下書き保存'} f=open('user.json','r') user=json.load(f) f.close() layout=[ [sg.Text('ID',size=(15,1)),sg.InputText(default_text=user['Id'], key='ID'),sg.Checkbox('保存', key='ID_CHECK',default=user['Check']['Id'])], [sg.Text('Password',size=(15,1)),sg.InputText(key='PW')], [sg.Text('ファイル',size=(15,1)),sg.InputText(key='FILE'),sg.FileBrowse()], [sg.Text('公開設定',size=(15,1)),sg.Radio(dict1[1],'RADIO1',default=True,key='1'),sg.Radio(dict1[2],'RADIO1',key='2'),sg.Radio(dict1[3],'RADIO1',key='3')], [sg.Text('日付',size=(15,1)),sg.InputText(size=(5,1),default_text=user['Daytime']['Year'],key='YEAR'),sg.Text('年'),sg.InputText(size=(5,1),default_text=user['Daytime']['Month'],key='MONTH'),sg.Text('月'),sg.InputText(size=(5,1),default_text=user['Daytime']['Day'],key='DAY'),sg.Text('日'),sg.Checkbox('日付を保存する',default=user['Check']['Day'],key='DAY_CHECK')], [sg.Text('時刻',size=(15,1)),sg.InputText(size=(5,1),default_text=user['Daytime']['Time'],key='TIME'),sg.Text('時'),sg.InputText(size=(5,1),default_text=user['Daytime']['Minutes'],key='MINUTES'),sg.Text('分'),sg.Text(size=(8,1)),sg.Checkbox('時刻を保存する',default=user['Check']['Time'],key='TIME_CHECK')], [sg.Submit(button_text='実行する')] ]
3-5行目あたりにjsonファイルの読み込みを入れています。
また、layoutの中にdefault_text
とかdefault
という文字がいくつか見えると思います。
default_text
はGUIを開いたときにデフォルト表示させる文字列です。
Checkboxはdefault
で設定します。
このように書くことで、user.jsonから読み取った情報を各デフォルト値として設定することができます。
では続いて書き込み側です。
def userjson_save(user,userid,year,month,day,time,minutes,checkid,checkday,checktime): if checkid: user['Id']=userid if checkday: user['Daytime']['Year']=year user['Daytime']['Month']=month user['Daytime']['Day']=day if checktime: user['Daytime']['Time']=time user['Daytime']['Minutes']=minutes user['Check']['Id']=checkid user['Check']['Day']=checkday user['Check']['Time']=checktime f=open('user.json','w') json.dump(user,f) f.close()
userの各値に対して引数を割り当てています。
if文がいくつか入っているのは、チェックボックスの状態で上書きするかどうかを変えているからです。
また、最後の3行でuser.jsonに上書きをしています。
これにより、自分が入力した情報がuser.jsonに上書きされ、再度プログラムを起動したときに前回入力した情報がデフォルトで表示されるようになります。
あとはuserjson_saveをwhileの中に組み込めば完成です。
最後に
ユーザ情報の読み込み、書き込み(保存)の組み込みが終わりました。
次回はついにGUIを完成させましょう。
それが終わったらスクリプトを書き直して終わりです。
それでは。