본문 바로가기
Study(매일매일한걸음씩)/Python

Mini -Project #2-2 GUI 계산기 만들기(pyside6) - 개선

by 여유러운백수삶개발자 2023. 2. 10.
구현기능
1. 숫자입력 후 계산시 입력하고 = 입력하면 계산되어 표시됨
2. AC 입력시 화면이 지워짐
3. 사칙연산이 가능함
4. 계산후 다시 숫자 입력시 화면 지워지면서 숫자 입력되게(함수 수정)
5. 오류 검출(if function except 추가)
6. 코드 좀더 간소화(모르는 함수 공부해서)(dict. 활용)


차후 추가 기능
1. 백스페이스 기능 추가
2. 텍스트창 입력시 복사 되게
3. mr,mc 기능 추가
4. 진법 계산기 기능 추가
5. code 공부 detail하게 해서 주석 추가

 

import sys
from PySide6 import QtCore, QtGui

from PySide6.QtWidgets import QApplication, QMainWindow, QLineEdit, QPushButton, QHBoxLayout, QVBoxLayout, QWidget, QGridLayout
from PySide6.QtCore import Slot, Qt

import re

result = ''
result_state = False
count = 0

class MyWidget(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setFixedSize(300, 300)
        self.setWindowTitle("Caculate by KKD")
        print(self)

        # create display
        self.text_edit = QLineEdit("", self)
        self.text_edit.setFixedSize(280, 40)
        # 오른쪽 정렬
        self.text_edit.setAlignment(Qt.AlignRight)
        # 읽기만 가능하게
        self.text_edit.setReadOnly(True)

        # button 만들기
        self.createButtons()

        # set main layout
        main_layout = QVBoxLayout()
        main_layout.addWidget(self.text_edit)
        main_layout.addLayout(self.buttons_layout)
        central_widget = QWidget(self)
        central_widget.setLayout(main_layout)
        self.setCentralWidget(central_widget)

    def createButtons(self):
        global count
        self.buttons = {
            "(": (0, 0),
            ")": (0, 1),
            "%": (0, 2),
            "AC": (0, 3),
            "7": (1, 0),
            "8": (1, 1),
            "9": (1, 2),
            "/": (1, 3),
            "4": (2, 0),
            "5": (2, 1),
            "6": (2, 2),
            "*": (2, 3),
            "1": (3, 0),
            "2": (3, 1),
            "3": (3, 2),
            "-": (3, 3),
            "0": (4, 0),
            ".": (4, 1),
            "=": (4, 2),
            "+": (4, 3)
        }
        # print(self.buttons.items())
        # print(type(self.buttons.items()))

        self.buttons_layout = QGridLayout()
        for btn_text, pos in self.buttons.items():
            # print("btn_text = ",btn_text)
            # print("pos = ",pos)
            button = QPushButton(btn_text)
            # print(type(button))
            button.clicked.connect(self.handle_button)
            self.buttons_layout.addWidget(button, pos[0], pos[1])

    def handle_button(self):
        global result_state
        print(result_state)
        button = self.sender()
        if button.text() == "=":
            try:
                temp = self.text_edit.text()
                result = eval(self.text_edit.text())
                self.text_edit.setText(temp + button.text() + str(result))
                result_state = True
            except:
                self.text_edit.setText("Error")
        elif button.text() == "AC":
            self.text_edit.clear()
        else:
            if result_state == True:
                self.text_edit.clear()
                self.text_edit.setText(self.text_edit.text() + button.text())
                result_state = False
            else:
                self.text_edit.setText(self.text_edit.text() + button.text())


if __name__ == "__main__":
    app = QApplication()

    widget = MyWidget()

    widget.show()

    sys.exit(app.exec())

댓글