-
Kivy 기능 분할하기 (split file & class)Programing/python 어플 개발 2022. 5. 5. 17:58반응형
이전 글에서는 kivy를 이용해 알람 어플을 위한 내부 기능들을 만들어 보았고(비록 소리가 아닌 print였지만),
또 kivyMD를 이용해 간략하게 시계 위젯도 띄워 봤습니다.
알람 내부기능(지정된 시간에 알람 울리기)
시계 위젯 사용하기(시간 지정용 위젯)
이제는 하나 어플리케이션에서 모두 작동하게 해보겠습니다.
방법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일동안 퇴근 이후의 저녁을 거의 이것만 붙잡고 있었네요
생각보다 너무 단순하게 마무리 되어서 시원하기도 하고 살짝 허탈하기도 한 과정이였습니다ㅋㅋㅋㅋ
반응형'Programing > python 어플 개발' 카테고리의 다른 글
[streamlit] streamlit앱 배포하기 (1) 2024.03.26 kivy 어플에 소리 넣기 (kivy SoundLoader) (0) 2022.05.06 kivyMD로 시계 위젯 띄우기(KivyMD TimePicker) (0) 2022.05.01 KivyMD를 이용해 Kivy 디자인을 더 쉽게 지정하기 (3) 2022.04.29 kivy를 활용한 어플 만들기 (Clock Object 사용해보기) (0) 2022.04.28