Programing/python 어플 개발

kivy를 활용한 어플 만들기 (Clock Object 사용해보기)

뇌님 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 함수를 my_callback(key='value') 처럼 키-값을 넣어서 사용하고 싶다면 조금 귀찮아집니다.

Clock.schedule_interval 은 콜백함수의 형태만 받아들이기 때문입니다.

callback 함수만 받아들입니다.

 

때문에 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()

2시 22분에 알람이 울린 뒤 시간 print 반복을 멈췄습니다!

 

처음에는

"schedule_interval 는 그저 단순히 반복할 뿐인데 왜 Clock에 꼭 필요한 것 처럼 가장 위에 있는거지?"

"그냥 while문이나 기타 다른거로 현재시간 체크하면 되지 않을까?" 했었는데

 

하다보니 어플리케이션처럼 event 기반의 프로그램이라면 접근방식부터 달라야한다는 것을 알 수 있는 재미있는 경험이였습니다.

 

 

다음번에는 datetime.strptime("22-04-28 02:22:00", "%y-%m-%d %H:%M:%S") 같이 시간을 직접 입력하지 않더라도 조금 더 진짜 어플처럼 위젯을 이용해서 시간을 입력할 수 있게 해볼까 합니다.

반응형