kivy를 활용한 어플 만들기 (Clock Object 사용해보기)
알람 어플이야 이미 기본어플들 마저 빅스비, 시리랑 연동되는 상당한 기능을 가지고 있기 때문에
굳이 노력하여 만드는 것보다 누가 먼저 만들어 놓은 것을 활용하는 것이 효율적이지만,
제가 만들어보고싶은 어플 중 하나는 알람기능을 보유한 어플입니다.
그래서 오늘은 필요한 요소 중 가장 간단한 기능이라고 생각한(....) 시간과 관련한 모듈에 대해서 찾아봤습니다.
kivy에서 시계와 관련한 모듈은 kivy.clock
입니다. (공식문서링크)
1. 함수 반복하기
from kivy.app import App
from kivy.clock import Clock
class ClockDemo(App):
# dt means delta-time
def my_callback(dt):
print('Hello')
# call my_callback every 2 seconds
Clock.schedule_interval(my_callback, 2)
# call my_callback in 0.1 seconds
Clock.schedule_once(my_callback, 0.1)
# call my_callback as soon as possible (usually next frame.)
Clock.schedule_once(my_callback)
# Run the app
if __name__ == '__main__':
ClockDemo().run()
공식문서에서의 코드와 다른 점이라면
callback함수 안에 pass가 아닌 print('Hello')를 넣어서 진행과정을 확인한다는 점,
반복시간을 좀 바꿨다는 점,
class 정의 위 아래로 import, run 코드를 붙였다는 점 뿐입니다.
그런데 이제 my_callback 함수를 my_callback(key='value') 처럼 키-값을 넣어서 사용하고 싶다면 조금 귀찮아집니다.
Clock.schedule_interval 은 콜백함수의 형태만 받아들이기 때문입니다.
때문에 functools.partial 를 사용해야합니다.
from kivy.app import App
from kivy.clock import Clock
from functools import partial
class ClockDemo(App):
def my_callback(subject, point, *args):
print(subject, point)
# call my_callback every 2 seconds
Clock.schedule_interval(partial(my_callback, '국어', '100점'), 2)
# call my_callback in 0.1 seconds
Clock.schedule_once(partial(my_callback, '영어', '50점'), 0.1)
# call my_callback as soon as possible (usually next frame.)
Clock.schedule_once(partial(my_callback, '수학', '0점'))
# Run the app
if __name__ == '__main__':
ClockDemo().run()
schedule_interval 추가 명령이 있기 전까지 일정 시간 간격으로 계속 반복하여 콜백함수를 실행합니다.
schedule_once 주어진 시간에 단 한번만 콜백함수를 실행합니다.
2. 트리거 변수 정의하기
schedule 은 변수로 저장했다가 간단하게 불러오는 것이 가능합니다.
그리고 반복적으로 실행되고 있는 schedule은 cancle(), unschedule()를 통해 중단 가능합니다.
# will run the callback once before the next frame
event1 = Clock.create_trigger(my_callback, 3)
event1() # run
# will run the callback every one second
event2 = Clock.schedule_interval(my_callback, 1)
event2() # run
# unschedule using cancel
event1.cancel()
# unschedule using Clock.unschedule
Clock.unschedule(event2)
3. 정해진 시간에 알람 울리기
그럼 위의 Clock 모듈만을 활용해서 정해진 시간에 알람을 울리는
(지금은 그저 print를 할 뿐인) 간단한 코드를 간단히 작성해 보겠습니다.
from kivy.app import App
from kivy.clock import Clock
from datetime import datetime
class ClockDemo(App):
# print alarm
def alarm(self):
print("Alarm!")
# turn on alarm
def on_start(self):
self.beep_time = datetime.strptime("22-04-28 02:22:00", "%y-%m-%d %H:%M:%S")
self.tick = Clock.schedule_interval(self.update, 1)
# tick tok every 1 second
def update(self, dt):
self.now = datetime.now()
print(self.now)
# beep & alarm at beep_time
if self.now >= self.beep_time:
self.alarm()
self.tick.cancel()
print("-----The End-----")
# Run the app
if __name__ == '__main__':
ClockDemo().run()
처음에는
"schedule_interval 는 그저 단순히 반복할 뿐인데 왜 Clock에 꼭 필요한 것 처럼 가장 위에 있는거지?"
"그냥 while문이나 기타 다른거로 현재시간 체크하면 되지 않을까?" 했었는데
하다보니 어플리케이션처럼 event 기반의 프로그램이라면 접근방식부터 달라야한다는 것을 알 수 있는 재미있는 경험이였습니다.
다음번에는 datetime.strptime("22-04-28 02:22:00", "%y-%m-%d %H:%M:%S") 같이 시간을 직접 입력하지 않더라도 조금 더 진짜 어플처럼 위젯을 이용해서 시간을 입력할 수 있게 해볼까 합니다.