素材集めGUIその5
dictの書き方について勉強して直した上で
ver1.0のコードを書き直して動作するかを確かめる
そもそもdictは辞書型」(dictionary)は、「リスト」や「タプル」と同じように
複数の値を要素として管理するデータ構造の一つ。
辞書の書式は、以下のように{}の中に、「キー(Key):値(Value)」を組合せた要素を
もつ構造をとります。要素(値)へのアクセスは、
キーを使って参照するので一つの辞書の中に
同じキーを重複して持たせることはできません。
よって、リストやタプルのように要素の位置を意識することはない
キー(Key)」は後から変更できない性質上、
イミュータブルな型をもつデータを採ります。
「文字列」や「数値」「タプル」などのデータがキーになり得ます。
解説サイトに乗っていた例だと
dict1 = {'a':1, 'b':2, 'c':3} # キーに文字列を指定
のように書く
エラーを起こした今までのコードだと
""""素材名を受け取り、ステージ名を返す""" stage_dict ={'合成コール'}, {'マンガン'}, {'碇石(ていせき)'}, {'RMA70-12'}, {'人工ゲル'}, {'素子結晶'}, {'合金'}, {'中級源岩':['4-6']}, {'半自然溶剤':['9-18']}
になっている
例と比べると確かにおかしい表記になっている・・・
改めて例に習い書き直すと
stage_dict = {'合成コール':['4-6'], 'マンガン':['4-6'], '碇石(ていせき)':['4-6'], 'RMA70-12':['4-6'], '人工ゲル':['4-6'], '素子結晶':['4-6'], '合金':['4-6'], '中級源岩':['4-6'], '半自然溶剤':['9-18']}
辞書からデータを取得する際は、辞書が入った変数の後ろに
[]カッコで囲んだキーを入れることで取得できます。
確認のために
辞書からデータを取得するコードを書いてみる
stage_dict = { '合成コール':['4-4'], 'マンガン':['4-7'], '碇石(ていせき)':['4-8'], 'RMA70-12':['4-9'], '人工ゲル':['S5-7'], '素子結晶':['S5-9'], '合金':['6-12'], '中級源岩':['4-6'], '半自然溶剤':['9-18'] } sozai= stage_dict['RMA70-12'] print('欲しい素材は{}で入手可能です。'.format(sozai))
上記のようにdictを書き直してver1.0に組み込んだコードが
以下の通り
#2022-4-12作成 #ファイル名:素材集め表示GUI_ver1.0 #動作確認日:2022-4-13 import PySimpleGUI as sg sg.theme('LightGreen4') def get_stagename(sozai_name): """"素材名を受け取り、ステージ名を返す""" stage_dict ={'合成コール':['4-4'], 'マンガン':['4-7'], '碇石(ていせき)':['4-8'], 'RMA70-12':['4-9'], '人工ゲル':['S5-7'], '素子結晶':['S5-9'], '合金':['6-12'], '中級源岩':['4-6'], '半自然溶剤':['9-18']} return stage_dict[sozai_name] layout = [ [sg.Text('素材名')], [sg.Combo(values=['合成コール','マンガン', '碇石(ていせき)', 'RMA70-12', '人工ゲル', '素子結晶', '合金', '中級源岩', '半自然溶剤'], default_value="選択してください。",size=(20, 1), key='SOZAI', enable_events=True)], [sg.Text('ステージ名')], [sg.Combo(values=[''], size=(20, 1), key='STAGENAME')], [sg.T('')], [sg.Button('Exit')] ] window = sg.Window('素材集め表示GUI_ver1.0', size=(300, 300)).Layout(layout) while True: event, values = window.read() if event is None or event == 'Exit': break if event == 'SOZAI': sozai = values['SOZAI'] stagename = get_stagename(sozai) window.FindElement('STAGENAME').update(values=stagename) window.close()
次回はステージ名が表示出来たので、ドロップ率、スタミナ消費を載せてみる
出来たら、素材の画面を表示出来るようにと段階を踏んでいく
素材集めGUIその4
各素材にステージ名を組み込んで動作するかを検証
試しに走らせると次のようなエラーが発生
どうやら"リストに[]する時は文字列は使えないので、
数字かスライス[3:8]もような表記をつけよう"というエラー内容みたい
その時のコードが
#ファイル名:素材集め表示GUI_ver1.0 #動作確認日: import PySimpleGUI as sg sg.theme('LightGreen4') def get_stagename(sozai_name): """"素材名を受け取り、ステージ名を返す""" stage_dict ={'合成コール'}, {'マンガン'}, {'碇石(ていせき)'}, {'RMA70-12'}, {'人工ゲル'}, {'素子結晶'}, {'合金'}, {'中級源岩':['4-6']}, {'半自然溶剤':['9-18']} return stage_dict[sozai_name] layout = [ [sg.Text('素材名')], [sg.Combo(values=['合成コール','マンガン', '碇石(ていせき)', 'RMA70-12', '人工ゲル', '素子結晶', '合金', '中級源岩', '半自然溶剤'], default_value="選択してください。",size=(20, 1), key='SOZAI', enable_events=True)], [sg.Text('ステージ名')], [sg.Combo(values=[''], size=(20, 1), key='STAGENAME')], [sg.T('')], [sg.Button('Exit')] ] window = sg.Window('素材集め表示GUI_ver1.0', size=(300, 300)).Layout(layout) while True: event, values = window.read() if event is None or event == 'Exit': break if event == 'SOZAI': sozai = values['SOZAI'] stagename = get_stagename(sozai) window.FindElement('STAGENAME').update(values=stagename) window.close()
どうやらstage_dictの書き方がまずいかも・・と疑い始めた
次回は、そのdictの書き方について勉強して直した上で
ver1.0のコードを書き直して動作するかを確かめる
減量管理入力補助GUIその14
画像を読み込めるようにsg.Imageを使って再現するので
早速コードを書いてみた
""" 実施せずというチェックボタンを付ける チェックボタンをチェックしたらそれぞれ該当する項目に「実施せず」と記入する アプリが完成したら専用アイコンを作り載せる事 複窓実装2021年8月11日 Tab表示での画像表示2021年8月11日 """ import PySimpleGUI as sg import openpyxl #Excelを操作する為のライブラリ def RG_window(): #実装したい処理を書く pass #Tab(タイトル、レイアウト) tabとtabgroupを設定するには、tabを生成してからtabGroupに設定する t4 = sg.Tab('やり方', [ [sg.Text('1.腰に両手をついて両足で立つ', font=20)], [sg.Text('2.足をゆっくり大きく前に踏み出す', font=20)], [sg.Text('3.太ももが水平になるくらいに腰を深く下げる', font=20)], [sg.Text('4.体を上げて踏み出した足をもとに戻す', font=20)] ]) t5 = sg.Tab('効果', [ [sg.Text('バランス能力や筋力をつく', font=20)], [sg.Text('1日の目安として5~10回を2から3セット',font=16)] ]) t6 = sg.Tab('参考体勢', [ [sg.Image(filename='C:/Users/ryotank-GGH/Desktop/Pythonプログラム関連/減量管理GUI/ランジ.png')]]) #TabGroupにtabを設定する sub2_layout = [ [sg.TabGroup([[t4, t5, t6]]) ]] #ランジウィンドウオブジェクトの生成 sub2_window = sg.Window("ランジのやり方について", layout = sub2_layout, size=(570,480)) while True: sub2_events, sub2_value = sub2_window.read() #ここでサブ2ウィンドウが入力待ち状態になる if sub2_events is None: break sub2_window.close() #ランジのやり方についてのウィンドウを閉じる def PK_window(): pass sg.theme('DarkTeal4') #プランクウィンドウのテーマ #Tab(タイトル、レイアウト) tabとtabgroupを設定するには、tabを生成してからtabGroupに設定する t1 = sg.Tab('やり方', [ [sg.Text('1.うつ伏せの状態で両肘と足のつま先をつける', font=20)], [sg.Text('2.足からつま先まで真っ直ぐにし、曲がらない様に注意', font=20)], [sg.Text('3.', font=20)] ] ) t2 = sg.Tab('効果', [ [sg.Text('腹直筋だけでなく、クビレ部分の筋肉や背中、腕の筋肉も鍛えられる', font=20)] ]) t3 = sg.Tab('参考体勢', [ [sg.Image(filename='C:/Users/ryotank-GGH/Desktop/Pythonプログラム関連/減量管理GUI/plank1.png')]]) #TabGroupにtabを設定する sub3_layout = [ [sg.TabGroup([[t1, t2, t3]])] ] #プランクウィンドウオブジェクトの生成 sub3_window = sg.Window("プランクのやり方について", layout = sub3_layout, size=(570,400)) while True: sub3_event, sub3_value= sub3_window.read() #ここでサブ3ウィンドウが入力待ち状態になる if sub3_event is None: break sub3_window.close() #プランクのやり方についてのウィンドウを閉じる def WS_window(): pass sg.theme('Python') #ワイドスクワットウィンドウのテーマ #Tab(タイトル、レイアウト) tabとtabgroupを設定するには、tabを生成してからtabGroupに設定する t4 = sg.Tab('やり方', [ [sg.Text('1.足を肩幅より広めに広げる', font=20)], [sg.Text('2.つま先を45度外側に向けて立つ', font=20)], [sg.Text('3.息を吸いながら、太ももが床と平行になるまで上体を下げる', font=20)] ] ) t5 = sg.Tab('効果', [ [sg.Text('基礎代謝が上がり痩せやすく太りにくい体質に', font=20)], [sg.Text('安定感をキープするのが難しいため、バランス感覚が養える')] ]) t6 = sg.Tab('参考体勢', [ [sg.Image(filename='C:/Users/ryotank-GGH/Desktop/Pythonプログラム関連/減量管理GUI/スクワット説明.png')]]) #TabGroupにtabを設定する sub4_layout = [ [sg.TabGroup([[t4, t5, t6]]) ]] #ワイドスクワットウィンドウオブジェクトの生成 sub4_window = sg.Window("ワイドスクワットのやり方について", layout = sub4_layout, size=(570,400)) while True: sub4_events, sub4_value= sub4_window.read() #ここでサブ4ウィンドウが入力待ち状態になる if sub4_events is None: break sub4_window.close() #ワイドスクワットのやり方についてのウィンドウを閉じる def SS_window(): pass sg.theme('Reds') #スワイショウウィンドウのテーマ #Tab(タイトル、レイアウト) tabとtabgroupを設定するには、tabを生成してからtabGroupに設定する t7 = sg.Tab('やり方', [ [sg.Text('1.両足を肩幅くらいに開き、膝を軽く曲げて立つ', font=20)], [sg.Text('2.腰を中心に手を振っていく', font=20)], [sg.Text('3.腰を軸にして肩や腕の力を抜き、ひねりに合わせ左右に自然に振る', font=20)] ] ) t8 = sg.Tab('効果', [ [sg.Text('誰でもできる運動で疲れた時に便利', font=20)] ]) t9 = sg.Tab('参考体勢', [ [sg.Image(filename='C:/Users/ryotank-GGH/Desktop/Pythonプログラム関連/減量管理GUI/スワイショウ.png')]]) #TabGroupにtabを設定する sub5_layout = [ [sg.TabGroup([[t7, t8, t9]]) ]] #スワイショウウィンドウオブジェクトの生成 sub5_window = sg.Window("スワイショウのやり方について", layout = sub5_layout, size=(570,400)) while True: sub5_events, sub5_value = sub5_window.read() #ここでサブ5ウィンドウが入力待ち状態になる if sub5_events is None: break sub5_window.close() #スワイショウのやり方についてのウィンドウを閉じる def NE_window(): pass sg.theme('Tan') #ニートゥエルボーウィンドウのテーマ #Tab(タイトル、レイアウト) tabとtabgroupを設定するには、tabを生成してからtabGroupに設定する t10 = sg.Tab('やり方', [ [sg.Text('1.うつ伏せの状態で両肘と足のつま先をつける', font=20)], [sg.Text('2.足からつま先まで真っ直ぐにし、曲がらない様に注意', font=20)], [sg.Text('3.', font=20)] ] ) t11 = sg.Tab('効果', [ [sg.Text('腹直筋だけでなく、クビレ部分の筋肉や背中、腕の筋肉も鍛えられる', font=20)] ]) t12 = sg.Tab('参考体勢',[ [sg.Image(filename='C:/Users/ryotank-GGH/Desktop/Pythonプログラム関連/減量管理GUI/ニートゥエルボー説明.png')]]) #TabGroupにtabを設定する sub6_layout = [ [sg.TabGroup([[t10, t11, t12]]) ]] #ニートゥエルボーウィンドウオブジェクトの生成 sub6_window = sg.Window("ニートゥエルボーのやり方について", layout = sub6_layout, size=(570,530)) while True: sub6_events, sub6_value = sub6_window.read() #ここでサブ6ウィンドウが入力待ち状態になる if sub6_events is None: break sub6_window.close() #スワイショウのやり方についてのウィンドウを閉じる main_layout = [ [sg.Text('日付を選択して下さい', font=20)], [sg.Input(key= '-INPUT-'), sg.CalendarButton('カレンダー入力', font=16, target='-INPUT-')], # カレンダーの返り値を収納する先をtarget引数で指定 [sg.Text('ワイドスクワット', font=16)], [sg.InputText(default_text='運動した回数を入力して下さい', size=(30,5),key='-WS_INPUT-'), sg.Checkbox('実施せず', font=20, default=False)], [sg.Text('ニートゥエルボー', font=16)], [sg.InputText(default_text='運動した回数を入力して下さい', size=(30,5),key='-NE_INPUT-')], [sg.Text('ランジ', font=16)], [sg.InputText(default_text='運動した回数を入力して下さい', size=(30,5),key='-RG_INPUT-')], [sg.Text('プランク', font=16)], [sg.InputText(default_text='運動した時間(分)を入力してね', size=(30,5),key='-PK_INPUT-')], [sg.Text('スワイショウ', font=16)], [sg.InputText(default_text='運動した回数を入力して下さい', size=(30,5),key='-SS_INPUT-')], [sg.Button('登録', font=25, key='-SAVE-')], [sg.Button('入力した回数をクリア', font=15, key='-CLEAR-')], [sg.Button('トレーニング方法を確認する', font=25, size=(24,4), button_color='teal', key='-TR_WICH-')] ] main_window = sg.Window('減量管理入力補助', layout=main_layout, size=(650,500)) while True: main_event, main_value = main_window.read() #ここでメインウィンドウが入力待ち状態になる if main_event is None: break elif main_event == '-TR_WICH-': #トレーニング方法を確認するが押されたら #サブ画面を開く時に毎回layoutを宣言する #エラーが発生せず、何度でもポップアップを開閉できる! sg.theme('BluePurple') sub_layout = [ [sg.T(' '*22), sg.Button('ランジについて', font=25, key='-HOWTO_RG-')], [sg.Button('プランクについて', font=25, key='-HOWTO_PK-')], [sg.Button('ワイドスクワットについて', font=25, key='-HOWTO_WS-')], [sg.Button('スワイショウについて',font=25, key='-HOWTO_SS-')], [sg.Button('ニートゥエルボーについて',font=25, key='-HOWTO_NE-')] ] sub_window = sg.Window("トレーニング方法", layout=sub_layout, size=(400,450)) while True: sub_event, sub_value = sub_window.read() if sub_event is None: break #keyの文字列を判定しイベント処理を分岐させる elif sub_event == '-HOWTO_RG-': #ランジについてのウィンドウを開くコマンド RG_window() elif sub_event == '-HOWTO_PK-': #プランクについてのウィンドウを開くコマンド PK_window() elif sub_event == '-HOWTO_WS-': #ワイドスクワットについてのウィンドウを開くコマンド WS_window() elif sub_event == '-HOWTO_SS-': #スワイショウについてのウィンドウを開くコマンド SS_window() elif sub_event == '-HOWTO_NE-': #ニートゥエルボーについてのウィンドウを開くコマンド NE_window() sub_window.close() #トレーニング方法のウィンドウを閉じる main_window.close() #メインウインドウを閉じる
こんな感じになったが、画像を読み込んでくれない・・
しばらくは検証しないと・・・
読み込みが完成すれば
片足立ちを1分間行う方法と画像を運動の項目に追加する
素材集めGUIその3
今回はag.Comboの項目を選んだら
マップ名を表示するようにしたい
例えば、中級源岩を選べば4-6と
半自然溶剤を選べば9-18を表示するように
[sg.Combo(values=['中級源岩', '半自然溶剤'], size=(20,1), key='SOZAI', enable_events=True)]
enable_events=Trueとする事で、項目を変えた時にイベントとして取得できるように
変化する
if event == 'SOZAI': sozai = values['SOZAI'] mapname = get_mapname(sozai) window.FindElment('MAPNAME').update(values=mapname)
上のようにコンボボックスが選択されていると、
event == 'SOZAI'でメソッドを使用出来る
これをver1.0のコードに組み込んで動作確認をする
def get_mapname(sozai_name): """"素材名を受け取り、ステージ名を返す""" map_dict ={'中級源岩':['4-6'], '半自然溶剤':['9-18']} return map_dict[sozai_name] layout = [[sg.Text('素材名')], [sg.Combo(values=['中級源岩', '半自然溶剤'], size=(20, 1), key='SOZAI', enable_events=True)], [sg.Text('ステージ名')], [sg.Combo(values=[''], size=(20, 1), key='MAPNAME')], [sg.Button('Exit')]] window = sg.Window('コンボボックステスト_素材変化', size=(300, 300)).Layout(layout) while True: event, values = window.read() if event is None or event == 'Exit': break if event == 'SOZAI': sozai = values['SOZAI'] mapname = get_mapname(sozai) window.FindElment('MAPNAME').update(values=mapname) window.close()
次回は、各素材にマップ名を組み込んで動作するかを検証する
アリンコス部品管理その28
「try-except」構文を取り入れたデータベースの実装コードを作成していく
try: #例外の発生する可能性のある処理 #item_alincos(内訳)テーブルの定義 query = '''CREATE TABLE item_alincos ( quantity_possessed INTEGER PRIMARY KEY, consumed_quantity INTEGER NOT NULL, date_consumed DATE NOT NULL ); ''' #既にデータベースが登録されている場合は、sqlの発行でエラーが出るのでexceptブロックで回避する except: #例外発生時に行う処理 #SQL発行 cur.execute(query) pass
という形になる?
これを検証していく