Python PyQt + 키 예외 처리 알고리즘을 사용하여 계산기를 빌드하는 방법을 보여드리겠습니다!


PyQt는 무엇입니까

Python 코드를 Qt 레이아웃에 연결하여 GUI 프로그램을 만들 수 있는 프레임워크입니다. PyQt는 영국의 Riverbank Computing에서 교차 플랫폼 C++ GUI 프레임워크인 Qt를 Python 모듈로 전환하는 도구를 만드는 것으로 시작되었습니다. 현재 PyQt4 및 PyQt5 버전이 주로 사용됩니다.

macOS – Wikipedia, 모두를 위한 백과사전

무료 백과사전 Wikipedia. 클래식 Mac OS에 대한 자세한 내용은 Mac OS 설명서를 참조하십시오. macOS(한국어: Mac OS, 이전 이름: OS X, Mac OS X / Mac OS X)는 Apple에서 개발한 Unix 기반 운영 체제(1)입니다. 최

de.wikipedia.org

PyQt5 v-MacO를 설치하는 방법

https://smart-factory-lee-joon-ho.343

MacOs에서 PyQt 설치 및 사용 feat. 아나콘다 설치

https://wikidocs.net/35478 01.01 PyQt란? (목차) ##PyQt란? PyQt는 Python 코드를 Qt 레이아웃에 연결하여 GUI 프로그램을 만들 수 있는 프레임워크입니다. PyQt는 C++의 Cr… wikidocs.netPy

smart-factory-lee-joon-ho.tistory.com

PyQt 설치 방법을 먼저 확인하고 싶다면 위 링크를 확인하세요.

설치 명령

pip install PyQt5
pip install pyqt5-tools

먼저 PyQt는 사용자 인터페이스를 쉽게 그릴 수 있는 Designer라는 플랫폼을 제공합니다.

https://codetorial.net/pyqt5/index.html

PyQt5 Tutorial – Python에서 자신만의 GUI 프로그램 만들기 – Codetorial

PDF 및 샘플 파일 이 튜토리얼의 내용은 보다 편리한 오프라인 및 모바일 보기를 위해 약 280페이지의 PDF e-book으로 제작되었습니다. PyQt5 자습서 – PDF 전자책. 온라인 서점에서 구입

codetorial.net

이 홈페이지를 통해 처음부터 다양한 소규모 프로젝트를 따라갈 수 있습니다.


Windows에서는 cmd 창에 디자이너를 입력합니다.

디자이너 프로그램이 즉시 실행됩니다.


중간에 떠 있는 새 양식이라는 상자를 통해 첫 번째 프로젝트의 기본 설정을 선택하여 시작할 수 있습니다.


아래 위젯을 선택하면 양식 전용 상자가 나타납니다.

위젯 상자에서 드래그 앤 드롭으로 자유롭게 디자인할 수 있습니다.

공식 웹 사이트에서 디자인 부분을 찾을 수 있습니다.

인코딩을 확인하는 중요한 부분은 속성 이름입니다.


기억하기 쉬운 이름으로 변경할 수 있습니다.


계산기 디자인을 이쁘게 해주셔서 몇가지 기능을 추가했습니다.

IDE에서 코드를 개발할 수 있습니다.

VsCode를 사용했습니다.

위의 디자이너 프로그램에서 디자인을 한 후 저장 버튼을 클릭합니다.

Calculator.ui라는 파일이 생성됩니다.

이 경로에서 VsCode를 실행하십시오.


cal이라는 파일에 하나의 큰 ui 파일과 하나의 py 파일이 있습니다.

제 경우에는 Vscode에 3개의 확장을 설치했습니다.


그런 다음 ui_calculator.py 파일이 자동으로 생성되고 코드는

코드는 코딩의 용이성을 위해 디자인에 연결하여 미리 결정했습니다.

방금 처음부터 다시 작성하려고했습니다.

먼저 첫 번째 창을 여는 간단한 예제를 기반으로 진행해 보겠습니다.


import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic  # UI를 연결한다

# ui 파일 연동
from_class = uic.loadUiType("calculator.ui")(0)

class Window(QWidget,from_class):

    def __init__(self):
        super().__init__()
        self.initUI()
        self.show()

    def initUI(self):
		self.setupUi(self)


if __name__ == '__main__':
   app = QApplication(sys.argv)
   myCalc = MyApp()
   sys.exit(app.exec_())

ui 파일 테마를 가져와 화면에 표시하는 기본 코드입니다.

버튼을 눌러도 아무 일도 일어나지 않지만 완성된 디자인으로 UI가 그려집니다.

자세한 코드 설명은 링크를 이용해주세요.

https://wikidocs.net/21920

01) 창 열기

!()(https://wikidocs.net/images/page/21920/2_1_opening_sample.png) – 위 이미지처럼 작은 창을 열어보자…

wikidocs.net


    def initUI(self):
        self.setupUi(self)
        # 숫자
        self.btn_1.clicked.connect(self.btn_1_click)
        self.btn_2.clicked.connect(self.btn_2_click)
        self.btn_3.clicked.connect(self.btn_3_click)
        self.btn_4.clicked.connect(self.btn_4_click)
        self.btn_5.clicked.connect(self.btn_5_click)
        self.btn_6.clicked.connect(self.btn_6_click)
        self.btn_7.clicked.connect(self.btn_7_click)
        self.btn_8.clicked.connect(self.btn_8_click)
        self.btn_9.clicked.connect(self.btn_9_click)
        self.btn_0.clicked.connect(self.btn_0_click)
        # 사칙연산 + 기호
        self.btn_del.clicked.connect(self.btn_delete_click)
        self.btn_plus.clicked.connect(self.btn_plus_click)
        self.btn_minus.clicked.connect(self.btn_minus_click)
        self.btn_obelus.clicked.connect(self.btn_obelus_click)
        self.btn_times.clicked.connect(self.btn_times_click)
        self.btn_equal.clicked.connect(self.btn_equal_click)
        self.btn_point.clicked.connect(self.btn_point_click)

숫자 키와 다른 키에 주석을 달았습니다.

connect 함수의 괄호 안에 클릭 이벤트 함수의 이름을 쓸 수 있습니다.

#######################
### 클릭 이벤트 함수 ###
#######################


    def btn_1_click(self):
        self.number("1")

    def btn_2_click(self):
        self.number("2")

    def btn_3_click(self):
        self.number("3")

    def btn_4_click(self):
        self.number("4")

    def btn_5_click(self):
        self.number("5")

    def btn_6_click(self):
        self.number("6")

    def btn_7_click(self):
        self.number("7")

    def btn_8_click(self):
        self.number("8")

    def btn_9_click(self):
        self.number("9")

    def btn_0_click(self):
        self.number("0")

# 삭제

    def btn_delete_click(self):
        self.del_num()

# 사칙연산

    def btn_plus_click(self):
        exist_text = self.display.toPlainText()
        if exist_text:
            self.plus()

    def btn_minus_click(self):
        exist_text = self.display.toPlainText()
        if exist_text:
            self.minus()

    def btn_times_click(self):
        exist_text = self.display.toPlainText()
        if exist_text:
            self.times()

    def btn_obelus_click(self):
        exist_text = self.display.toPlainText()
        if exist_text:
            self.obelus()
# 결과

    def btn_equal_click(self):
        self.equal()

# . 기호

    def btn_point_click(self):
        exist_text = self.display.toPlainText()
        if exist_text:
            self.point()

각 버튼의 클릭 이벤트 함수 내부에는 눌렀을 때 동작하는 함수가 있습니다.

네 가지 산술 연산 및 . 아이콘 클릭 이벤트의 경우

예외는 숫자를 입력하기 전에 입력을 방지하기 위해 조건문으로 처리됩니다.

위의 클릭 이벤트 기능에서 클릭 시 활성화되는 기능들입니다.

1. 수식 추가, 확장

2. 수식 삭제

3. 4연산 중복 입력 방지 기능

4. ( . ) 심볼 생성을 위한 제약 알고리즘 함수:

화면에 수식을 전부 쓰는 계산기를 만들고 있었기 때문에 위의 알고리즘이 필요했습니다.

1. 수식 추가, 확장

   # 수식 추가 , 연장

    def number(self, num):
        # 예외처리 #
        # 소수점 없이 0으로 시작하는 숫자 예외 처리
        # 0을 찍고 . 없이 바로 숫자를 쓰면 0삭제 후 마지막 입력 숫자만 등록

        select_btn = self.sender()
        # 클릭된 버튼에 표기된 text 반환
        select_btn_text = select_btn.text()
        # . 기호 유무 파악을 위한 변수 선언

        exist_text = self.display.toPlainText()
        # 각 변수에 해당 조건이 충족 안되면 최종 입력 값만 기록
        if exist_text == "0" and select_btn_text != ".":
            self.display.setText(select_btn_text)
        else:
            # 조건이 충족되면 추가 입력
            self.display.setText(exist_text + num)

예외 처리: 0으로 시작하는 숫자가 첫 번째 입력에 기록되지 않도록 합니다. 예) 023 + 52

sender() 함수로 클릭한 버튼에 대한 정보 얻기

text() 함수를 사용하여 버튼 이름을 가져옵니다.

그런 다음 어떤 키를 눌렀는지 알 수 있습니다.

따라서 조건문에 숫자 0이 기록되고 기호( . )가 입력되지 않으면 해당 레코드가 삭제됩니다.

마지막으로 누른 버튼의 정보만 기록되며, 다른 경우도 같은 방식으로 기록됩니다. 로 작성

2. 수식 삭제

def del_num(self):
        exist_text = self.display.toPlainText()
        # 문자열 (:-1)은 index 0 ~ 마지막 문자열 전까지
        self.display.setText(exist_text(:-1))

슬라이싱 구문을 아는 것이 좋습니다.

https://twpower.github.io/119-python-list-slicing-examples

(Python) Python 슬라이싱 기본 사항 및 예제

연습이 마스터를 만듭니다!

twpower.github.io

존재_텍스트(:-1)

이 코드가 의미하는 바는
>>> a = ('a', 'b', 'c', 'd', 'e')
>>> a(  : -1 )
('a', 'b', 'c', 'd')

수신된 문자열을 하나씩 빼서 표시하므로 삭제된 것과 동일하게 보입니다.

삼. 4개의 사칙연산으로 중복입력 방지 기능

calculator_icon_list = ("+", "-", "÷", "x", ".")
   # 사칙 연산 기호 중복 입력 방지 함수
    def no_double_math_icon(self):
        exist_text = self.display.toPlainText()
        if exist_text(-1) in calculator_icon_list:
            # 슬라이싱 문법 공부 필수 !
            self.display.setText(exist_text(:-1))

이미 별도의 목록을 선언했습니다.

exist_text(-1)

이 코드는 입력한 마지막 문자를 의미합니다.

입력한 마지막 문자가 위 목록의 인수와 동일한 경우

이 기능은 입력한 추가 문자를 삭제합니다.

4.( . ) 생성 제약 알고리즘 기능 아이콘

def point_generator(self):
        exist_text = self.display.toPlainText()
        # Counter 문법 확인 필 : 존재하는 인자 개수 확인하여 dict형식 생성
        counter_exist_text = Counter(exist_text)
        # 필수 !! #
        # 형변환 : Counter -> 딕셔너리
        counter_dict = dict(counter_exist_text)

        ### 중요 ###
        # 1. 없는 key 값은 에러를 발생시키는 dict 구조문 dict.get()로 해결 -> return NoneType
        # 2. NoneType 형식 반환이 문제 -> int(value or 0) 문법으로 None -> 0 변환

        # exist_text_icon_count = 연산 기호의 총 개수 #
        exist_text_icon_count = int(counter_dict.get("x") or 0) + \
            int(counter_dict.get("÷") or 0) + int(counter_dict.get("-") or 0) + \
            int(counter_dict.get("+") or 0)

        # 연산 기호의 개수와 "." 개수가 작거나 동일할 때만 추가 "." 입력 가능 조건문
        if exist_text_icon_count >= exist_text.count("."):
            self.number(".")

화면에 수식을 배치했기 때문에 위의 알고리즘이 필요했습니다.

dict 및 counter 구문을 사용할 수 있는 옵션이 있었습니다.

https://www.daleseo.com/python-collections-counter/

Python의 컬렉션 모듈에서 카운터 사용

Dal Seo의 엔지니어링 블로그

www.dalseo.com

카운터는 받은 문자열을 개별 문자 수만큼 표시하고 딕셔너리 형태로 반환하는 모듈입니다.

그러나 얻은 반환 값은 즉시 사용할 수 없으며 받아쓰기로 다시 변환해야 합니다.

입력 문자열에 있는 연산자 기호의 수보다 많습니다. 캐릭터는 같거나 작아야 한다고 생각합니다.

위의 구문을 사용하여 연산 기호의 수를 확인했습니다.

###### . 기호 입력 조건 ######
#1. 첫 번째 숫자 “.” 없이 입장 불가
#2. 그냥 “.” 존재할 수 밖에 없다
#3. 두 번째 “.” 연산자 문자 뒤에. 입력가능
#4. “. “보다 작거나 같아야 합니다.

###############################
########## 사칙 연산 함수 ######
###############################


    def plus(self):
        self.no_double_math_icon()
        self.number("+")

    def minus(self):
        self.no_double_math_icon()
        self.number("-")

    def obelus(self):
        self.no_double_math_icon()
        self.number("÷")

    def times(self):
        self.no_double_math_icon()
        self.number("x")

#############################
########## . 기호 함수 #######
#############################

###### . 기호 입력 조건 ######
# 1. 최초 숫자 없이 "." 입력 불가
# 2. 연산 기호 입력 전 숫자에는 단 1개의 "." 만 존재 가능
# 3. 연산 기호 후 2번 째 "." 입력 가능
# 4. 연산 기호 보다 " . " 적거나 같아야 됨

# 연산 기호 n개 삽입 기준 총 n+1개의 point가 있을 수 있다.
    def point(self):
        # 1. point 연달아 기재 금지 함수
        self.no_double_point_icon()
        # 2. point 2개 이하 사칙 연산 앞 뒤 1개 씩 입력
        self.point_generator()

###############################
########## 결과 도출 함수 ######
###############################

    def equal(self):

        # 문자열은 배열 형식이지만 수정불가 (튜플) ->수정 가능한 list 변환 과정
        exist_text = self.display.toPlainText()
        # list 형으로 변환
        exist_text_list = list(exist_text)

        try:
            # UI 통일 감을 주기 위한 코드 : 사칙연산 기호 내부 변환
            for i in exist_text_list:
                if i == "x":
                    exist_text_list(exist_text_list.index(i)) = "*"
                elif i == "÷":
                    exist_text_list(exist_text_list.index(i)) = "/"

            # 다시 join 메서드를 통해서 문자열로 변환
            str_text_list = "".join(exist_text_list)

            # Eval 함수는 문자열 식 값을 산수 하여 int로 반환
            answer = eval(str_text_list)

            # 소수점 길이 설정
            answer_round = round(answer, 6)

            # setText 에 맞는 str 형 변환
            self.display_result.setText(str(answer_round))

            # display 화면 초기화
            self.display.setText("")

        except Exception as e:
            print("Error", e)

연산기호와 관련된 조건문은 최종 유도함수에 포함된다.

# UI 통일 감을 주기 위한 코드 : 사칙연산 기호 내부 변환
for i in exist_text_list:
    if i == "x":
        exist_text_list(exist_text_list.index(i)) = "*"
    elif i == "÷":
        exist_text_list(exist_text_list.index(i)) = "/"

컴퓨터가 인식하는 연산 기호는 우리가 사용하는 기호와 다르기 때문입니다.

우리가 사용하는 연산 기호를 화면에 타이핑하지만 다시 한번 컴퓨터가 인식할 수 있는 기호로 변경했습니다.

문자열 -> 목록 유형 -> 편집 -> 다시 문자열로 변환

평가() 함수또한 사용됩니다.

평가(표현식)
eval 함수는 한 줄로 요약할 수 있습니다.
파라미터로 받은 표현식(=expression)을 문자열로 받아 실행하는 함수입니다.
즉, 매개변수로 받은 표현식은 파이썬에서 실행 가능한 문자열이 필요하고, 문자열로 입력된 표현식을 파이썬이 실행시키는 그런 함수입니다.

자동 문자열 표현식 산술을 통해 int 값으로 그것을 다시 돌려줘

또한 소수점 이하 자릿수를 6으로 제한하고 값을 설정합니다. 두번째 광고로 보내주세요

메인 화면이 초기화됩니다.

!! 나는 또한 예외 처리를 놓쳤다 많이!!

간단한 참조 도움이 되는 희망 나는 희망