こんにちは、のちたままです。
今回は自動投稿プログラム作成の第3回です。
第1回、第2回でスクリプトとGUIを作成したので、今回はそれらを結合していきます。
ただ、結合編は長くなりそうなので複数回に分けます。
気長にお待ちください。
第1回、第2回をまだご覧になっていない方は先にそちらをご覧ください。
今回の内容
今回はGUI側の修正になります。
GUIで入力した値をどうやってスクリプト側に渡すの?ということを説明していきます。
とはいってもPySimpleGUIの使い方になってしまいそうです。
GUIのコードを完成させるわけではないのでご注意ください。
プログラムの構成について
今回作成しているプログラムは以下のような構成になっています。
今更な感じはありますが、紹介しておこうと思います。
GUI,main,user.jsonは別のファイルです。(gui.py,main.pyみたいなものです。)

まず初めに、ユーザがソフトを起動するとGUIがuser.jsonから情報を読み取った状態で現れます。
ユーザが必要な情報を入力し実行ボタンを押すと、mainが動きます。
それに合わせて、user.jsonの上書き保存が実行されます。
第2回で保存と書かれたチェックボックスがあったかと思いますが、あれがuser.jsonに保存される内容になります。
user.jsonの読み取り、保存に関しては別記事で紹介します。
ということでGUIで入力された値をmainに渡すには、PySimpleGUIでどうやって書けばよいのかという内容を説明します。
GUIで入力した値を渡す方法
話を戻します。
GUIから値を渡す方法を知るためには、入力された値がどのように扱われているかを知る必要があります。
前回のプログラムの中に、valueという変数があったのを覚えていますか?
while文の中に入っているやつです。
nochitamama.hatenablog.com
まずはそのvalueをprintで出力してみましょう。
すると以下のような出力が得られました。
{0: '', 1: True, 2: '', 3: '', 'Browse': '', 4: True, 5: False, 6: False, 7: '', 8: '', 9: '', 10: True, 11: '', 12: '', 13: True}
これが何を意味するかというと、valueは辞書型であるということです。
4: True, 5: False, 6: Falseの部分に注目してほしいのですが、これは公開設定の情報であることがわかります。
ラジオボタンで選択するやつです。
ほかにもTrueと入っている箇所はチェックボックスかなということが予想できます。
さて、valueについてわかったところで、どうやって値を渡していくかという話です。
察しの良い方は気づいてしまうと思いますが、結論から言うとkeyを渡せばよいのです。
valueは辞書型なのでkeyと値が入っています。
今はkeyが0~13の数字になっていますが、このkeyを自分がわかりやすいものに書き換えてしまえばよいのです。
例えば、以下のような感じです。
{'ID': '', 'ID_CHECK': True, 'PW': '', 'FILE': '', 'Browse': '', '1': True, '2': False, '3': False, 'YEAR': '', 'MONTH': '', 'DAY': '', 'DAY_CHECK': True, 'TIME': '', 'MINUTES': '', 'TIME_CHECK': True}
keyをこのように修正できればあとはvalue[各key]で渡すだけです。
それではGUIのコードを修正していきましょう。
GUIを修正する
valueのことを理解できれば修正に関しては簡単です。
入力されるアイテムのところにkeyを設定するだけです。
以下に変更前、変更後のコードを載せておきます。
違いを見ながらkeyの設定方法を見てください。
・変更前
layout=[
[sg.Text('ID',size=(15,1)),sg.InputText(''),sg.Checkbox('保存',default=True)],
[sg.Text('Password',size=(15,1)),sg.InputText('')],
[sg.Text('ファイル',size=(15,1)),sg.InputText(''),sg.FileBrowse()],
[sg.Text('公開設定',size=(15,1)),sg.Radio('公開','RADIO1',default=True),sg.Radio('予約投稿','RADIO1'),sg.Radio('下書き保存','RADIO1')],
[sg.Text('日付',size=(15,1)),sg.InputText('',size=(5,1)),sg.Text('年'),sg.InputText('',size=(5,1)),sg.Text('月'),sg.InputText('',size=(5,1)),sg.Text('日'),sg.Checkbox('日付を保存する',default=True)],
[sg.Text('時刻',size=(15,1)),sg.InputText('',size=(5,1)),sg.Text('時'),sg.InputText('',size=(5,1)),sg.Text('分'),sg.Text('',size=(8,1)),sg.Checkbox('時刻を保存する',default=True)],
[sg.Submit(button_text='実行する')]
]
・変更後
layout=[
[sg.Text('ID',size=(15,1)),sg.InputText(key='ID'),sg.Checkbox('保存',default=True,key='ID_CHECK')],
[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),key='YEAR'),sg.Text('年'),sg.InputText(size=(5,1),key='MONTH'),sg.Text('月'),sg.InputText(size=(5,1),key='DAY'),sg.Text('日'),sg.Checkbox('日付を保存する',default=True,key='DAY_CHECK')],
[sg.Text('時刻',size=(15,1)),sg.InputText(size=(5,1),key='TIME'),sg.Text('時'),sg.InputText(size=(5,1),key='MINUTES'),sg.Text('分'),sg.Text(size=(8,1)),sg.Checkbox('時刻を保存する',default=True,key='TIME_CHECK')],
[sg.Submit(button_text='実行する')]
]
このように書けばvalue['ID']でIDを取り出すことができるようになります。
これらをスクリプト側に渡せば解決です。
スクリプト側も関数化して、引数にvalue[各key]を渡せばmain側で使えるようになります。
例えば、main側でID,PWの情報が必要なら
main(value['ID'],value['PW'])
みたいにすればmain側に渡すことができます。
最後に
完成に少しずつ近づいてきています。
残りは、GUIの修正、スクリプトの関数化、user.jsonの作成ですね。
それでは。