ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Kivy 기능 분할하기 (split file & class)
    Programing/python 어플 개발 2022. 5. 5. 17:58
    반응형

     

     

    이전 글에서는 kivy를 이용해 알람 어플을 위한 내부 기능들을 만들어 보았고(비록 소리가 아닌 print였지만),

    또 kivyMD를 이용해 간략하게 시계 위젯도 띄워 봤습니다.

     

    알람 내부기능(지정된 시간에 알람 울리기)

     

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

    알람 어플이야 이미 기본어플들 마저 빅스비, 시리랑 연동되는 상당한 기능을 가지고 있기 때문에 굳이 노력하여 만드는 것보다 누가 먼저 만들어 놓은 것을 활용하는 것이 효율적이지만, 제가

    brain-nim.tistory.com

    시계 위젯 사용하기(시간 지정용 위젯)

     

    kivyMD로 시계 위젯 띄우기(KivyMD TimePicker)

    알람을 설정하기 위해 시간을 직접 입력해도 되지만, 시계를 띄워주고, 시계 위에서 원하는 시간을 클릭해서 알람시간을 지정하면 더 편할 것 같습니다. 그럼 kivy와 kivyMD가 만들어준 것들을 사

    brain-nim.tistory.com

     

    이제는 하나 어플리케이션에서 모두 작동하게 해보겠습니다.

     

     

    방법1 : 코드 이어 붙이기

    아무래도 가장 쉬운 방법은 그저 코드를 위 아래로 이어 붙이는 것일 겁니다.

    from kivymd.app import MDApp
    from kivy.uix.screenmanager import Screen
    from kivy.clock import Clock
    
    from kivymd.uix.button import MDRectangleFlatButton
    from kivymd.uix.label import MDLabel
    from kivymd.uix.picker import MDTimePicker
    
    from datetime import datetime
    
    
    class MainApp(MDApp):
    
        # Main -----------------------------------------------------
        def build(self):
            screen = Screen()
            self.alarm_time = None
    
            # button: open time picker
            button = MDRectangleFlatButton(text="Open Time Picker",
                                           pos_hint={'center_x':.5, 'center_y':.5},)
            button.bind(on_release=self.show_time_picker)
            screen.add_widget(button)
    
            # label: show the time
            self.label = MDLabel(text="Alarm : "+str(self.alarm_time),
                            pos_hint={'center_x':.8, 'center_y':.4},)
            screen.add_widget(self.label)
    
            return screen
    
        # Time Picker -----------------------------------------------------
        def show_time_picker(self, instance):
            time_dialog = MDTimePicker()
            time_dialog.set_time(self.chk_alarm_time())
            time_dialog.open()
    
            time_dialog.bind(on_save=self.set_time)
    
        # logic -----------------------------------------------------
        def chk_alarm_time(self):
            if self.alarm_time == None:
                set_time = datetime.strptime("00:00:00", "%H:%M:%S")
            else:
                set_time = self.alarm_time
    
            return set_time
    
        def set_time(self, instance, time):
            self.alarm_time = time
            self.label.text = "Alarm : "+str(self.alarm_time)
            self.clock_start()
    
        # Alarm --------------------------------------------------
        # turn on alarm
        def clock_start(self):  #on_start는 무조건 build시 시작
            self.tick = Clock.schedule_interval(self.update, 1)
    
        # ticktock every 1 second
        def update(self, dt):
            self.now = datetime.now().time()
            print(self.now)
    
            # beep & alarm at beep_time
            if self.alarm_time:
                if self.now >= self.alarm_time:
                    self.alarm()
                    self.tick.cancel()
    
        # print alarm
        def alarm(self):
            print("Alarm!")
    
    
    if __name__ == '__main__':
        MainApp().run()

    여기서 주의해야할 점은,

    이전에는 Alarm 부분에서 메소드 명이 on_start였지만, 현재는 clock_start라는 점입니다.

     

    from kivy.app import App, from kivymd.app import MDApp을 class에 상속한 경우,

    on_start라는 메소드를 빌드시 실행시키기 때문입니다.

     

    설정해둔 17시 35분에 알람이 잘 print 되는 모습을 볼 수 있습니다.

     

     

    물론 구현만 잘 되면 상관 없을 수 있겠지만, 우리는 앞으로 더 많은 기능을 추가할 예정입니다.

    그렇다면 코드의 가독성을 위해서도, 개발의 편의를 위해서도 파일을 분리하는 것이 더 좋겠죠?

     

     

    Kivy에서는 kv language 라는 것을 제공하고 있고, 이것을 .kv 파일로 따로 생성하여 관리할 수도 있습니다.

    그리고 여러개의 .kv 파일을 빌드하는 것도 가능합니다.

    하지만 저는 가능한 kv language를 사용하지 않고 kivy를 사용해보겠다고 괜한 존심을 세우고 있는 상태이기 때문에,

     

    여타 파이썬 프로젝트와 마찬가지로

    새로운 파일에서, 새로운 class를 생성해 위와 똑같은 어플리케이션을 구현해보도록 하겠습니다.

     

     

     

    방법2 : 기능별로 파일을 생성해 import 하기

    main.py

    from kivymd.app import MDApp
    from kivy.uix.screenmanager import Screen
    
    from kivymd.uix.button import MDRectangleFlatButton
    from kivymd.uix.label import MDLabel
    from kivymd.uix.picker import MDTimePicker
    
    from datetime import datetime
    from timer import Alarm
    
    class MainApp(MDApp):
    
        # Main Screen -----------------------------------------------------
        def build(self):
            screen = Screen()
            self.alarm_time = None
    
            # button: open time picker
            button = MDRectangleFlatButton(text="Open Time Picker",
                                           pos_hint={'center_x':.5, 'center_y':.5},)
            button.bind(on_release=self.show_time_picker)
            screen.add_widget(button)
    
            # label: show the time
            self.label = MDLabel(text="Alarm : "+str(self.alarm_time),
                            pos_hint={'center_x':.8, 'center_y':.4},)
            screen.add_widget(self.label)
    
            return screen
    
        # Time Picker -----------------------------------------------------
        def show_time_picker(self, instance):
            time_dialog = MDTimePicker()
            time_dialog.set_time(self.chk_alarm_time())
            time_dialog.open()
    
            time_dialog.bind(on_save=self.set_time)
    
        # logic -----------------------------------------------------
        def chk_alarm_time(self):
            if self.alarm_time == None:
                set_time = datetime.strptime("00:00:00", "%H:%M:%S")
            else:
                set_time = self.alarm_time
    
            return set_time
    
        def set_time(self, instance, time):
            self.alarm_time = time
            self.label.text = "Alarm : "+str(self.alarm_time)
    
            # alarm ----------------------
            timer = Alarm(self.alarm_time)
            timer.clock_start()
    
    
    if __name__ == '__main__':
        MainApp().run()

     

    timer.py

    from kivy.app import App
    from kivy.clock import Clock
    from datetime import datetime
    
    
    class Alarm(App):
        def __init__(self, alarm_time, **kwargs):
            super(Alarm, self).__init__(**kwargs)
            self.alarm_time = alarm_time
    
        # turn on alarm
        def clock_start(self):  # on_start는 무조건 build시 시작
            self.tick = Clock.schedule_interval(self.update, 1)
            print("start_timer")
    
        # ticktock every 1 second
        def update(self,dt):
            self.now = datetime.now().time()
            print(self.now)
    
            # beep & alarm at beep_time
            if self.alarm_time:
                if self.now >= self.alarm_time:
                    self.alarm()
                    self.tick.cancel()
    
        # print alarm
        def alarm(self):
            print("Alarm!")

    이렇게 main.py와 timer.py라는 두개의 파일로 기능을 구분했습니다!

     

    그리고 다행히 지정한 시간에 알람이 잘 뜨는 모습입니다!

     

     

     

    뭔가 계속 어긋나서 4일동안 퇴근 이후의 저녁을 거의 이것만 붙잡고 있었네요

    생각보다 너무 단순하게 마무리 되어서 시원하기도 하고 살짝 허탈하기도 한 과정이였습니다ㅋㅋㅋㅋ

    반응형

    댓글

Designed by Tistory.