-
kivy를 활용한 어플 만들기 (Clock Object 사용해보기)Programing/python 어플 개발 2022. 4. 28. 02:36반응형
알람 어플이야 이미 기본어플들 마저 빅스비, 시리랑 연동되는 상당한 기능을 가지고 있기 때문에
굳이 노력하여 만드는 것보다 누가 먼저 만들어 놓은 것을 활용하는 것이 효율적이지만,
제가 만들어보고싶은 어플 중 하나는 알람기능을 보유한 어플입니다.그래서 오늘은 필요한 요소 중 가장 간단한 기능이라고 생각한(....) 시간과 관련한 모듈에 대해서 찾아봤습니다.
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") 같이 시간을 직접 입력하지 않더라도 조금 더 진짜 어플처럼 위젯을 이용해서 시간을 입력할 수 있게 해볼까 합니다.
반응형'Programing > python 어플 개발' 카테고리의 다른 글
kivyMD로 시계 위젯 띄우기(KivyMD TimePicker) (0) 2022.05.01 KivyMD를 이용해 Kivy 디자인을 더 쉽게 지정하기 (3) 2022.04.29 Python만으로 어플을 만들어보자 #8 (feat. 구름IDE, goorm IDE) (5) 2022.04.26 Python만으로 어플을 만들어보자 #7 (buildozer error shooting) (0) 2022.04.23 Python만으로 어플을 만들어보자 #6 (Create a package for Android) (1) 2022.04.21