파이썬으로 구현한 디지털 시계

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

[파이썬 + PyQt5 디지털 시계]


아날로그 시계는 C++과 MFC를 이용해 만든 예제가 이미 홈페이지에 소개되어 있지만 삼각함수가 필요하므로 중학교 3학년 이상에게 만들어 볼 것을 권장하고 있습니다.

[C++, MFC 아날로그 시계]


왜냐하면 시계 외곽선 원의 좌표를 삼각함수를 이용해 찾아내서 선을 그려야 하기 때문이죠.

오늘은 쉬운 디지털 시계를 파이썬 + PyQt5를 이용해 만들어 보겠습니다.

난이도는 매우 쉬운편입니다.

우리는 객체지향프로그래밍 언어인 파이썬을 쓰고 있으므로 클래스 기반으로 만들어 보았습니다.

먼저 전체 코드를 한번 살펴 보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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 설치하기

PyQt5 기반 동영상 플레이어앱 만들기