파이썬으로 구현한 디지털 시계
이번에 만든 주제는 디지털 시계입니다.
아날로그 시계는 C++과 MFC를 이용해 만든 예제가 이미 홈페이지에 소개되어 있지만 삼각함수가 필요하므로 중학교 3학년 이상에게 만들어 볼 것을 권장하고 있습니다.
왜냐하면 시계 외곽선 원의 좌표를 삼각함수를 이용해 찾아내서 선을 그려야 하기 때문이죠.
오늘은 쉬운 디지털 시계를 파이썬 + PyQt5를 이용해 만들어 보겠습니다.
난이도는 매우 쉬운편입니다.
우리는 객체지향프로그래밍 언어인 파이썬을 쓰고 있으므로 클래스 기반으로 만들어 보았습니다.
먼저 전체 코드를 한번 살펴 보겠습니다.
QWidget 에서 상속받은 CWidget 클래스 하나와 메인함수가 전부입니다.
[1~6번 라인] 은 시계 구현에 필요한 파이썬 모듈을 불어오는 코드입니다.
C++의 include 구문와 유사합니다.
[2~33번 라인] 은 CWidget 클래스의 생성자 함수이며, Qt의 QLCDNumber 클래스를 6개 만들고 있습니다.
바로 년, 월, 일, 시, 분, 초를 표시할 컨트롤이죠.
[36~57번 라인] 은 년,월,일을 표시할 수평레이아웃박스(QHBoxLayout 클래스)를 만든 후, 생성자에서 만든 LCD 창을 배치하고 있습니다.
이어서 시, 분, 초도 동일한 패턴입니다.
그 다음은 년, 월, 일과 시, 분, 초를 2줄로 배치하기 위해 수직레이아웃박스(QVBoxLayout 클래스)를 만들고 위에서 만든 수평박스 2개를 추가하고 있습니다.
MFC에도 이런 레이아웃 박스 클래스가 있다면 참 행복할거 같네요.
[59~74번 라인] 은 타이머 콜백을 통해 계속 호출될 함수이며, time.localtime() 함수를 통해 시간을 현지시간을 가져옵니다.
가져온 시간은 LCD 컨트롤에 표시하고 1초 주기의 타이머를 생성해 지속적으로 시간을 갱신해주는 행동을 하고 있습니다.
[77~82번 라인] 은 메인 함수역할을 하는 코드로, CWidget 클래스 변수를 만들고 앱을 동작시키는 역할만 담당합니다.
간단하지 않나요.
사실 LCD 컨트롤도 반복문을 이용해 생성하고 파이썬 리스트로 관리하면 더 코드는 짧아지겠지만, 좀 길더라도 알아보기 쉽게 만들어 보았습니다.
감사합니다.
[파이썬 + PyQt5 디지털 시계] |
아날로그 시계는 C++과 MFC를 이용해 만든 예제가 이미 홈페이지에 소개되어 있지만 삼각함수가 필요하므로 중학교 3학년 이상에게 만들어 볼 것을 권장하고 있습니다.
[C++, MFC 아날로그 시계] |
왜냐하면 시계 외곽선 원의 좌표를 삼각함수를 이용해 찾아내서 선을 그려야 하기 때문이죠.
오늘은 쉬운 디지털 시계를 파이썬 + PyQt5를 이용해 만들어 보겠습니다.
난이도는 매우 쉬운편입니다.
우리는 객체지향프로그래밍 언어인 파이썬을 쓰고 있으므로 클래스 기반으로 만들어 보았습니다.
먼저 전체 코드를 한번 살펴 보겠습니다.
import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * from threading import Timer import time QApplication.setAttribute(Qt.AA_EnableHighDpiScaling, True) class CWidget(QWidget): def __init__(self): super().__init__() self.year = QLCDNumber(self) self.month = QLCDNumber(self) self.day = QLCDNumber(self) self.hour = QLCDNumber(self) self.min = QLCDNumber(self) self.sec = QLCDNumber(self) ## LCD 글자색 변경 #pal = QPalette() #pal.setColor(QPalette.WindowText, QColor(255,0,0)) #self.sec.setPalette(pal) ## LCD 배경색 변경 #pal = QPalette() #pal.setColor(QPalette.Background, QColor(255,0,0)) #self.min.setPalette(pal) #self.min.setAutoFillBackground(True) self.initUI() def initUI(self): hbox1 = QHBoxLayout() hbox1.addWidget(self.year) hbox1.addWidget(self.month) hbox1.addWidget(self.day) hbox2 = QHBoxLayout() hbox2.addWidget(self.hour) hbox2.addWidget(self.min) hbox2.addWidget(self.sec) vbox = QVBoxLayout() vbox.addLayout(hbox1) vbox.addLayout(hbox2) self.setLayout(vbox) self.setWindowTitle('시계') self.setGeometry(200,200, 400, 200) self.showtime() def showtime(self): # 1970년 1월 1일 0시 0분 0초 부터 현재까지 경과시간 (초단위) t = time.time() # 한국 시간 얻기 kor = time.localtime(t) # LCD 표시 self.year.display(kor.tm_year) self.month.display(kor.tm_mon) self.day.display(kor.tm_mday) self.hour.display(kor.tm_hour) self.min.display(kor.tm_min) self.sec.display(kor.tm_sec) # 타이머 설정 (1초마다, 콜백함수) timer = Timer(1, self.showtime) timer.start() if __name__ == '__main__': app = QApplication(sys.argv) w = CWidget() w.show() sys.exit(app.exec_())
QWidget 에서 상속받은 CWidget 클래스 하나와 메인함수가 전부입니다.
[1~6번 라인] 은 시계 구현에 필요한 파이썬 모듈을 불어오는 코드입니다.
C++의 include 구문와 유사합니다.
[2~33번 라인] 은 CWidget 클래스의 생성자 함수이며, Qt의 QLCDNumber 클래스를 6개 만들고 있습니다.
바로 년, 월, 일, 시, 분, 초를 표시할 컨트롤이죠.
[36~57번 라인] 은 년,월,일을 표시할 수평레이아웃박스(QHBoxLayout 클래스)를 만든 후, 생성자에서 만든 LCD 창을 배치하고 있습니다.
이어서 시, 분, 초도 동일한 패턴입니다.
그 다음은 년, 월, 일과 시, 분, 초를 2줄로 배치하기 위해 수직레이아웃박스(QVBoxLayout 클래스)를 만들고 위에서 만든 수평박스 2개를 추가하고 있습니다.
MFC에도 이런 레이아웃 박스 클래스가 있다면 참 행복할거 같네요.
[59~74번 라인] 은 타이머 콜백을 통해 계속 호출될 함수이며, time.localtime() 함수를 통해 시간을 현지시간을 가져옵니다.
가져온 시간은 LCD 컨트롤에 표시하고 1초 주기의 타이머를 생성해 지속적으로 시간을 갱신해주는 행동을 하고 있습니다.
[77~82번 라인] 은 메인 함수역할을 하는 코드로, CWidget 클래스 변수를 만들고 앱을 동작시키는 역할만 담당합니다.
간단하지 않나요.
사실 LCD 컨트롤도 반복문을 이용해 생성하고 파이썬 리스트로 관리하면 더 코드는 짧아지겠지만, 좀 길더라도 알아보기 쉽게 만들어 보았습니다.
감사합니다.
안녕하세요. 코드 공유 해도 될까요?ㅎㅎ
답글삭제네 CC BY 라이센스 이므로 아래사항만 지켜주세요.
삭제"저작자의 이름, 저작물의 제목, 출처 등 저작자에 관한 표시를 해주어야 합니다"