ryotankの備考録日記

趣味の電子工作についての備考録などなど

素材集め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

という形になる?

これを検証していく

素材集めGUIその2

GUIのイメージ図と

f:id:ryotank:20220412124651p:plain
アークナイツ素材集め表示GUIイメージ図レイアウト用

キャプチャ画像

f:id:ryotank:20220412124714p:plain
アークナイツ素材集めGUI_ver1.0キャプチャ

次回は現時点でのver1.0のソースコードと解説を載せる

素材集めGUIその1

アークナイツというスマホゲーの素材集めをする時に

ネットで調べて・・・ステージを吟味して・・
という一連の動作が面倒くさいので、

PySimpleGUIを使って簡易的に調べたいと思い作成する事にした。


また、ゲーム内のスタミナ計算も○時間後に全回復、
半分値まで回復などの機能も追加で付ける

次回は、GUIのイメージ図と開発当初の画面を掲載する予定