回路草案入力フォームその14
pickleを使ってオブジェクト(変数や配列)を保存する方法が
あるらしいので
フローチャートを作成して、
オブジェクトを保存する例
import pickle draft_circuit = ['入力項目1', '入力項目2', '入力項目3', 202204023, {'入力項目A':'入力項目GD'}] with open('SOUAN.binaryfile', 'wb')as bif: pickle.dump(draft_citcuit, bif)
オブジェクトを読み出す例
import pickle with open('SOUAN.binaryfile', 'rb')as bif: draft_citcuit = pickle.load(bif) print draft_citcuit
と書ける。次回は、上記の動作確認を行う
回路草案入力フォームその13
フォームのイメージ図通りに作り込んだ
このように出来たので、
先に、クリアボタンの実装を試す
クリアボタンの実装は以下の通り記述する
elif event == '-CLEAR-': #フォーム1のクリアボタンが押されたら window['cad_name'].update("") #回路cad名をカラにする window['purpose'].update("") #作成目的をカラにする
フォームの全体コードは以下のようになる
#回路草案作成フォームGUI動作確認 #2022-4-22作成 #Tabの切り替えで作成フォームを切り替える from PySimpleGUI import TITLE_LOCATION_TOP, InputText import PySimpleGUI as sg sg.theme('DarkBlue5') #分類分けフレーム L1 =[ [sg.Radio('モジュール基板', group_id='g1', font=('小塚ゴシック', 15))], [sg.Radio('試作基板', group_id='g1', font=('小塚ゴシック', 15))], [sg.Radio('ホビー用基板', group_id='g1', default=True, font=('小塚ゴシック', 15))], [sg.Radio('実験基板', group_id='g1', font=('小塚ゴシック', 15))], [sg.Radio('書き込みアダプター', group_id='g1', font=('小塚ゴシック', 15))] ] tab1_layout = [ [sg.T('')], [sg.Text('各項目を入力して下さい')], [sg.Text('回路CADの名前'), sg.Input(size=(20,1), key='cad_name'), sg.Text('CADのverも忘れずに記入しよう', text_color='red')], [sg.Text('作成目的'), sg.Input(size=(20,1), key='purpose')], [sg.Frame('分類分け', L1, title_color='Green', font=('小塚ゴシック', 20), title_location=TITLE_LOCATION_TOP, pad=((150,0),(15,35)), border_width=4)], #3行目 [sg.Button('一時保存', key='-SAVE-'), sg.T(' '*30), sg.Button('クリア', key='-CLEAR-')] ] tab2_layout = [ [sg.T('')], [sg.Text('基板名'), sg.Input(size=(30,1), key='Board_name'), sg.Text('通称でも可')], [sg.Text('基板英名'), sg.Input(size=(49,1), key='Board_eng_name'), sg.Text('英名は回路CADで英字必須の為', text_color='red')], [sg.Text('電源供給方法'), sg.Multiline(size=(40,3), key='Power_supply_method')], [sg.Text('電源電圧'), sg.Input(size=(10,1), key='Power-supply_voltage'), sg.Text('[V]')], [sg.Text('基板概要'), sg.Input(size=(20,1), key='Board_outline')], [sg.Text('基板の大きさ'), sg.Text('横'), sg.Input(size=(10,1), key='Horizontal_size'), sg.Text('mm'), sg.Text('縦'), sg.Input(size=(10,1), key='Vertical_size'), sg.Text('mm')], [sg.Text('部品候補名A'), sg.Input(size=(15,1), key='Part_candidate_name_A')], [sg.Text('部品候補名B'), sg.Input(size=(15,1), key='Part_candidate_name_B')], [sg.Text('部品候補名C'), sg.Input(size=(15,1), key='Part_candidate_name_C')], [sg.Text('部品候補名D'), sg.Input(size=(15,1), key='Part_candidate_name_D')], [sg.Text('部品候補名E'), sg.Input(size=(15,1), key='Part_candidate_name_E')], [sg.Text('部品候補名F'), sg.Input(size=(15,1), key='Part_candidate_name_F')], [sg.Text('部品候補名G'), sg.Input(size=(15,1), key='Part_candidate_name_G')], [sg.T('')], [sg.Button('一時保存', key='-SAVE2-'), sg.T(' '*30), sg.Button('クリア', key='-CLEAR2-')] ] tab3_layout = [ [sg.T(' ')], [sg.Text('大まかな予算金額'), sg.Input(size=(10,1), key='Rough_budget_amount'), sg.Text('円(税別)')], [sg.Radio('pdf形式で残す',group_id='g2', font=('小塚ゴシック', 15)), sg.Radio('txt形式で残す', group_id='g2', font=('小塚ゴシック', 15))], [sg.Text('作成年月日(西暦で入力してね)')], [sg.Input(size=(15,1), key='Date_of_creation')], [sg.Button('一時保存', key='-SAVE3-'), sg.T(' '*30), sg.Button('クリア', key='-CLEAR3-'), sg.Button('出力する', key='-OUTPUT-')] ] layout =[ [sg.TabGroup([[sg.Tab('作成フォーム1', tab1_layout), sg.Tab('作成フォーム2', tab2_layout), sg.Tab('作成フォーム3', tab3_layout)]])] ] window = sg.Window('回路草案作成フォーム', layout, default_element_size=(20,1), size=(700,550)) while True: event, values = window.read() if event in None: break elif event == '-CLEAR-': #フォーム1のクリアボタンが押されたら window['cad_name'].update("") #回路cad名をカラにする window['purpose'].update("") #作成目的をカラにする elif event == '-CLEAR2-': #2のクリアボタンが押されたら window['Board_name'].update("") #基板名をカラにする window['Board__eng_name'].update("") #基板英名をカラにする window['Power_supply_method'].update("") #電源供給方法をカラにする window['Power-supply_voltage'].update("") #電源電圧をカラにする window['Board_outline'].update("") #基板概要をカラにする window['Horizontal_size'].update("") #横の大きさをカラにする window['Vertical_size'].update("") #縦の大きさをカラにする window['Part_candidate_name_A'].update("") #部品候補名Aをカラにする window['Part_candidate_name_B'].update("") #部品候補名Bをカラにする window['Part_candidate_name_C'].update("") #部品候補名Cをカラにする window['Part_candidate_name_D'].update("") #部品候補名Dをカラにする window['Part_candidate_name_E'].update("") #部品候補名Eをカラにする window['Part_candidate_name_F'].update("") #部品候補名Fをカラにする window['Part_candidate_name_G'].update("") #部品候補名Gをカラにする elif event == '-CLEAR3-': #3のクリアボタンが押されたら window['Rough_budget_amount'].update("") #大まかな予算金額をカラにする window['Date_of_creation'].update("") #作成年月日をカラにする window.close()
次回は、joblibの使い方について勉強する
回路草案入力フォームその12
フォーム全体に組み込んでもフォーム移動の機能は
どうも動作しないので
Tabの切り替えでフォームの切り替えを実装する
まずは、Tab切り替えのイメージ図の作成から
例のごとく画面レイアウト用にイメージ図を作る
sg.Tabの例としては以下のようになる
import PySimpleGUI as sg sg.theme('DarkBlue1') tab1_layout = [ [sg.Text(' タブ1 ')], [sg.Input(key='input1')], [sg.Button('Read1')] ] tab2_layout = [ [sg.Text(' タブ2 ')], [sg.Input(key='input2')], [sg.Button('Read2')] ] layout = [ [sg.TabGroup([[sg.Tab('タイトル タブ1', tab1_layout), sg.Tab('タイトル タブ2', tab2_layout)]])], [sg.Quit()] ] window = sg.Window('タブ デモ ', layout, default_element_size=(12, 1)) while True: event, values = window.read() # × もしくは Quitで終了 if event in (None, 'Quit'): break # Readボタンを押すとinputのテキストが表示 elif event == 'Read1': print(values['input1']) # Readボタンを押すとinputのテキストが表示 elif event == 'Read2': print(values['input2'])
次回はレイアウト用の通りに作成フォームを作り込む
無事に出来れば、一時保存ボタンの実装を試す
工具管理GUIその11
すでにデータベースが存在する場合にエラーが発生するのを
回避するためtyr-exept構文を組み込む
try: 処理文 #tool_dataテーブルの定義 #sqlの発行 #dataテーブルへリファレンスデータの登録を行う except: 処理文 pass #例外が発生しても何も行わない
次回は上記をコード化していく
素材集めGUIその6
ドロップ率、スタミナ消費を載せてみる
出来たら、素材の画面を表示出来るようにと段階を踏んでいく
全てを載せるとダラダラ長いのでブロックに分けて紹介する
まずはドロップ率から
def get_drop(sozai_name): """選択された素材名を受け取り、ドロップ率を返す""" drop_dict = { '合成コール':['37.1'], 'マンガン':['36.8'], '碇石(ていせき)':['34.8'], '中級異鉄':['31.5'], 'RMA70-12':['30.0'], '中級アケトン':['36.5'], '人工ゲル':['25.6'], '中級装置':['31.4'], '素子結晶':['49.8'], '合金':['33.7'], '中級源岩':['44.7'], '半自然溶剤':['??'], '切削液':['??'], '中級エステル':['48.9'], '中級糖原':['39.4'], } return drop_dict[sozai_name] #中略 layout = [ [sg.T(' '*25), sg.Text('素材名')], [sg.T(' '*25), sg.Combo(values=['合成コール','マンガン', '碇石(ていせき)', 'RMA70-12', '人工ゲル', '素子結晶', '合金', '中級源岩', '半自然溶剤'], default_value="選択してください。",size=(20, 1), key='SOZAI', enable_events=True)], [sg.Text('ステージ名'), sg.T(' '*25), sg.Text('ドロップ率(%)'), sg.T(' '*15), sg.Text('スタミナ消費')], [sg.Combo(values=[''], size=(10, 1), key='STAGENAME'), sg.T(' '*25), sg.Combo(values=[''], size=(10, 1), key='DROP'), sg.T(' '*15), sg.Combo(values=[''], size=(10, 1), key='RISEI')], #中略 if event == 'SOZAI': sozai = values['SOZAI'] drop = get_drop(sozai) window.FindElement('DROP').update(values=drop)
スタミナ消費をこんな感じに
アークナイツのスタミナは"理性"と呼んでいるので
riseiという変数を作った
def get_risei(sozai_name): """選択された素材名を受け取り、消費理性値(-表記)を返す""" risei_dict = { '合成コール':['-'], 'マンガン':['-'], '碇石(ていせき)':['-8'], '中級異鉄':[''], 'RMA70-12':['-'], '中級アケトン':['-'], '人工ゲル':['-'], '中級装置':[''], '素子結晶':['-'], '合金':['-'], '中級源岩':['-'], '半自然溶剤':['-15'], '切削液':['-'], '中級エステル':[''], '中級糖源':[''], } return risei_dict[sozai_name] #中略 if event == 'SOZAI': sozai = values['SOZAI'] risei = get_risei(sozai) window.FindElement('GAZOU').update(values=risei)
実際の画面はこんな風になった
次回は、sg.Imageを使って素材の画像を表示するver2.0の作成を
する為sg.Imageの勉強から