HTTP(Hypertext Transfer Protocol)는 인터넷을 통해 데이터를 전송하는 데 사용되는 통신 프로토콜입니다.  World Wide Web의 기반이며 웹 페이지, 이미지 및 비디오를 포함하여 인터넷에서 대부분의 데이터를 전송하는 데 사용됩니다.



 HTTP 메시지의 기본 구조는 요청과 응답으로 구성됩니다.  웹 브라우저와 같은 클라이언트는 서버에 요청을 보내고 서버는 클라이언트에 다시 응답을 보냅니다.  요청과 응답은 둘 다 메시지 형식이며 여기에는 메서드(예: GET, POST), URL, 헤더 및 메시지 본문과 같은 다양한 정보가 포함됩니다.

 HTTP에서 사용되는 가장 일반적인 방법은 서버에서 리소스를 검색하는 데 사용되는 GET 방법입니다.  다른 일반적인 방법은 리소스를 생성하거나 업데이트하기 위해 서버에 데이터를 보내는 데 사용되는 POST입니다.  특정 목적을 위해 사용되는 PUT, DELETE 및 PATCH와 같은 다른 방법이 있습니다.

 HTTP는 클라이언트가 요청을 시작하고 서버가 요청에 응답하는 클라이언트-서버 아키텍처를 사용합니다.  클라이언트와 서버 간의 통신은 일반적으로 인터넷의 기반인 TCP/IP 연결을 통해 이루어집니다.

 HTTP의 주요 기능 중 하나는 상태 비저장 프로토콜이라는 것입니다. 즉, 각 요청은 이전 요청과 독립적입니다.  이는 간단하고 효율적이지만 상태를 유지하기 위해 쿠키나 세션과 같은 추가 메커니즘이 필요함을 의미하기도 합니다.  쿠키는 브라우저에 의해 클라이언트의 컴퓨터에 저장되고 각 요청과 함께 서버로 전송되는 작은 텍스트 파일입니다.  세션은 웹 사이트에서 사용자의 상호 작용 상태를 저장하는 데 사용되며 일반적으로 쿠키에 저장된 세션 ID를 사용하여 구현됩니다.

 HTTP는 요청 및 응답 메시지 모두에 간단한 텍스트 기반 형식을 사용합니다.  요청 메시지는 일반적으로 메서드, URL 및 헤더로 구성되는 반면 응답 메시지는 일반적으로 상태 코드, 헤더 및 메시지 본문으로 구성됩니다.  상태 코드는 성공적인 요청의 경우 200 OK, 이행할 수 없는 요청의 경우 404 Not Found와 같이 요청 결과를 나타내는 3자리 숫자입니다.

 HTTP 버전 1.1은 가장 널리 사용되는 HTTP 버전이며 TCP/IP를 통해 실행되는 애플리케이션 프로토콜입니다.  이 버전에서 가장 중요한 변경 사항은 동일한 연결을 통해 여러 요청과 응답을 보낼 수 있는 연결 유지 연결의 도입입니다.  이렇게 하면 각 요청에 대한 연결을 열고 닫는 오버헤드가 제거되어 성능이 향상됩니다.

 HTTP/2는 HTTP의 다음 버전이며 가장 뛰어난 기능은 하나의 단일 연결에서 요청과 응답을 다중화하는 동시에 헤더를 압축하는 것입니다.  이렇게 하면 요청을 완료하는 데 필요한 왕복 횟수가 줄어들어 효율성이 높아지고 네트워크를 통해 전송되어야 하는 데이터 양도 줄어듭니다.

 HTTPS(HTTP Secure)는 HTTP 위에 구축된 프로토콜이며 전송되는 데이터에 암호화를 추가합니다.  이는 SSL/TLS(Secure Sockets Layer/Transport Layer Security)를 사용하여 네트워크를 통해 전송되는 데이터를 암호화함으로써 달성됩니다.  이렇게 하면 전송 중에 데이터를 가로채거나 수정할 수 없으며 암호 및 신용 카드 번호와 같은 중요한 정보를 안전하게 전송할 수 있습니다.

 전반적으로 HTTP는 인터넷을 통해 데이터를 전송할 수 있는 강력하고 널리 사용되는 프로토콜이며 World Wide Web의 기반입니다.  프로토콜의 개발과 진화는 지속적으로 진행 중이며 성능과 보안을 더욱 향상시키기 위해 HTTP/3에 대한 작업이 진행 중입니다.

Posted by 블로그하는프로그래머
,

예, 웹 페이지를 아름답게 만드는 데 사용할 수 있는 웹 디자인에 사용할 수 있는 여러 오픈 소스 프레임워크 및 라이브러리가 있습니다.  인기 있는 옵션은 다음과 같습니다.




부트스트랩: 부트스트랩은 웹 페이지에 쉽게 추가할 수 있는 양식, 버튼 및 탐색 메뉴와 같이 미리 디자인된 다양한 구성 요소를 포함하는 널리 사용되는 오픈 소스 프레임워크입니다.





Foundation: Foundation은 웹 페이지에 쉽게 추가할 수 있는 양식, 버튼 및 탐색 메뉴와 같이 미리 디자인된 다양한 구성 요소를 포함하는 또 다른 오픈 소스 프레임워크입니다.




Material-UI: Material-UI는 Google에서 개발한 Material Design 가이드라인을 구현하는 오픈 소스 프레임워크입니다.  여기에는 아름답고 일관된 사용자 인터페이스를 만드는 데 사용할 수 있는 사전 설계된 다양한 구성 요소가 포함되어 있습니다.




Bulma: Bulma는 반응형 및 모바일 우선 웹 페이지를 만들기 위한 간단하고 사용하기 쉬운 프레임워크인 Flexbox를 기반으로 하는 최신 CSS 프레임워크입니다.




Tailwind CSS: Tailwind CSS는 맞춤형 사용자 인터페이스를 신속하게 구축하기 위한 유틸리티 우선 CSS 프레임워크입니다.  마크업에서 직접 모든 디자인을 구축하도록 구성할 수 있는 일련의 CSS 클래스를 제공합니다.




이러한 모든 프레임워크는 무료로 사용할 수 있으며 웹 개발 프로젝트에 쉽게 통합될 수 있습니다.  그들은 또한 프레임워크에 기여하고 지식과 경험을 공유하는 대규모의 활발한 개발자 커뮤니티를 보유하고 있습니다.

그것을 기억하는 것이 중요합니다

Posted by 블로그하는프로그래머
,

와이프랑 다욧 시작한 1주차....

동네에 셀러드 집이 새로 생긴게 기억이 나서 점심을 같이 샐러드 먹기로 했어요.



위치는 [카카오맵] 샐러디 서판교점
경기 성남시 분당구 운중로 129 마크시티옐로우 1층 110호 (운중동)

http://kko.to/af9AO1pZD

샐러디

경기 성남시 분당구 운중로 129

map.kakao.com


전화번호 : 031-607-1709

일딘 맛과 양은 엄청 만족해요~

내부도 깔끔하고 위생에 신경을 많이 쓰시는거 같아요~^^

메뉴판은 아래와 같이 비치 되어 있었어요.

입구 모습입니다.

포장도 깔끔!

우리가 선택한 샐러드는 "콥 셀러디"와 "탄단지 셀러디" 입니다.

포장지는 재활용 쓰레기로 분류 하기 위해서 소스를 바로 뭍히지 않고 집에 있는 볼에 덜고 재활용 까지 하는 센스!!

오늘도 자알 먹었습니다.

Posted by 블로그하는프로그래머
,


오늘도 가오레 하러 고고싱~

원래는 가오레 커뮤니티 만들려는 아이디어로 이게임에 발을 들였다...

하지만 너는 우리집의 500원을 잡아 먹는 괴물이였지....

이미 가오레에 중독 되버린 나.....

ㅋㅋㅋㅋㅋㅋㅋ 오늘도 가오레를 하러 간다!


여기는 판교 파머스몰에 위치한 토이 플러스 이다!

[카카오맵] 토이플러스 판교파미어스몰점
경기 성남시 수정구 창업로 17 C2동 B107호 (시흥동)

http://kko.to/P-tCSrI99

토이플러스

경기 성남시 수정구 창업로 17

map.kakao.com


위치가 보인다아!!


우와!!!! 사람도 없어~!!

2성 그만 나와!!!!!


3대나 보유 하고 있는 판교 토이 플러스!!

다들 즐거운 가오레 하세요~

Posted by 블로그하는프로그래머
,

판교 알파돔시티에 있는 릴리펏에 놀러왔습니다


아이랑 저녁시간을 즐기기 위해 방문했어요.



집에서도 가까워서 자주 방문하는 곳입니다.

조용하고 음식도 평균적으로 괜찮아요.

장난감 놀이 공간, 볼풀 공간, 메이크업, 주방공간등

놀수 있는 공간이 잘 나뉘어 있고,

아이가 질리지 않고 잼있게 놀았습니다.




음식 메뉴는 아래 처럼 되어 있고 맛도 있어서 좋아요~^^

우리는 오늘 까르보나라,  불고기 필라프 시켰어요.

직원 분들도 매우 친절 했습니다.

어른은 인원수 맞춰서 1인 1메뉴 주문, 아이는 2시간 기준 15,000원입니다.

이용시간은 10:30am~09:00pm 이니 찬고 하시면 좋을거 같아요.

[카카오맵] 릴리펏 판교알파돔시티점
경기 성남시 분당구 판교역로 145 라스트리트2동 지하1층 B123호 (백현동)

http://kko.to/NJdj9hawd

릴리펏

경기 성남시 분당구 판교역로 145

map.kakao.com

Posted by 블로그하는프로그래머
,

요새 포켓몬 가오레 설치 매장 찾기가 쉽지가 않다

https://pokemongaole.co.kr/html/store.php

일일 데이터 전송량 초과안내

html.gethompy.com


정식 사이트에서 제공을 해주는데 인기 때문인지 전송량 초과.....

서버 관리 안하십니꽈~?

포켓몬 가오레 게임기는 아마도 아무대나 설치해주지는 않나보다.



롯데마트 (토이저러스), 이마트, 홈플러스, 토이플러스 등에 설치되어 있다.

현재 설치된 매장은 233개...

이마트 죽전점은 2개, 이마트 기흥점 1개, 기흥 아울렛 토이저러스? 3개...

아래는 가오레 카페에 있는 링크입니다.

잘 찾아보세용~ 모두 5성 화이팅~

https://cafe.naver.com/pokemonmezastar/17

가오레 전국 설치 매장 정리

변경 사항이나 수정 사항 있으면 댓글로 제보 부탁 드립니다. ^^ 감사합니다.~!

cafe.naver.com

Posted by 블로그하는프로그래머
,

dungbon_macro.py

 

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'dungbon_macro.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1576, 789)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.horizontalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.horizontalLayoutWidget.setGeometry(QtCore.QRect(50, 110, 591, 601))
        self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.search_lst = QtWidgets.QListWidget(self.horizontalLayoutWidget)
        self.search_lst.setObjectName("search_lst")
        self.horizontalLayout.addWidget(self.search_lst)
        self.horizontalLayoutWidget_2 = QtWidgets.QWidget(self.centralwidget)
        self.horizontalLayoutWidget_2.setGeometry(QtCore.QRect(680, 230, 114, 91))
        self.horizontalLayoutWidget_2.setObjectName("horizontalLayoutWidget_2")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_2)
        self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.plus_btn = QtWidgets.QPushButton(self.horizontalLayoutWidget_2)
        self.plus_btn.setObjectName("plus_btn")
        self.horizontalLayout_2.addWidget(self.plus_btn)
        self.horizontalLayoutWidget_3 = QtWidgets.QWidget(self.centralwidget)
        self.horizontalLayoutWidget_3.setGeometry(QtCore.QRect(820, 100, 541, 611))
        self.horizontalLayoutWidget_3.setObjectName("horizontalLayoutWidget_3")
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_3)
        self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.macro_lst = QtWidgets.QListView(self.horizontalLayoutWidget_3)
        self.macro_lst.setObjectName("macro_lst")
        self.horizontalLayout_3.addWidget(self.macro_lst)
        self.horizontalLayoutWidget_4 = QtWidgets.QWidget(self.centralwidget)
        self.horizontalLayoutWidget_4.setGeometry(QtCore.QRect(680, 360, 114, 101))
        self.horizontalLayoutWidget_4.setObjectName("horizontalLayoutWidget_4")
        self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_4)
        self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.minus_btn = QtWidgets.QPushButton(self.horizontalLayoutWidget_4)
        self.minus_btn.setObjectName("minus_btn")
        self.horizontalLayout_4.addWidget(self.minus_btn)
        self.horizontalLayoutWidget_5 = QtWidgets.QWidget(self.centralwidget)
        self.horizontalLayoutWidget_5.setGeometry(QtCore.QRect(1390, 100, 141, 131))
        self.horizontalLayoutWidget_5.setObjectName("horizontalLayoutWidget_5")
        self.horizontalLayout_5 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_5)
        self.horizontalLayout_5.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
        self.macro_start_btn = QtWidgets.QPushButton(self.horizontalLayoutWidget_5)
        self.macro_start_btn.setObjectName("macro_start_btn")
        self.horizontalLayout_5.addWidget(self.macro_start_btn)
        self.splitter = QtWidgets.QSplitter(self.centralwidget)
        self.splitter.setGeometry(QtCore.QRect(50, 30, 322, 34))
        self.splitter.setOrientation(QtCore.Qt.Horizontal)
        self.splitter.setObjectName("splitter")
        self.adress_edt = QtWidgets.QLineEdit(self.splitter)
        self.adress_edt.setObjectName("adress_edt")
        self.search_btn = QtWidgets.QPushButton(self.splitter)
        self.search_btn.setObjectName("search_btn")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1576, 31))
        self.menubar.setObjectName("menubar")
        self.menuNew = QtWidgets.QMenu(self.menubar)
        self.menuNew.setObjectName("menuNew")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.actionFile = QtWidgets.QAction(MainWindow)
        self.actionFile.setObjectName("actionFile")
        self.actionQuit = QtWidgets.QAction(MainWindow)
        self.actionQuit.setObjectName("actionQuit")
        self.menuNew.addAction(self.actionFile)
        self.menuNew.addAction(self.actionQuit)
        self.menubar.addAction(self.menuNew.menuAction())

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.plus_btn.setText(_translate("MainWindow", "->"))
        self.minus_btn.setText(_translate("MainWindow", "<-"))
        self.macro_start_btn.setText(_translate("MainWindow", "메크로 시작"))
        self.search_btn.setText(_translate("MainWindow", "주소 검색"))
        self.menuNew.setTitle(_translate("MainWindow", "New"))
        self.actionFile.setText(_translate("MainWindow", "File"))
        self.actionQuit.setText(_translate("MainWindow", "Quit"))


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_())

 

auto_macro.py

# auto_macro.py

import sys
from PyQt5 import QtWidgets
from dungbon_macro import Ui_MainWindow

# __init__ 메서드를 포함하는 새로운 파이썬 클래스를 생성 한다.
class QuitDesignerGUI():
    # 자체 파이썬 클래스를 생성한다.
    # 일반적인 이니셜라이저 부터 시작 한다.
    # 이니셜라이저 메서드가 끝날 쯤, 이니셜라이저 아래에 만들고 있는 메서드를 호출 했다.
    # 클래스를 인스턴스화만 하면 되었고, 클래스 인스턴스(개체)가 생성된 후,
    # 클래스 인스턴스에서 특정 메서드를 호출 안해도 메서드는 실행 된다.
    def __init__(self):
        app = QtWidgets.QApplication(sys.argv)
        self.MainWindow = QtWidgets.QMainWindow()
        self.ui = Ui_MainWindow()   # 윈도우의 인스턴스를 생성
        self.ui.setupUi(self.MainWindow)
        self.update_widgets()
        self.widget_quit_actions()
        self.widget_button_actions()
        self.MainWindow.show()
        sys.exit(app.exec_())
   
    # 상태바를 업데이트하고 작업을 메뉴 항목에 연결하는 메서드를 만든다.
    # self.ui.actionQuit를 통해 메뉴 항목의 이름에 엑세스 한다.
    # self.ui는 "__init__"메서드에서 기본 윈도우의 인스턴스를 생성해 저장 했기에 사용할 수 있다.
    def widget_quit_actions(self):
        self.ui.actionQuit.setStatusTip(
            '클릭시 윈도우가 종료 됩니다.'
        )
        # triggered.connect(<method name>) 작업이 트리거되는 메뉴 항목의 이벤트에 연결된다.(이는 PyQt5 문법 이다.)

        # 메뉴 quit 클릭시 메서드
        self.ui.actionQuit.triggered.connect(self.close_GUI)

    def widget_button_actions(self):
        self.ui.search_btn.setStatusTip(
            '클릭시 주소를 검색합니다.'
        )
        self.ui.plus_btn.setStatusTip(
            '클릭시 주소를 추가합니다.'
        )
        self.ui.minus_btn.setStatusTip(
            '클릭시 주소를 삭제합니다.'
        )
        self.ui.macro_start_btn.setStatusTip(
            '메크로를 시작합니다.'
        )

        # 주소검색 메서드
        self.ui.search_btn.clicked.connect(self.search_Address)
        # 주소 추가 메서드
        self.ui.plus_btn.clicked.connect(self.plus_Address)
        # 주소 삭제 메서드
        self.ui.minus_btn.clicked.connect(self.minus_Address)
        # 메크로 시작 메서드
        self.ui.macro_start_btn.clicked.connect(self.macro_Start)

    # GUI를 종료하는 콜백 메서드를 작성한다.
    def close_GUI(self):
        self.MainWindow.close()
   
    # 주소를 검색 합니다.
    def search_Address(self):
        self.MainWindow.close()
   
    # 주소를 추가 합니다.
    def plus_Address(self):
        self.MainWindow.close()
   
    # 주소를 삭제 합니다.
    def minus_Address(self):
        self.MainWindow.close()
   
    # 메크로를 시작 합니다.
    def macro_Start(self):
        self.MainWindow.close()
   
    # GUI 타이틀을 업데이트하는 클래스 메서드를 작성한다.
    def update_widgets(self):
        self.MainWindow.setWindowTitle('PyQt5 GUI')

# __main__ 섹션을 사용해 클래스 인스턴스를 만든다. 이것이 GUI를 실행하기 위해 해야 한다.
if __name__ == "__main__":
    QuitDesignerGUI()
Posted by 블로그하는프로그래머
,

이번 장에서는 pyqt 레이아웃, 텍스트레이아웃, 버튼을 살펴 보도록 하겠습니다.

tkinter 라이브러리에서 제공하는 라벨등을 배치 시키는 공간 위젯이라고 생각 하면 될 듯하다.

위치를 지정하여 UI를 디자인 하는 방법으로 많이 사용 됩니다.

자 그럼 시작해 볼까용~

4장에서 까지 생성한 .ui를 새로운이름으로 저장 합니다.

designer_test.ui -> designer_test_layout.ui

왼쪽 위젯 상자에서 Layouts 에서 가로 레이아웃을 끌어 

 

tab1 위에 2개의 가로 레이아웃을 끌어다 놓습니다.

.ui 를 .py로 변환 합니다.

pyuic5 -x -o designer_test_layouts.py designer_test_layouts.ui

4장에서 만든 .py 파일의 import 파일을 "designer_test_layouts" 로 수정 하여 실행 해 봅니다.

# designer_test_modular_quit.py

import sys
from PyQt5 import QtWidgets
from designer_test_layouts import Ui_MainWindow

# __init__ 메서드를 포함하는 새로운 파이썬 클래스를 생성 한다.
class QuitDesignerGUI():
    # 자체 파이썬 클래스를 생성한다.
    # 일반적인 이니셜라이저 부터 시작 한다.
    # 이니셜라이저 메서드가 끝날 쯤, 이니셜라이저 아래에 만들고 있는 메서드를 호출 했다.
    # 클래스를 인스턴스화만 하면 되었고, 클래스 인스턴스(개체)가 생성된 후,
    # 클래스 인스턴스에서 특정 메서드를 호출 안해도 메서드는 실행 된다.
    def __init__(self):
        app = QtWidgets.QApplication(sys.argv)
        self.MainWindow = QtWidgets.QMainWindow()
        self.ui = Ui_MainWindow()   # 윈도우의 인스턴스를 생성
        self.ui.setupUi(self.MainWindow)
        self.update_widgets()
        self.widget_actions()
        self.MainWindow.show()
        sys.exit(app.exec_())
   
    # 상태바를 업데이트하고 작업을 메뉴 항목에 연결하는 메서드를 만든다.
    # self.ui.actionQuit를 통해 메뉴 항목의 이름에 엑세스 한다.
    # self.ui는 "__init__"메서드에서 기본 윈도우의 인스턴스를 생성해 저장 했기에 사용할 수 있다.
    def widget_actions(self):
        self.ui.actionQuit.setStatusTip(
            '클릭시 윈도우가 종료 됩니다.'
        )
        # triggered.connect(<method name>) 작업이 트리거되는 메뉴 항목의 이벤트에 연결된다.(이는 PyQt5 문법 이다.)

        self.ui.actionQuit.triggered.connect(self.close_GUI)

    # GUI를 종료하는 콜백 메서드를 작성한다.
    def close_GUI(self):
        self.MainWindow.close()
   
    # GUI 타이틀을 업데이트하는 클래스 메서드를 작성한다.
    def update_widgets(self):
        self.MainWindow.setWindowTitle('PyQt5 GUI')

# __main__ 섹션을 사용해 클래스 인스턴스를 만든다. 이것이 GUI를 실행하기 위해 해야 한다.
if __name__ == "__main__":
    QuitDesignerGUI()
designer_test_layouts
designer_test_layouts

정상 작동 확인 합니다.

다음으로 버튼 추가와 텍스트 라벨 추가하는 법을 확인해 보겠습니다.

PushButton을 아래쪽 레이아웃에 드래그앤 드랍 합니다.

designer_test_layouts"

designer_test_layouts.ui -> designer_test_button.ui 로 새로운 이름으로 저장 합니다.

라벨을 위쪽 레이아웃에 추가 합니다.

pushbutton과 label을 연결 합니다.

연결하는 방법은 F4키를 눌러 signals/slots 편집모드로 들어가거나 Designer내의 Edit 메뉴를 사용 하면 됩니다.

F4누르고 PushButton 누른상태에서 드레그 하여 TextLabel에서 드랍 합니다.

그러면 연결설정 창이 팝업 화면으로 나오게 됩니다.

PushButton에서 clicked() 를 선택  Label에서는 clear()를 선택 합니다.

확인 버튼 클릭하여 윈도우를 보게 되면 빨강생 이벤트 들이 보이게 됩니다.

.ui -> .py 로 변경 합니다.

pyuic5 -x -o designer_test_button.py designer_test_button.ui

designer_test_modular_button.py 파일을 만들어서 실행해 봅니다.

# designer_test_modular_button.py

import sys
from PyQt5 import QtWidgets
from designer_test_button import Ui_MainWindow

# __init__ 메서드를 포함하는 새로운 파이썬 클래스를 생성 한다.
class QuitDesignerGUI():
    # 자체 파이썬 클래스를 생성한다.
    # 일반적인 이니셜라이저 부터 시작 한다.
    # 이니셜라이저 메서드가 끝날 쯤, 이니셜라이저 아래에 만들고 있는 메서드를 호출 했다.
    # 클래스를 인스턴스화만 하면 되었고, 클래스 인스턴스(개체)가 생성된 후,
    # 클래스 인스턴스에서 특정 메서드를 호출 안해도 메서드는 실행 된다.
    def __init__(self):
        app = QtWidgets.QApplication(sys.argv)
        self.MainWindow = QtWidgets.QMainWindow()
        self.ui = Ui_MainWindow()   # 윈도우의 인스턴스를 생성
        self.ui.setupUi(self.MainWindow)
        self.update_widgets()
        self.widget_actions()
        self.MainWindow.show()
        sys.exit(app.exec_())
   
    # 상태바를 업데이트하고 작업을 메뉴 항목에 연결하는 메서드를 만든다.
    # self.ui.actionQuit를 통해 메뉴 항목의 이름에 엑세스 한다.
    # self.ui는 "__init__"메서드에서 기본 윈도우의 인스턴스를 생성해 저장 했기에 사용할 수 있다.
    def widget_actions(self):
        self.ui.actionQuit.setStatusTip(
            '클릭시 윈도우가 종료 됩니다.'
        )
        # triggered.connect(<method name>) 작업이 트리거되는 메뉴 항목의 이벤트에 연결된다.(이는 PyQt5 문법 이다.)

        self.ui.actionQuit.triggered.connect(self.close_GUI)

    # GUI를 종료하는 콜백 메서드를 작성한다.
    def close_GUI(self):
        self.MainWindow.close()
   
    # GUI 타이틀을 업데이트하는 클래스 메서드를 작성한다.
    def update_widgets(self):
        self.MainWindow.setWindowTitle('PyQt5 GUI')

# __main__ 섹션을 사용해 클래스 인스턴스를 만든다. 이것이 GUI를 실행하기 위해 해야 한다.
if __name__ == "__main__":
    QuitDesignerGUI()

실행을 해보면 TextLabel이 PushButton 을 클릭 했을때,

clear 되는것을 확인 할 수 있습니다.

Posted by 블로그하는프로그래머
,