目覚まし時計

目覚まし時計(中1女子/作)
生徒作品でdatetimeモジュールを使った作品は珍しいですね。

アラームをセットするとペンギンが歩き出すところが非常によくできています。右端までいったら左端に戻るロジックは単純ですが、今回みたいに右端まで行ったら向きを変えて歩くロジックは少し複雑です。フラグを活用してうまく作れています。

アラームがなったときにボタンを押すと止めれる処理が目覚まし時計ぽくっていいと思います。


Pythonで記述したコード
import tkinter
import datetime
import pygame

#変数
hour=1 #アラーム設定の時間
minute=1 #アラーム設定の分
アラームフラグ=False #
アラーム音フラグ=False #
カウント=0 #コスチューム切替用
px=100 #ペンギンのx座標
py=75 #ペンギンのy座標
ペンギン向き= "右" #ペンギンの向き

def main():
    global 時間,アラームフラグ,カウント,px,py,ペンギン向き,アラーム音フラグ
    #ラベル作成
    カウント=カウント+1
    現在時刻=datetime.datetime.now()
    時間.destroy()
    時間=tkinter.Label(ウィンドウ,text=str(現在時刻.hour)+":"+str(現在時刻.minute)+":"+str(現在時刻.second),
                     font=("メイリオ",80,"bold"),bg="white")
    時間.place(x=90,y=140)
    
    #ペンギンを左右に歩かせる
    if アラームフラグ == True: #アラームがセットされたときだけペンギンは歩く
        if px < 750 and ペンギン向き == "右":#ペンギンが右端に向かって歩く処理
            キャンバス.delete("ペンギンタグ")
            キャンバス.create_image(px, py, image=ペンギンリスト右[カウント % 2], tag="ペンギンタグ")
            px = px + 50
        if px >= 750:#右端についたら左に向く
            ペンギン向き = "左"
        if px > 100 and ペンギン向き == "左":#左端に向かって歩く処理
            キャンバス.delete("ペンギンタグ")
            キャンバス.create_image(px, py, image=ペンギンリスト左[カウント % 2], tag="ペンギンタグ")
            px = px - 50
        if px <= 100:#左端についたら右に向く
            ペンギン向き =  "右"
            
        #アラームを鳴らす処理
        if アラーム_時間ラベル["text"] == 現在時刻.hour and アラーム_分ラベル["text"] == 現在時刻.minute:
            BGM.stop()
            キャンバス.delete("ペンギンタグ")
            時間.destroy()
            キャンバス.create_image(410, py, image=ペンギンリスト正面[カウント % 2], tag="ペンギンタグ")
            if py <200:
                py=py+30
            if アラーム音フラグ==False:
                アラーム音フラグ=True
                アラーム音.play(-1)
    ウィンドウ.after(1000, main)


#アラーム設定ボタンの処理
def 時間設定_増():
    global hour
    増減ボタン音.play()
    hour = hour+1
    アラーム_時間ラベル["text"]=hour
    if hour==24:
        hour=0
        
#アラーム設定ボタンの処理
def 時間設定_減():
    global hour
    増減ボタン音.play()
    hour = hour-1
    アラーム_時間ラベル["text"]=hour
    if hour<=0:
        hour=24

#アラーム設定ボタンの処理
def 分設定_増():
    global minute
    増減ボタン音.play()
    minute = minute+1
    アラーム_分ラベル["text"]=minute
    if minute==59:
        minute=-1

#アラーム設定ボタンの処理
def 分設定_減():
    増減ボタン音.play()
    global minute
    minute = minute-1
    アラーム_分ラベル["text"]=minute
    if minute<=0:
        minute=60

#アラーム設定処理
def アラーム設定():
    global アラームフラグ,アラーム_設定済,px,py,アラーム音フラグ
    アラーム設定音.play()
    アラーム音.stop()
    BGM.stop()
    BGM.play(-1)
    アラーム音フラグ=False
    if アラームフラグ==False:
        アラーム_設定済=tkinter.Label(ウィンドウ,text="アラーム設定済"
                       ,font=("メイリオ",40,"bold"),bg="yellow green")
        アラーム_設定済.place(x=400,y=410)
        アラームフラグ=True
    else:
        アラーム_設定済.destroy()
        キャンバス.delete("ペンギンタグ")
        px=100
        py=75
        アラームフラグ=False

#ウィンドウ作成
ウィンドウ=tkinter.Tk()
ウィンドウ.title("目覚まし時計")
ウィンドウ.geometry("820x600")
ウィンドウ.resizable(False,False)

#画像アップロード
背景=tkinter.PhotoImage(file="image\背景.png")
ボタン=tkinter.PhotoImage(file="image\ボタン.png")
ペンギン1=tkinter.PhotoImage(file="image\ペンギン1.png")
ペンギン2=tkinter.PhotoImage(file="image\ペンギン2.png")
ペンギン3=tkinter.PhotoImage(file="image\ペンギン3.png")
ペンギン4=tkinter.PhotoImage(file="image\ペンギン4.png")
ペンギン5=tkinter.PhotoImage(file="image\ペンギン5.png")
ペンギン6=tkinter.PhotoImage(file="image\ペンギン6.png")

#画像リスト
ペンギンリスト右=[ペンギン1,ペンギン2]
ペンギンリスト左=[ペンギン3,ペンギン4]
ペンギンリスト正面=[ペンギン5,ペンギン6]

#上のキャンバス作成
キャンバス=tkinter.Canvas(ウィンドウ,width=820,heigh=400,bg="orange")
キャンバス.place(x=0,y=0)
キャンバス.create_image(410,200,image=背景)

#下のキャンバス作成
キャンバス2=tkinter.Canvas(ウィンドウ,width=820,heigh=200,bg="green")
キャンバス2.place(x=0,y=400)

#ラベル作成
現在時刻=datetime.datetime.now()
時間=tkinter.Label(ウィンドウ,text=str(現在時刻.hour)+":"+str(現在時刻.minute)+":"+str(現在時刻.second),
                     font=("メイリオ",80,"bold"),bg="white")
時間.place(x=80,y=130)

アラーム_時間ラベル=tkinter.Label(ウィンドウ,text=hour,font=("メイリオ",40,"bold"),bg="yellow green")
アラーム_時間ラベル.place(x=80,y=410)

セミコロン=tkinter.Label(ウィンドウ,text=":",font=("メイリオ",40,"bold"),bg="green")
セミコロン.place(x=155,y=410)

アラーム_分ラベル=tkinter.Label(ウィンドウ,text=minute,font=("メイリオ",40,"bold"),bg="yellow green")
アラーム_分ラベル.place(x=220,y=410)

アラーム_設定済=tkinter.Label(ウィンドウ,text="アラーム設定済"
                       ,font=("メイリオ",40,"bold"),bg="yellow green")
#音の設定
pygame.init()
BGM=pygame.mixer.Sound(file="sound\BGM.wav")
増減ボタン音=pygame.mixer.Sound(file="sound\増減.mp3")
アラーム設定音=pygame.mixer.Sound(file="sound\アラーム設定.mp3")
アラーム音=pygame.mixer.Sound(file="sound\アラーム音.wav")
BGM.play(-1)
BGM.set_volume(0.10)

#ボタン作成
時間ボタン1_増=tkinter.Button(ウィンドウ,image=ボタン,bg="yellow",command=時間設定_増)
時間ボタン1_増.place(x=80,y=500)

時間ボタン1_減=tkinter.Button(ウィンドウ,image=ボタン,bg="pink",command=時間設定_減)
時間ボタン1_減.place(x=80,y=550)

時間ボタン2_増=tkinter.Button(ウィンドウ,image=ボタン,bg="yellow",command=分設定_増)
時間ボタン2_増.place(x=220,y=500)

時間ボタン2_減=tkinter.Button(ウィンドウ,image=ボタン,bg="pink",command=分設定_減)
時間ボタン2_減.place(x=220,y=550)

アラーム設定ボタン=tkinter.Button(ウィンドウ,text="アラーム設定",bg="skyblue",
                         font=("メイリオ",25,"bold"),command=アラーム設定)
アラーム設定ボタン.place(x=400,y=500)

#関数実行
main()

ウィンドウ.mainloop()