ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 함수를 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") 같이 시간을 직접 입력하지 않더라도 조금 더 진짜 어플처럼 위젯을 이용해서 시간을 입력할 수 있게 해볼까 합니다.

    반응형

    댓글

Designed by Tistory.