目次
今回の全コード
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
コメント