파이썬 예제 (디지털 시계)

이번에 만든 주제는 디지털 시계입니다.

[파이썬 + 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 컨트롤도 반복문을 이용해 생성하고 파이썬 리스트로 관리하면 더 코드는 짧아지겠지만, 좀 길더라도 알아보기 쉽게 만들어 보았습니다.

감사합니다.

댓글

  1. 안녕하세요. 코드 공유 해도 될까요?ㅎㅎ

    답글삭제
    답글
    1. 네 CC BY 라이센스 이므로 아래사항만 지켜주세요.

      "저작자의 이름, 저작물의 제목, 출처 등 저작자에 관한 표시를 해주어야 합니다"

      삭제

댓글 쓰기

이 블로그의 인기 게시물

Qt Designer 설치하기

C++ 예제 (소켓 서버, 이미지, 파일전송)