카테고리 없음

알람시계 3 기능

2024 자탐 2025. 5. 30. 20:05

예약한 시간에 맞춰 다른 프로그램이 실행될 수 있도록  현재 시간과 예약 시간을 확인하고, 실행 여부를 판단하는 로직을 추가함.

 

1. 현재 시각과 예약 시간 확인

import tkinter, time, datetime, sys
from tktimepicker import AnalogPicker, constants
from tkinter import filedialog, messagebox

file = filedialog.askopenfilenames(initialdir="/", title="파일명 선택")
if not file:
    messagebox.showwarning("오류", "파일을 선택하세요")
    sys.exit()

window = tkinter.Tk()
window.title("Crawler")
window.geometry("300x550")

def clock_update():
    reserve_hour, reserve_minute = time_picker.hours(), time_picker.minutes() # 세팅된 시간, 분 확인
    
    now = datetime.datetime.now() # 현재 시간 확인

    current_time = time.strftime("%H:%M:%S")
    clock_label.config(text = "현재 시간 : {}".format(current_time))
    window.after(1000, clock_update)
 
# 파일명 표기
file_name = tkinter.Label(window, text=file)
file_name.pack(padx=20)

# 현재 시간
clock_label = tkinter.Label(window, text="")
clock_label.pack(pady=10)

# 진행 상황 표기 줄
status_label = tkinter.Label(window, text="시작 대기 중")
status_label.pack(padx=20, pady=10)

# 예약 시간
time_picker = AnalogPicker(window, period=constants.PM) # 오후로 시간 고정
time_picker.setHours(datetime.datetime.now().hour % 12) # 12시간 표기법으로 변환, 고정
time_picker.setMinutes(datetime.datetime.now().minute) 현재 시간의 분으로 고정
time_picker.pack(padx=20)

# 버튼 Method
button = tkinter.Button(window, command=clock_update, text="시작하기", width=200, height=10)
button.pack(padx=20, pady=25)
window.mainloop()

현 시간을 기준으로 오후 시간대로 세팅하기 위해 time_picker Method 를 사용하여 시간, 분, 오후로 맞춰두었으며, 버튼 클릭 시 clock_update 함수가 실행되므로 클릭 시 clock_update 함수 안에 세팅 시간을 확인하도록 함수 안 로직을 추가함.

예약 시간을 초 단위로 맞추지 않는 이유는 실행 주기인 1000ms 이 반드시 1초를 보장하지 않으므로실행할 수 있는 기회를 여유롭게 주기 위해서 시간과 분이 맞기만 하면 실행하도록 구성하였다.

 

2. 현재 시각과 비교하여 실행 타이밍 설정

 

def clock_update():
    reserve_hour, reserve_minute = time_picker.hours(), time_picker.minutes()
    
    # 실행 시간대가 PM이면 현재 시간에서 +12 시간
    if time_picker.period() == "PM":
        reserve_hour += 12
    
    now = datetime.datetime.now()

    current_time = time.strftime("%H:%M:%S")
    clock_label.config(text = "현재 시간 : {}".format(current_time))
    
    
    # 실행 시간까지 얼마나 걸리는지 알림
    status_label.config(text = "{} 시간 {} 분 후 실행 예정".format(
        reserve_hour - now.hour, reserve_minute - now.minute
    ))
    
    # 시간이 맞는 경우, 예약 함수 시작
    if reserve_hour == now.hour and reserve_minute == now.minute:
        print("start!")
        return sys.exit()

    window.after(1000, clock_update)

 

3. 달력 추가

 

from tkcalendar import DateEntry

# 이하 이전 코드들

calendar = DateEntry(window, width=200)
calendar.pack(padx=20, pady=10)

 

4. 달력추가 -> 날짜 고려하여 알람 설정, 실행 시간 확인하기

 

def clock_update():
	# 달력의 날짜 반환
    year, month, day = map(int, str(calendar.get_date()).split('-')) 
    
    # 예약된 시간 반환
    hour, minute = time_picker.hours(), time_picker.minutes() 

	# 날짜형으로 변경
    reserve_time = datetime.datetime(year, month, day, hour, minute, 0) 
    
    # 남은 시간 반환
    remain_time = str(reserve_time - datetime.datetime.now()).split('.')[0].replace("days,", "일")

    now = datetime.datetime.now()

    current_time = time.strftime("%H:%M:%S")
    clock_label.config(text = "현재 시간 : {}".format(current_time))
    status_label.config(text = "{} 후 실행 예정".format(remain_time))

    if day == now.day and hour == now.hour and minute == now.minute:
        # 함수 실행 부분

        return window.quit()

    window.after(1000, clock_update)

실행 결과