ryotankの備考録日記

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

ワクチン接種その3

3回目もファイザー受けてきた

接種した時間14:22
その場で30分待機

帰宅後、体温測定15:14で 37.0度だった

体温測定17:20だと 36.6度

20時だと36度5分

24時に1回ずつ体温測定を行い、
以降は2週間は朝と夜に体温測定を行う予定

データがある程度たまったらpandsとかで
グラフを描こうとおもう

回路草案入力フォームその14

pickleを使ってオブジェクト(変数や配列)を保存する方法が
あるらしいので

フローチャートを作成して、

pickleを使いオブジェクトを保存する
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

フォームのイメージ図通りに作り込んだ

回路草案作成フォームTab切り替えフォーム1実際の画面キャプチャ
回路草案作成フォームTab切り替えフォーム2実際の画面キャプチャ
回路草案作成フォームTab切り替えフォーム3実際の画面キャプチャ

このように出来たので、
先に、クリアボタンの実装を試す

クリアボタンの実装は以下の通り記述する

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切り替えのイメージ図の作成から

例のごとく画面レイアウト用にイメージ図を作る

基板草案入力フォームイメージ図-フォームの最初(Tab切り替えver)レイアウト用
基板草案入力フォームイメージ図-フォームの2ページ目(Tab切り替えver)レイアウト用
基板草案入力フォームイメージ図-フォームの3ページ(最後)の(Tab実装ver)レイアウト用

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その15

グラフをGUI上で表示したいのでイメージ図を一新することになった

なので、レイアウト用を載せてそれに沿ってGUIを作る

減量管理入力補助GUIイメージ図レイアウト用

実現するにはColumnを設定する

import PySimpleGUI as sg

# Column layout
# カラム1
col1 = [
#運動回数入力欄
]

 # カラム2
    col_2 = [
        #グラフ領域
]
    layout = [
	#下部カラム
]

というように配置する

次回は、上記のようにコードを書いてみる

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

実際の画面はこんな風になった

f:id:ryotank:20220417090825p:plain
ver1.0_ドロップ率とスタミナ消費項目追加キャプチャ
f:id:ryotank:20220417090852p:plain
アークナイツ素材集めGUI_ver1.0素子結晶選択時ドロップ率追加
f:id:ryotank:20220417090920p:plain
アークナイツ素材集めGUI_ver1.0半自然溶剤選択時スタミナ消費追加

次回は、sg.Imageを使って素材の画像を表示するver2.0の作成を
する為sg.Imageの勉強から