728x90
반응형

 

https://gist.github.com/saleph/a301957b16dff7ad2892

 

[qt5] grid layout - calculator skeleton

[qt5] grid layout - calculator skeleton. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

 

전 포스팅인 PT Designer를 이용하여 계산기를 만들면서 구글링을 통해 위 사이트를 알게 되었다.

 

사이트에 있는 코드는 grid 계산기의 layout만 있었다. 이 코드를 이용하여 계산기의 기능을 구현하고자 한다.

 

def init_ui(self): 까지는 사이트에 있던 코드의 내용이고

 

def func_a는 내가 계산기의 기능을 추가한 것이다!

 

import sys
from PyQt5.QtWidgets import (QWidget, QGridLayout, QPushButton, QApplication, QPlainTextEdit, QLabel)

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.str =''
        self.label =QLabel();
        self.init_ui()

    def init_ui(self):
        grid = QGridLayout()
        self.setLayout(grid)

        names = ['Cls', 'Bck', '', 'Close',
                 '7', '8', '9', '/',
                 '4', '5', '6', '*',
                 '1', '2', '3', '-',
                 '0', '.', '=', '+']

        positions = [(i,j) for i in range(5) for j in range(4)]

        for position, name in zip(positions, names):
            if name == '' : continue
            btn = QPushButton(name)
            btn.clicked.connect(self.func_a)
            grid.addWidget(btn, *position)
        grid.addWidget(self.label)
        self.move(300,150)
        self.setWindowTitle('Calculator')
        self.show()
        self.str=""

    def func_a(self,x) -> None:
        sender = self.sender()  # 어떤 콤포넌트 또는 위젯에서 어떤 signal이 발생했는가?
        self.str = self.str + sender.text()

        self.label.setText(self.str)
        result=[]
        first_operand = 0

        if 'C' in self.str: #비우기
            self.label.clear()
            self.str = '' #문자열 내용 비우기

        for i in list(self.str):
            result_str = ''.join(result)
            if i == '=': # =일 경우 계산 결과를 label에 적용
                print("결과는 =",i, 'result :', result)
                print('결과는 ',result_str)
                print('비어있나', first_operand)
                print('계산 결과는', int(result_str)+first_operand)
                if '+' in self.str:
                    self.label.setText(str(int(result_str) + first_operand))
                if '-' in self.str:
                    self.label.setText(str(first_operand - int(result_str)))
                if '*' in self.str:
                    self.label.setText(str(first_operand * int(result_str)))
                if '/' in self.str:
                    self.label.setText(str(first_operand / int(result_str)))

            elif i in ['+','-','*','/']:
                first_operand += int(result_str)
                print('덧셈 누르면',result_str)
                print(i)
                result=[]

            else:
                result.append(i)
                print(i, '결과 : ',result)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

 

실행화면

 

2/3 입력

 

= 누른 순간 0.6666666666이 계산되었다.

728x90
반응형
728x90
반응형

https://www.geeksforgeeks.org/building-calculator-using-pyqt5-in-python/

 

Building Calculator using PyQt5 in Python - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

위의 사이트는 계산기를 구현하고 작동영상까지 있다.

 

이 사이트를 참고해서 만들었고 그냥 복붙이 아닌 Qt Designer에서 만들어서 사이트에 있는 연산 메소드를 참고하여 만들었다!

 

Qt Designer에서 계산기 모양 틀을 만들어 준다.

 

이 파일을 저장하면 .ui가 되는데 파이참에서 코드를 수정할 거라 .py로 변환해 주어야 한다.

 

변환 방법은 

 

2021.06.02 - [FRONT-END/PyQT] - [PyQT] PyQt5 및 Qt Designer 설치 / .ui -> .py 변환

 

[PyQT] PyQt5 및 Qt Designer 설치 / .ui -> .py 변환

PyQt5 설치 pip install pyqt5 Pyside2 설치 pip install pyside2 Pyside2를 설치하셨으면 Qt Designer가 자동으로 설치되어있다. designer.exe를 바로가기로 만들어두면 사용하기 편해진다. UI 파일을 PY 파일..

hello-ming.tistory.com

 

위 사이트에 정리해 놓아서 들어가 보면 쉽게 따라할 수 있을 것이다.

 

링크 안가도 이거 따라하면 된다..ㅎㅎ

 

 

calculator.py를 파이참에 띄우면 디자인한 계산기 모양 그대로 뜬다.

 

여기서 연산 (+,-,*,/) 하도록 메서드는 위 사이트에서 참고하여 붙여주었고 나머지 숫자들을 연결시켜 주었다.

 

from PyQt5 import QtCore, QtGui, QtWidgets
import sys

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(360, 370)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(5, 150, 80, 40))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(95, 150, 80, 40))
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_3.setGeometry(QtCore.QRect(185, 150, 80, 40))
        self.pushButton_3.setObjectName("pushButton_3")
        self.pushButton_5 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_5.setGeometry(QtCore.QRect(185, 200, 80, 40))
        self.pushButton_5.setObjectName("pushButton_5")
        self.pushButton_6 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_6.setGeometry(QtCore.QRect(5, 200, 80, 40))
        self.pushButton_6.setObjectName("pushButton_6")
        self.pushButton_7 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_7.setGeometry(QtCore.QRect(95, 200, 80, 40))
        self.pushButton_7.setObjectName("pushButton_7")
        self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_4.setGeometry(QtCore.QRect(185, 250, 80, 40))
        self.pushButton_4.setObjectName("pushButton_4")
        self.pushButton_8 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_8.setGeometry(QtCore.QRect(95, 300, 80, 40))
        self.pushButton_8.setObjectName("pushButton_8")
        self.pushButton_9 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_9.setGeometry(QtCore.QRect(5, 300, 80, 40))
        self.pushButton_9.setObjectName("pushButton_9")
        self.pushButton_10 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_10.setGeometry(QtCore.QRect(5, 250, 80, 40))
        self.pushButton_10.setObjectName("pushButton_10")
        self.pushButton_11 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_11.setGeometry(QtCore.QRect(185, 300, 80, 40))
        self.pushButton_11.setObjectName("pushButton_11")
        self.pushButton_12 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_12.setGeometry(QtCore.QRect(95, 250, 80, 40))
        self.pushButton_12.setObjectName("pushButton_12")
        self.pushButton_13 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_13.setGeometry(QtCore.QRect(275, 150, 80, 40))
        self.pushButton_13.setObjectName("pushButton_13")
        self.pushButton_14 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_14.setGeometry(QtCore.QRect(275, 250, 80, 40))
        self.pushButton_14.setObjectName("pushButton_14")
        self.pushButton_15 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_15.setGeometry(QtCore.QRect(275, 200, 80, 40))
        self.pushButton_15.setObjectName("pushButton_15")
        self.pushButton_16 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_16.setGeometry(QtCore.QRect(275, 300, 80, 40))
        self.pushButton_16.setObjectName("pushButton_16")
        self.pushButton_17 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_17.setGeometry(QtCore.QRect(5, 100, 200, 40))
        self.pushButton_17.setObjectName("pushButton_17")
        self.pushButton_18 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_18.setGeometry(QtCore.QRect(210, 100, 145, 40))
        self.pushButton_18.setObjectName("pushButton_18")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(5, 5, 350, 70))
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setPointSize(15)
        self.label.setFont(font)
        self.label.setStyleSheet("QLabel{ \n"
"            border : 2px solid black;\n"
"            background : white;\n"
"            }")
        self.label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTop|QtCore.Qt.AlignTrailing)
        self.label.setWordWrap(True)
        self.label.setObjectName("label")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 360, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)


    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "pyqt 계산기"))
        self.pushButton.setText(_translate("MainWindow", "1"))
        self.pushButton_2.setText(_translate("MainWindow", "2"))
        self.pushButton_3.setText(_translate("MainWindow", "3"))
        self.pushButton_5.setText(_translate("MainWindow", "6"))
        self.pushButton_6.setText(_translate("MainWindow", "4"))
        self.pushButton_7.setText(_translate("MainWindow", "5"))
        self.pushButton_4.setText(_translate("MainWindow", "9"))
        self.pushButton_8.setText(_translate("MainWindow", "."))
        self.pushButton_9.setText(_translate("MainWindow", "0"))
        self.pushButton_10.setText(_translate("MainWindow", "7"))
        self.pushButton_11.setText(_translate("MainWindow", "/"))
        self.pushButton_12.setText(_translate("MainWindow", "8"))
        self.pushButton_13.setText(_translate("MainWindow", "*"))
        self.pushButton_14.setText(_translate("MainWindow", "+"))
        self.pushButton_15.setText(_translate("MainWindow", "-"))
        self.pushButton_16.setText(_translate("MainWindow", "="))
        self.pushButton_17.setText(_translate("MainWindow", "Clear"))
        self.pushButton_18.setText(_translate("MainWindow", "Del"))
        self.label.setText(_translate("MainWindow", "TextLabel"))

        # adding action to each of the button
        self.pushButton_15.clicked.connect(self.action_minus)
        self.pushButton_16.clicked.connect(self.action_equal)
        self.pushButton_9.clicked.connect(self.action0)
        self.pushButton.clicked.connect(self.action1)
        self.pushButton_2.clicked.connect(self.action2)
        self.pushButton_3.clicked.connect(self.action3)
        self.pushButton_6.clicked.connect(self.action4)
        self.pushButton_7.clicked.connect(self.action5)
        self.pushButton_5.clicked.connect(self.action6)
        self.pushButton_10.clicked.connect(self.action7)
        self.pushButton_12.clicked.connect(self.action8)
        self.pushButton_4.clicked.connect(self.action9)
        self.pushButton_11.clicked.connect(self.action_div)
        self.pushButton_13.clicked.connect(self.action_mul)
        self.pushButton_14.clicked.connect(self.action_plus)
        self.pushButton_8.clicked.connect(self.action_point)
        self.pushButton_17.clicked.connect(self.action_clear)
        self.pushButton_18.clicked.connect(self.action_del)

    def action_equal(self):

        # get the label text
        equation = self.label.text()

        try:
            # getting the ans
            ans = eval(equation)

            # setting text to the label
            self.label.setText(str(ans))

        except:
            # setting text to the label
            self.label.setText("Wrong Input")

    def action_plus(self):
        # appending label text
        text = self.label.text()
        self.label.setText(text + " + ")

    def action_minus(self):
        # appending label text
        text = self.label.text()
        self.label.setText(text + " - ")

    def action_div(self):
        # appending label text
        text = self.label.text()
        self.label.setText(text + " / ")

    def action_mul(self):
        # appending label text
        text = self.label.text()
        self.label.setText(text + " * ")

    def action_point(self):
        # appending label text
        text = self.label.text()
        self.label.setText(text + ".")

    def action0(self):
        # appending label text
        text = self.label.text()
        self.label.setText(text + "0")

    def action1(self):
        # appending label text
        text = self.label.text()
        self.label.setText(text + "1")

    def action2(self):
        # appending label text
        text = self.label.text()
        self.label.setText(text + "2")

    def action3(self):
        # appending label text
        text = self.label.text()
        self.label.setText(text + "3")

    def action4(self):
        # appending label text
        text = self.label.text()
        self.label.setText(text + "4")

    def action5(self):
        # appending label text
        text = self.label.text()
        self.label.setText(text + "5")

    def action6(self):
        # appending label text
        text = self.label.text()
        self.label.setText(text + "6")

    def action7(self):
        # appending label text
        text = self.label.text()
        self.label.setText(text + "7")

    def action8(self):
        # appending label text
        text = self.label.text()
        self.label.setText(text + "8")

    def action9(self):
        # appending label text
        text = self.label.text()
        self.label.setText(text + "9")

    def action_clear(self):
        # clearing the label text
        self.label.setText("")

    def action_del(self):
        # clearing a single digit
        text = self.label.text()
        print(text[:len(text)-1])
        self.label.setText(text[:len(text)-1])

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

 

참고할 점은 design을 이용한거라 button의 번호를 맞춰주는게 중요하다.

 

 

728x90
반응형
728x90
반응형

 

이번 툴바를 만들 때는 파이썬의 가변인자를 응용한 것이라 이해를 돕기 위해 파이썬의 가변인자 예제를 먼저 보여준 후 툴바를 만들것이다.

 

나는 파이참에서 실행하였다.

 

def my_sum(*integers):
    result=0
    for x in integers:
        result+=x
    return result

def concatenate(**kwargs):
    result=""
    print("딕셔너리",kwargs)
    for arg in kwargs.values():
        result += arg
    return result

print(my_sum(1,2,3,4)) #가변인자
print(concatenate(a="Real", b="파이썬", c="은", d="훌륭하다", e="!"))

 

이제 툴바를 만들어 보자

 

import sys
from PyQt5.QtCore import Qt

from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, QLabel, QToolBar, QStatusBar

class MainWindow(QMainWindow):
     def __init__(self, *args, **kwargs):
         super(MainWindow, self).__init__(*args, **kwargs)
         self.setWindowTitle("나의 놀라운 앱")
         label = QLabel("This is 놀랍다")
         label.setAlignment(Qt.AlignCenter)
         self.setCentralWidget(label)

         toolbar = QToolBar("나의 메인 툴바")
         self.addToolBar(toolbar)

         button_action = QAction("당신의 버튼",self)
         button_action.setStatusTip("이것은 당신의 버튼이에요")
         button_action.triggered.connect(self.onMyToolBarButtonClick)
         toolbar.addAction(button_action)
         self.setStatusBar(QStatusBar(self))

     def onMyToolBarButtonClick(self,s):
        print("눌렸다 : ",s)

if __name__ == "__main__":
    qApp = QApplication(sys.argv)
    main = MainWindow()
    main.show()
    sys.exit(qApp.exec_())

self는  mainWindow안에 멤버변수나 메서드를 뜻한다.

 

label 객체는 self가 없는데 넣어도 잘 된다!

 

self의 유무의 차이는 self가 없으면 지역변수가 되므로 다른 곳에서 쓸 수 없다. 자바의 this 느낌

 

멤버변수면 this와 비슷한 self를 줘야한다!

 

이 툴바를 실행하면 

당신의 버튼에 커서를 위치시키면 statebar 가 뜬다.

 

버튼을 누르면 console창에 뜬다.

 

 

728x90
반응형
728x90
반응형

PyCharm(파이참)에서 PyQT를 실행하였고

 

위젯을 생성하여 버튼을 누르면 함수를 호출하여 QMessageBox를 띄우는 것을 해볼 것이다.

 

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox

def dialog():
    a = QMessageBox()
    a.setText("여기에 출력되요")
    a.setDetailedText("상세 항목이 나와요")
    a.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
    a.exec_()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w= QWidget()
    w.resize(300,300)
    w.setWindowTitle("안녕 컴퓨터")
    label = QLabel(w)
    label.setText("여기는 라벨이에요")
    label.move(100,130)
    label.show()
    btn = QPushButton(w) #위젯 집어넣기
    btn.setText("여기는 푸시 버튼")
    btn.move(110,150) #버튼의 위치 이동
    btn.clicked.connect(dialog) #btn이 눌리면 dialog 함수 호출
    btn.show() #버튼을 보여줌
    w.show() # 중요 window는 기본값이 hidden이라 show 해야함
    sys.exit(app.exec_()) # 이상태는 이벤트 루프가 돌고있다.

라벨과 푸시버튼

 

버튼을 누르면 QMessageBox가 띄어진다.

728x90
반응형
728x90
반응형

파이참에서 pyqt를 적용하여 화면을 띄어보자

 

import sys
from PyQt5.QtWidgets import QApplication, QWidget

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w= QWidget()
    w.resize(300,300)
    w.setWindowTitle("안녕 컴퓨터")
    w.show()
    sys.exit(app.exec_())

[ 코드 설명 ]

 

resize - 위젯의 크기를 정함 (x축, y축)

 

w.show() # 중요하다.!  window는 기본값이 hidden이라 show 해야한다.

 

sys.exit(app.exec_()) # 이상태는 이벤트 루프가 돌고있다.

 

 

728x90
반응형
728x90
반응형

QPalette 클래스는 각 위젯 상태에 대한 색상 그룹을 포함한다.

 

import sys
from PyQt5.QtCore import Qt

from PyQt5.QtGui import QPalette
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox, QGridLayout

if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.setStyle("Fusion")
    qp = QPalette()
    qp.setColor(QPalette.ButtonText, Qt.black)
    qp.setColor(QPalette.Window, Qt.black)
    qp.setColor(QPalette.Button, Qt.gray)
    #만든것을 앱에 추가
    app.setPalette(qp)

    w= QWidget()
    grid= QGridLayout(w)
    grid.addWidget(QPushButton("버튼 1"), 0,0) #0행 0렬
    grid.addWidget(QPushButton("버튼 2"), 0,1) #0행 10렬
    grid.addWidget(QPushButton("버튼 3"), 1,0) #1행 0렬
    grid.addWidget(QPushButton("버튼 4"), 1,1) #1행 1렬

    w.show() # 중요 window는 기본값이 hidden이라 show 해야함
    sys.exit(app.exec_()) # 이상태는 이벤트 루프가 돌고있다.

728x90
반응형
728x90
반응형

이전 포스팅에서는 .ui를 .py로 바꾸는 방법을 소개했다.

 

이번에는 다른 방법으로 파이참 내에서 .ui를 실행하는 코드를 소개할 것이다.

 

파이참 파일에서 실행할 아무파일 .py를 생성하고 

 

필수적으로 띄울 .ui를 프로젝트파일에 옮겨놔야 한다!

.ui가 있어야 한다.

 

import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic

from_class = uic.loadUiType("qt0602.ui")[0]
#QMainWindo, from_class를 상속받아 내 클래스 MyWindow
class MyWindow(QMainWindow, from_class):
    def __init__(self):
        super().__init__()
        self.setupUi(self) #this가 상속받은곳에 없으면 부모를 찾아감

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mywindow = MyWindow()
    mywindow.show()
    app.exec_()

 

728x90
반응형
728x90
반응형

PyQt5 설치

pip install pyqt5

 

Pyside2 설치

pip install pyside2

 

Pyside2를 설치하셨으면 Qt Designer가 자동으로 설치되어있다.

 

 

designer.exe를 바로가기로 만들어두면 사용하기 편해진다.

 

UI 파일을 PY 파일로 변환

 

저장을 할 경우에는 파일이 .ui 파일로 저장된다.

 

이 파일을 .py 파일로 변환 하는 방법은 두가지가 있다.

 

1. cmd에서 파일변환하기

pyuic5 -x 변환할 파일(.ui) -o 변환되었을때 파일명(.py)

 

ui가 있는 파일에 위의 코드를 입력하면 된다.

 

 

열어보면 파이썬 코드로 변환된 것을 확인할 수 있다.

 

 

 

2. 저장할때부터 확장자 .py로 바꿔주기

.py로 바꿔주었다

--> 음... 이 방법은 파이참으로 열어보니 xml 형식이였다. 모두들 첫번째 방법을 사용하길 바랍니다.

 

 

ui를 py로 변환한 후 내가 만든 디자인이 파이썬 코드로 변환됬는지 바로 확인하기 위해

 

python (실행할 파일)

 

해주면 바로 GUI가 나오는 것도 확인할 수 있다.

 

728x90
반응형
728x90
반응형

파이참에서 실행하였다.

 

Settings -> Project Interpreter 에서 PyQT5에 관한 Package를 다운받았다.

 

hello.py를 생성해

import sys
from PyQt5.QtWidgets import *

app = QApplication(sys.argv)
label = QLabel("안녕 큐티?")
label.show()
app.exec_()

Ctrl + Shift +F10을 눌러 실행해주면

 

창이 띄어졌다!

728x90
반응형

+ Recent posts