PyQt 예제 쉬어가기 - 계산기 만들기 1

이번 글은 이전에 저장해둔 글을 다시 올려 놓은 것이다. 쉬어가기로 제목이 되어 있지만 쉬어가는 것 같지는 않다...

-----------------------------------------------------------------------------------

이번 글에서는 계산기를 만들어 보겠다. 따로 문제로 나온 것도 아니지만 지금까지 배운 걸로 계산기 정도는 만들 수 있어야 할 것 같다는 생각이 들어서 직접 코딩을 해보았다.

그렇다고 너무 복잡한 계산기가 아니라 아주 단순하게 사칙 연산 정도만 되는 정말 단순한 계산기이다. 직접 만들어본 계산기는 아래와 같다.


버튼 크기도 가로로 너무 크고, 조금 조잡해 보이기도 하지만 작동하는 것은 다 잘 된다.

그럼, 이제부터 위 계산기를 만들기 위한 단계를 설명하겠다. 제안하는 바로는 일단 직접 코딩을 해보는 것을 권한다.



먼저, 위 계산기를 만들기 위해서 필요한 것은 레이블 1개, 버튼 16개이다. 레이블은 숫자 표시를 하지 못하지만 숫자를 텍스트로 처리 해버리고 연산할 때는 eval 함수를 사용해서 계산을 하도록 하면 된다.

그리고 숫자 표시는 버튼을 누를 때마다 레이블에 표시된 숫자 뒤에 이어 붙이는 방법을 사용하면 된다.


그러면 대충 개념은 잡혔으니 코딩을 시작해봐야 하는데, 문제는 위처럼 버튼과 레이블을 어떻게 배치하느냐 이다.

지금까지 배운 방식 중에서 위와 같이 배치하는 방법은 배우지 않았다. 해볼만한 시도가 있다면 grid 레이아웃을 사용해서 좌표로 배치를 하면 되는데, 문제는 0,0 에 레이블을 배치하면 레이블이 0,0 부터 0,1 까지의 크기로 생기기만 한다.

이것을 해결하는 방법은 레퍼런스에서 찾을 수 있었는데, QGridLayout.addWidget(self, QWidget, int, int, int, int, Qt.Alignment alignment = 0) 이라는 메소드가 존재한다.

우리가 앞에서 grid 레이아웃에 위젯을 추가할 때 사용한 메소드는 int 가 두 개 밖에 들어가지 않았다.

즉, 왼쪽 상단 모서리의 좌표만 지정해 준 것인데, 위 메소드는 왼쪽 모서리 뿐만 아니라 오른쪽 하단 모서리의 좌표도 지정해줄 수 있다. 따라서 레이블 위젯을 추가할 때 0,0,1,4 에 위치하도록 하면 된다.

(이때, 마지막이 4인 이유는 모서리가 5번째 열의 라인에 맞춰지기 때문이다. 즉, 왼쪽 라인부터 0, 1, 2, 3, 4 이기 때문이다.)
(완전히 잘못 알고 있었다)
앞의 두 int 는 위젯을 배치할 좌표를 의미한다. 그리고 뒤에 나오는 int 는 행과 열을 얼마나 늘릴 것 인가를 나타낸다.

즉, 0, 0, 1, 4는 0, 0에 위치시키고 행을 1칸, 열을 4칸 늘린다는 의미이다.

이것으로 위젯을 배치까지는 초기화를 통해서 만들 수 있다. 시그널-슬롯 부분을 제외하면 아래와 같이 코드를 작성할 수 있다.
#!/usr/bin/env python3

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

# 창 정의
class Form(QDialog) :
    # 창 초기화
    def __init__(self, parent = None) :
        super().__init__(parent)
        self.old = ''
        self.new = '0'
        self.operator = ''
        
        layout = QGridLayout()
        self.label = QLabel()
        self.label.setText('<p align="right"><font size=30><b>' + self.new + '</b></font></p>')
        layout.addWidget(self.label, 0, 0, 1, 4) # 0, 0 위치에서 행으로 1칸, 열로 4칸의 크기를 갖도록 함.
        # 버튼 생성과 위치 지정
        for index, value in enumerate(['7', '8', '9', '/', '4', '5', '6', '*', '1', '2', '3', '-', '0', '.', '=', '+']) :
            button = QPushButton(value)
            layout.addWidget(button, index//4+1, index%4)
        
        self.setLayout(layout)
        self.setWindowTitle('계산기')

if __name__ == '__main__' :
    app = QApplication(sys.argv)
    form = Form()
    form.show()
    app.exec_()
위 코드에서 19 ~ 21 라인에서 for 문을 통해서 버튼을 생성하고 배치하고 있다. 만약, 16개를 하나 씩 배치해야 한다면 정말 수고로운 일이 아닐 수 없다.

따라서 버튼 리스트를 만들고 행은 인덱스를 4로 나눈 몫 + 1을 취하고, 열은 인덱스를 4로 나눈 나머지 값을 취하면 원하는 데로 왼쪽에서 오른쪽으로 배치를 할 수가 있다.

그리고 위에서 self.old 와 self.new, self.operator 라는 속성을 초기화 했는데, 이 속성들은 나중에 메소드를 구현할 때 사용할 것이다.

일단, 위처럼 코드를 짠 뒤 실행을 하면 맨 위에서 보여준 계산기와 같은 창이 나타날 것이다.

그러나 아직 버튼을 눌러도 계산기는 반응이 없다. 이제, 시그널-슬롯을 이용해서 버튼 작동 방식을 코딩해야 한다.

이것은 다음 글에서 설명하겠다.

댓글 없음:

댓글 쓰기