Python+PySimpleGUI コンボボックスの日付入力

目次

今回の全コード

import PySimpleGUI as SG
import datetime as DT
import calendar
本日=DT.date.today()

# カスタム関数作成
def Age(生年,月):
    Age=本日.year-int(生年)
    if 本日.month<int(月):
        Age=Age-1   
    return Age

L0=[[SG.Text("PySimpleGUI 演習問題 - 日付とフレーム",font=18)],
    [SG.Text("本日は") ,SG.Text(本日.strftime('西暦 %Y年%m月%d日 です'))],]     # Frame 使用時は段落と枠括弧の二重くくりになる
L1 =[
     # テキスト中央寄せは justification="center"
    [SG.Text("生年月日:"),SG.Input(key="-Y-",size=(8,1),justification="center",enable_events=True),
     SG.Text("年"),SG.Input(key="-M-",size=6,justification="center"),
     SG.Text("月") ,SG.Input(key="-D-",size=6,justification="center"),SG.Text("日")] ,
     [SG.Text("年齢:"),SG.Text(key="-YMD-",font="Arial",size=4,justification="c"),SG.Text("歳")]
    
]
L2=[
    [SG.Text("生年月日:"),
     SG.Combo(key="-CY-",values=list(range(1900,本日.year-1)),size=(8,16),
              default_value=2000,enable_events=True),SG.Text("年"),
     SG.Combo(key="-CM-",values=list(range(1,13)),size=(4,13),enable_events=True),SG.Text("月"),
     SG.Combo(key="-CD-",values=list(range(1,32)),size=(4,16),enable_events=True),SG.Text("日"),
     ]
     
]
L3=[
    [SG.Button("実行",key="実行"),SG.Cancel()]]
    
    
# Frame 使用時は各部の全エレメントをレイアウト変数に代入し、大枠のレイアウト変数に順次カンマつなぎで代入
# 枠線をなくすにはborderオプションが必要
L=[
    [SG.Frame("",L0,border_width=0)],
    [SG.Frame("生年月日を選択",L2)],[SG.Frame("テキスト入力も可",L1)],
    [SG.Frame("",L3,border_width=0)]
    
   ]
#モーダルウィンドウで開き、秒単位で自動クローズ
#window= SG.Window("Python GUI",L1,modal=True,auto_close=True, auto_close_duration=5) 
   
window=SG.Window("PySimpleGUI 演習",L,modal=True)

while True:
    event,values= window.read() 
    print(event,values)
    if event=="Cancel":
        break
    # コンボボックス更新後処理
    if event=="-CY-":
        window["-Y-"].update(values["-CY-"])
        continue
    elif event=="-CM-":
        window["-M-"].update(values["-CM-"])
        日数=calendar.monthrange(int(values["-CY-"]),int(values["-CM-"]))[1]  # 返り値の2番目が日数(コンボ用)
        window["-CD-"].update(values=list(range(1,日数+1)))     #生年日コンボボックスリストを更新
        window["-D-"].update("")
        window["-CD-"].set_focus()
        continue
    elif event=="-CD-":
        window["-D-"].Update(values["-CD-"])
        window["-Y-"].Update(values["-CY-"])
        continue
    elif event=="-Y-":
        if int(values["-Y-"])>0:
            window["-CY-"] .Update(values["-Y-"])   
            continue
    
    if values["-Y-"]=="" or values["-M-"]=="" or values["-D-"]=="":
        X=SG.popup_ok_cancel("生年月日が未入力")
        if X=="OK": # ok_cancel の返り値は OK or Cancel
            window["-Y-"].set_focus()   # フォーカスセット
    else:    
            #D1=(DT.datetime.strptime(window["-Y-"]+window["-M"-]+window["-D-"],"%Y%m%d"))
            D2=values["-Y-"]+"/"+values["-M-"]+"/"+values["-D-"] # 日付変換第2引数と合わせる
            D3=(DT.datetime.strptime(D2,"%Y/%m/%d"))    ## このまま update すると秒数が表示されてしまう
            年齢=Age(values["-Y-"],values["-M-"])
            window["-YMD-"].update(年齢)
            
window.close
1 2
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次