이번 장에서는 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 블로그하는프로그래머
,

이전 3장에서는 Designer를 사용하여 파이썬 GUI 프로그램 디자인을 하는 방법을 살펴보았습니다.

3장 : https://blp1209.tistory.com/102

이번장에서는 만들어진 py 파일을 참조하여 모듈식으로 GUI 디자인 만드는 방법을 살펴보겠습니다.

designer_test_modular.py를 아래와 같이 만듭니다.

3장에서 만든 designer_test를 import 하여 Ui_MainWindow 클래스를 사용할 수 있게 합니다.

# designer_test_modular.py

from PyQt5 import QtWidgets
from designer_test import Ui_MainWindow

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

메뉴바 추가를 해보도록 하겠습니다.

New 메뉴 하단에 Quit 메뉴를 추가합니다.

파일을 저장하고. ui ->. py로 변경합니다.

pyuic5 -x -o designer_test.py designer_test.ui

모듈 형태의 새로운. py 파일을 생성합니다.

이름은 임의로 designer_test_modular_quit.py로 생성했습니다.

아래 코드는 메뉴에서 quit 메뉴를 클릭하면 창이 종료되는 내용입니다.

quit 메뉴에 마우스 오버가 되었을 때 상태창에서는 "클릭 시 윈도가 종료됩니다."로 표시가 됩니다.

 

# designer_test_modular_quit.py

import sys
from PyQt5 import QtWidgets
from designer_test 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()

 

탭 위젯을 추가하여 사용하는 방법을 알아보겠습니다.

디자이너에서 탭 위젯을 추가하고 다른 이름으로 저장을 합니다.

탭 위젯은 왼쪽 "위젯 상자"에서 "Containers" 탭에 "Tab Widget"을 선택하여 

드래그엔 드롭으로 윈도 창에 놓아둔 다음 크기를 잘 조절해 주면 됩니다.

다른이른으로 저장을 하여 "designer_test_tab. ui" 으로 저장을 합니다.

.ui ->. py로 변환을 합니다.

pyuic5 -x -o designer_test_tab.py designer_test_tab.ui

기존 코드에서 변경된. py 파일을 import 하고 실행해 보자.

# designer_test_modular_quit.py

import sys
from PyQt5 import QtWidgets
from designer_test_tab 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()

탭이 생성되었고 같은 윈도에서 tab으로 구분 지어 화면을 달리 사용할 수 있게 되었다.

이것으로 4장을 마치고 5장에서 뵙도록 하겠습니다.

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

pyqt5를 사용해서 gui 프로그램을 사용하는 것을 1, 2장에서 간단하게 확인하였다.

대망의 pyqt-tools 즉 designer를 사용하는 방법을 3장에서 확인해 보자.

pyqt5를 사용하는 목적이기도 한 designer는 gui 프로그램을 조금 더 쉽게 사용할 수 있는 툴입니다.

설치 방법 등은 1장에서 확인할 수 있습니다.

정독해 보세요.

https://blp1209.tistory.com/100 (1장)

 

파이썬 ui 프로그래밍 실습 feat. PyQT5, PyQT-tools(designer) 1장

파이썬으로 개발을 하다보니 윈도우나 os 의 GUI 에서 프로그래밍 하는거에 재미가 들려 공부를 해보았다. 그 내용을 포스팅 해보고 자 한다. 준비 tool : - VS CODE(개발 편집프로그램) - python 3.9 이하

blp1209.tistory.com

 

2장 https://blp1209.tistory.com/101

 

보통 vscode 터미널 창이나 windows CMD 창 등에서 designer라고 치면 프로그램이 실행이 되지만 환경변수가 잘 설정이 안 되어 있다면 아래 방법처럼 확인해 실행해 봅시다.

터미널에서 designer 실행

 

cmd 창에서 실행한 화면

설치 파일 찾아서 실행하는 방법

일반적으로는 C:\Users 아래에 자신의 폴더에 python 이 설치가 되어 있어서 이 디렉터리에서 designer.exe 프로그램을 찾아서 실행하면 됩니다.

아나콘다는 설치경로에서 확인

실행된 화면

드디어 디자이너에서 만든 폼으로 python 프로그램을 어떻게 하는지 확인해 보자.

"새 폼 - Qt Designer" 창에서 "Main Window"을 선택 하여 아무것도 없는 창을 생성 합니다.

 

 

생성 버튼 클릭하면 화면 처럼 창이 하나 생성 됩니다.

생성된 윈도우를 살펴보면 왼쪽 도구에 "위젯 상자" 윈도우 화면에 드레그앤 드랍으로 위젯을 배치 할 수 있습니다.

오른쪽에는 Object Inspector 가 위치해 있으며, 이곳에는 QMainWindow, QWidget, QMenuBar, QStatusBar 의 네 가지 클래스가 있다.

이전 장에서 메뉴, 상태 표시줄을 수동으로 생성 하였지만, Designer 도구에서 이 기능들을 자동으로 추가해 준다.

오른쪽 중간에 위치한 속성 편집기에서 중앙 위젯 개체의 지오메트리 속성을 볼 수 있다.

이것은 QWidget이며 전체 기본 윈도우의 중앙 부분이다.

메뉴바와 상태바는 각각 중앙 폼 위와 아래에 있다.

지오메트리 속성 값은 기본적으로 640 * 480으로 설정되며, 이는 코드를 그대로 실행할 때 GUI의 결과 크기가 된다.

저장을 하고 미리보기를 해본다.

폼 >미리보기 (Ctrl +  R)

메뉴바를 수정하고 .ui > .py 로 변경 해 보자.

"여기에 입력하세요" 부분에 "File" 를 입력하고 하부에 "New"를 입력 하고 저장을 한다.

디자이너에서 파일을 저장 합니다.

파일이름은 임의로 designer_test.ui 로 저장 합니다.

저장한 위치에서 명령어를 실행 합니다.

pyuic5 -x -o designer_test.py designer_test.ui

-x : 결과 Python 모듈을 실행 가능하게 합니다.

-o : 출력 파일의 이름을 지정 합니다.

pyuic5 유틸리티는 둘 이상의 .ui 파일을 하나의 .py 파일로 변환하는 기능을 제공 하기에 참고 하기 바란다.

파일 생성 확인 합니다.

변환된 디자이너 코드를 확인해 봅시다.

상단 내용에서는 인코딩내용과, pyqt5 버전, ui 파일이 어떤 파일이었는지 등을 확인 할 수 있습니다.

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

# Form implementation generated from reading ui file 'designer_test.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.

import 문을 확인 해 보자

QtCore, QtGui, QtWidgets 을 참조하는 것을 확인 할 수 있다. 

from PyQt5 import QtCore, QtGui, QtWidgets

생성된 첫 번째 메서드를 보자

setupUi 가 MainWindow를 참조 하는 것을 확인 합니다.

setupUi메서드에 포함된 코드는 생성된 이름을 통해 클래스 속성에 엑세스 할 수 있기 때문에 매우 중요합니다.

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(640, 480)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 640, 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.menuNew.addAction(self.actionFile)
        self.menubar.addAction(self.menuNew.menuAction())

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

두번째 메서드를 확인해 보자.

UI 디자인 단계에서 추가한 메뉴와 메뉴 항목 이름을 확인할 수 있습니다.

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.menuNew.setTitle(_translate("MainWindow", "New"))
        self.actionFile.setText(_translate("MainWindow", "File"))

 

마지막 _main__ 섹션을 살펴 보자.

pyuic5 변환중, -x 옵션 지정을 통해서 자동으로 생성되는 코드 입니다.

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

코드를 실행해 보면 윈도우가 실행 되는것을 볼 수 있습니다.

이 장에서는 Designer 에서 윈도우를 디자인 하고 Python 파일로 변환하여 실행하는 것까지 확인을 했습니다.

다음 장에서는 조금더 심화하여 접근해 보도록 하겠습니다.

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

파이썬 ui 프로그래밍 실습 1장에서 작성한 코드를 객체지향 코드로 변경을 해보도록 하겠습니다.

1장 링크 : https://blp1209.tistory.com/100

 

파이썬 ui 프로그래밍 실습 feat. PyQT5, PyQT-tools(designer) 1장

파이썬으로 개발을 하다보니 윈도우나 os 의 GUI 에서 프로그래밍 하는거에 재미가 들려 공부를 해보았다. 그 내용을 포스팅 해보고 자 한다. 준비 tool : - VS CODE(개발 편집프로그램) - python 3.9 이하

blp1209.tistory.com

 

1장의 내용을 객체지향 코드로 전환 하면 아래와 같이 변경이 가능 합니다.

#pyqt5_example_re.py

# 명령행 인수를 GUI에 전달할 수 있도록 sys를 import 한다.
import sys  
# PyQt5 패키지에서 QtWidgets 모듈에 있는 QApplication 및 QWidget 클래스를 import 한다.
from PyQt5.QtWidgets import QApplication, QWidget  

# QWidget을 상속하는 클래스를 만든다.
class GUI(QWidget):
    def __init__(self) :
        super().__init__()
        # 윈도우를 생성하고 슈퍼클래스를 초기화 한다.
        self.initUI()

    def initUI(self):
        # 타이틀을 변경 합니다.
        self.setWindowTitle('PyQt5 GUI')

# 셀프 테스팅 코드를 추가 한다.
if __name__ == '__main__':
    # 추가 명령행 이수를 전달할 수 있도록 sys.argv로 전달해 QApplication 클래스의 인스턴스를 생성 한다.
    # 이 인스턴스를 app 변수에 저장 한다.
    # 이렇게 하면 애플리케이션이 만들어 진다.
    app = QApplication(sys.argv)
    # QWidget 클래스의 인스턴스를 만들고 GUI가 된다.
    # 이 인스턴스를 gui라는 로컬 변수에 저장 한다.
    gui = GUI()

    # GUI를 볼 수 있도록 gui 클래스 인스턴스의 show 메서드를 호출한다.
    gui.show()
    # 어블리케이션 클래스 인스턴스에서 exec_ 메서드를 호출해 애플리케이션을 실행한다.
    # 발생할 수 있는 예외 사항을 파악하기 위해 호출을 sys.exit 내에 래핑 한다.
    # 에외가 발생하면 파이썬 애플리 케이션이 정상적으로 종료 되고 충돌하지 않는다.
    sys.exit(app.exec_())

 

 

추가로 QMainWindow 상속을 해 보겠습니다.

이전 소스와 다른 내용은 QWidget을 import 하지 않고 QMainWindow 를 import하여 크기 조정 한 창을 출력 할 수 있다.

#pyqt5_example_re.py

# 명령행 인수를 GUI에 전달할 수 있도록 sys를 import 한다.
import sys  
# PyQt5 패키지에서 QtWidgets 모듈에 있는 QApplication 및 QMainWindow 클래스를 import 한다.
from PyQt5.QtWidgets import QApplication, QMainWindow

# QMainWindow을 상속하는 클래스를 만든다.
class GUI(QMainWindow):
    def __init__(self) :
        super().__init__()
        # 윈도우를 생성하고 슈퍼클래스를 초기화 한다.
        self.initUI()

    def initUI(self):
        # 타이틀을 변경 합니다.
        self.setWindowTitle('PyQt5 GUI')
        self.resize(400, 300)

# 셀프 테스팅 코드를 추가 한다.
if __name__ == '__main__':
    # 추가 명령행 이수를 전달할 수 있도록 sys.argv로 전달해 QApplication 클래스의 인스턴스를 생성 한다.
    # 이 인스턴스를 app 변수에 저장 한다.
    # 이렇게 하면 애플리케이션이 만들어 진다.
    app = QApplication(sys.argv)
    # QWidget 클래스의 인스턴스를 만들고 GUI가 된다.
    # 이 인스턴스를 gui라는 로컬 변수에 저장 한다.
    gui = GUI()

    # GUI를 볼 수 있도록 gui 클래스 인스턴스의 show 메서드를 호출한다.
    gui.show()
    # 어블리케이션 클래스 인스턴스에서 exec_ 메서드를 호출해 애플리케이션을 실행한다.
    # 발생할 수 있는 예외 사항을 파악하기 위해 호출을 sys.exit 내에 래핑 한다.
    # 에외가 발생하면 파이썬 애플리 케이션이 정상적으로 종료 되고 충돌하지 않는다.
    sys.exit(app.exec_())

 

상태창 위젯을 추가해 보자.

소스에서 상태창을 추가하는 할수를 정의 하고 호출 하면 왼쪽 하단에 상태창이 이전과 다르게 발생 한다.

#pyqt5_example_re.py

# 명령행 인수를 GUI에 전달할 수 있도록 sys를 import 한다.
import sys  
# PyQt5 패키지에서 QtWidgets 모듈에 있는 QApplication 및 QMainWindow 클래스를 import 한다.
from PyQt5.QtWidgets import QApplication, QMainWindow

# QMainWindow을 상속하는 클래스를 만든다.
class GUI(QMainWindow):
    def __init__(self) :
        super().__init__()
        # 윈도우를 생성하고 슈퍼클래스를 초기화 한다.
        self.initUI()

    def initUI(self):
        # 타이틀을 변경 합니다.
        self.setWindowTitle('PyQt5 GUI')
        self.resize(400, 300)
        self.add_widgets()  # 상태창 호출

    # 상태창 위젯을 호출 하는 함수 정의
    def add_widgets(self):
        self.statusBar().showMessage('Text in statusbar')

# 셀프 테스팅 코드를 추가 한다.
if __name__ == '__main__':
    # 추가 명령행 이수를 전달할 수 있도록 sys.argv로 전달해 QApplication 클래스의 인스턴스를 생성 한다.
    # 이 인스턴스를 app 변수에 저장 한다.
    # 이렇게 하면 애플리케이션이 만들어 진다.
    app = QApplication(sys.argv)
    # QWidget 클래스의 인스턴스를 만들고 GUI가 된다.
    # 이 인스턴스를 gui라는 로컬 변수에 저장 한다.
    gui = GUI()

    # GUI를 볼 수 있도록 gui 클래스 인스턴스의 show 메서드를 호출한다.
    gui.show()
    # 어블리케이션 클래스 인스턴스에서 exec_ 메서드를 호출해 애플리케이션을 실행한다.
    # 발생할 수 있는 예외 사항을 파악하기 위해 호출을 sys.exit 내에 래핑 한다.
    # 에외가 발생하면 파이썬 애플리 케이션이 정상적으로 종료 되고 충돌하지 않는다.
    sys.exit(app.exec_())

메뉴바를 추가해 보자

QAction 을 새로 import 하고, 새로 생성 했던 add_widgets 함수에 메뉴바를 추가하는 코딩을 추가 하였다.
작성 하고 실행 하면 메뉴바가 생성 된 것을 확인 할 수 있다.
메뉴 모음의 인스턴스를 만든 후 addMenu 메서드를 사용해 메뉴를 반들었다.
QAction 클래스를 사용해 메뉴 항목ㅇㄹ 생성 한 다음 addAction 메서드를 사용해 이 메뉴 항목을 메뉴에 추가했고,
new_action 변수를 사용해 setStatusTip을 호출 했다.
File > New 를 클릭, 하면 상태바에 New File 이 보일 것 이다.
 
#pyqt5_example_re.py

# 명령행 인수를 GUI에 전달할 수 있도록 sys를 import 한다.
import sys  
# PyQt5 패키지에서 QtWidgets 모듈에 있는 QApplication 및 QMainWindow 클래스를 import 한다.
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction

# QMainWindow을 상속하는 클래스를 만든다.
class GUI(QMainWindow):
    def __init__(self) :
        super().__init__()
        # 윈도우를 생성하고 슈퍼클래스를 초기화 한다.
        self.initUI()

    def initUI(self):
        # 타이틀을 변경 합니다.
        self.setWindowTitle('PyQt5 GUI')
        self.resize(400, 300)
        self.add_widgets()  # 상태창 호출

    # 상태창 위젯을 호출 하는 함수 정의
    def add_widgets(self):
        self.statusBar().showMessage('Text in statusbar')
        menubar = self.menuBar()
        file_menu = menubar.addMenu('File')

        new_action = QAction('New', self)
        file_menu.addAction(new_action)
        new_action.setStatusTip('New File')

# 셀프 테스팅 코드를 추가 한다.
if __name__ == '__main__':
    # 추가 명령행 이수를 전달할 수 있도록 sys.argv로 전달해 QApplication 클래스의 인스턴스를 생성 한다.
    # 이 인스턴스를 app 변수에 저장 한다.
    # 이렇게 하면 애플리케이션이 만들어 진다.
    app = QApplication(sys.argv)
    # QWidget 클래스의 인스턴스를 만들고 GUI가 된다.
    # 이 인스턴스를 gui라는 로컬 변수에 저장 한다.
    gui = GUI()

    # GUI를 볼 수 있도록 gui 클래스 인스턴스의 show 메서드를 호출한다.
    gui.show()
    # 어블리케이션 클래스 인스턴스에서 exec_ 메서드를 호출해 애플리케이션을 실행한다.
    # 발생할 수 있는 예외 사항을 파악하기 위해 호출을 sys.exit 내에 래핑 한다.
    # 에외가 발생하면 파이썬 애플리 케이션이 정상적으로 종료 되고 충돌하지 않는다.
    sys.exit(app.exec_())

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

파이썬으로 개발을 하다보니 윈도우나 os 의 GUI 에서 프로그래밍 하는거에 재미가 들려 공부를 해보았다.

그 내용을 포스팅 해보고 자 한다.

준비 tool :

- VS CODE(개발 편집프로그램)

- python 3.9 이하 버전 3.10 부터는 2022-01-27 기준 지원이 안됩니다.

    - https://www.python.org/downloads/

 

Download Python

The official home of the Python Programming Language

www.python.org

- pyqt5 설치 

    - pip install pyqt5

- pyqt5-tools 설치

   - pip install pyqt5-tools

 

위에 내용을 전부 설치 했다면 vscode 에서 터미널을 열고 버전과 설치 확인을 합니다.

vscode 터미널 여는 단축키 : ctrl + shift + `

명령어 : python --version

pyqt5, pyqt5-tools 설치 확인

명령어 : pip list (pip 설치된 리스트 출력 한다.)

 

간단한 화면 출력 프로그램밍을 해봅니다.

#pyqt5_example.py

# 명령행 인수를 GUI에 전달할 수 있도록 sys를 import 한다.
import sys  
# PyQt5 패키지에서 QtWidgets 모듈에 있는 QApplication 및 QWidget 클래스를 import 한다.
from PyQt5.QtWidgets import QApplication, QWidget  

# 추가 명령행 이수를 전달할 수 있도록 sys.argv로 전달해 QApplication 클래스의 인스턴스를 생성 한다.
# 이 인스턴스를 app 변수에 저장 한다.
# 이렇게 하면 애플리케이션이 만들어 진다.
app = QApplication(sys.argv)
# QWidget 클래스의 인스턴스를 만들고 GUI가 된다.
# 이 인스턴스를 gui라는 로컬 변수에 저장 한다.
gui = QWidget()
# GUI를 볼 수 있도록 gui 클래스 인스턴스의 show 메서드를 호출한다.
gui.show()
# 어블리케이션 클래스 인스턴스에서 exec_ 메서드를 호출해 애플리케이션을 실행한다.
# 발생할 수 있는 예외 사항을 파악하기 위해 호출을 sys.exit 내에 래핑 한다.
# 에외가 발생하면 파이썬 애플리 케이션이 정상적으로 종료 되고 충돌하지 않는다.
sys.exit(app.exec())
 

 

타이틀을 변경 해 봅니다.

코드 중간에 gui.setWindowTitle('PyQt5 GUI'코드를 추가 하여 gui 의 타이틀을 변경 합니다.

#pyqt5_example.py

# 명령행 인수를 GUI에 전달할 수 있도록 sys를 import 한다.
import sys  
# PyQt5 패키지에서 QtWidgets 모듈에 있는 QApplication 및 QWidget 클래스를 import 한다.
from PyQt5.QtWidgets import QApplication, QWidget  

# 추가 명령행 이수를 전달할 수 있도록 sys.argv로 전달해 QApplication 클래스의 인스턴스를 생성 한다.
# 이 인스턴스를 app 변수에 저장 한다.
# 이렇게 하면 애플리케이션이 만들어 진다.
app = QApplication(sys.argv)
# QWidget 클래스의 인스턴스를 만들고 GUI가 된다.
# 이 인스턴스를 gui라는 로컬 변수에 저장 한다.
gui = QWidget()

# 타이틀을 변경 합니다.
gui.setWindowTitle('PyQt5 GUI')

# GUI를 볼 수 있도록 gui 클래스 인스턴스의 show 메서드를 호출한다.
gui.show()
# 어블리케이션 클래스 인스턴스에서 exec_ 메서드를 호출해 애플리케이션을 실행한다.
# 발생할 수 있는 예외 사항을 파악하기 위해 호출을 sys.exit 내에 래핑 한다.
# 에외가 발생하면 파이썬 애플리 케이션이 정상적으로 종료 되고 충돌하지 않는다.
sys.exit(app.exec())
 

2장에서는 객체지향 코드로 변경 해 보도록 하겠습니다.

파이썬 ui 프로그래밍 실습 feat. PyQT5, PyQT-tools(designer)

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

파이썬에서 셀레니움을 사용하는 방법 2번째 

전 시간에는 파이썬에서 셀레니움의 라이브러리를 불러와 드라이브를 호출 하여 네이버를 연결하는 작동법 까지 포스팅을 해 봤습니다.

이전 포스팅은 이 포스팅 제일 아래 링크를 연결해 두겠습니다.

이번 포스팅 에서는 검색어를 입력 후 조회 된 페이지를 크롤링 하여 필요한 데이터를 수집하여 데이터화 하는 방법을 구현해 보도록 하겠습니다.

대신 한정적으로 "VIEW" 탭의 첫 페이지만 크롤링 해 보도록 하겠습니다.

수집된 데이터는 엑셀 파일로 데이터 화가 되게 할 것이고, 검색할 단어와 수집할 단어는

검색어 : "나이키"

수집할 단어 : "트레비스스캇"

조회를 하게 코딩 해 봅니다.

1. 네이버 메일 화면에서 검색 어 입력하는 input 박스의 name 또는 id 를 확인 합니다.

1-1. 네이버 웹사이트 화면에서 F12 를 눌러 개발자 툴을 엽니다.

개발자 툴에서 왼쪽 편에 보면 아래오 같은 아이콘이 생성이 되고 화면에서 검색어 창을 선택 할 수 있게 된다.

마우스 클릭을 하게 되면 검생어 입력 input 의 정보를 개발자 툴에서 보여 준다.

 

id는 query 

name 은 query 

둘다 같습니다.

이제 셀레니움에서 이 input에 "나이키" 를 입력 하게 합니다.

import selenium
from selenium import webdriver
from selenium.webdriver import ActionChains

from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait

#접속 url
#검색어
SEARCHWORD = "나이키"
#찾을 단어
MACHINGWORD = "트레비스스캇"

driver = webdriver.Firefox(executable_path='C:\dev\python\geckodriver.exe')
#driver = webdriver.Chrome(executable_path='C:\dev\python\chromedriver.exe')

#네이버로 이동
driver.get(url=URL)

#사이트이름 매칭 확인
assert "NAVER" in driver.title

#input id = query, name = query -> "나이키 입력"
#searchName = driver.find_element_by_id("query")
searchName = driver.find_element_by_xpath("//*[@id='query']")
searchName.send_keys(SEARCHWORD)
searchName.submit()

 

위에 프로그램을 실행 하게 되면 아래 처럼 나이키를 검색 하게 됩니다.

 

이제 VIEW탭으로 이동을 해서 조회된 첫 페이지 대상들을 변수에 담아 보겠습니다.

뷰 탭으로 이동 할때는 xpath 를이용한 이동을 해보도록 하겠습니다.

어려운거 없이 개발자 도구에서 view 탭의 xpath를 복사해서 셀레니움에 복사한 xpath 를 넣어 주기만 하면 이동이 됩니다.

 

초록생경로가 xpath 경로 입니다.

#view 탭으로 이동 한다.
driver.implicitly_wait(100)
viewChage = driver.find_element_by_xpath("/html/body/div[3]/div[1]/div/div[2]/div[1]/div/ul/li[2]/a")
print(viewChage.text)
viewChage.click()

자 이제 view 탭의 첫 페이지 리스트 대상을 변수에 입력해 보겠습니다.

view 탭은 sc_new sp_nreview _au_view_tab _svp_list _prs_rvw 이란 큰 클래스에 각 포스팅들이 나열이 되어 있습니다.

그 아래로 list 클래스로 묶인 포스팅 리스트가 있습니다.

그 아래로 _more_contents_event_base 클랙스

ul 테그 lst_total _list_base 클래스

제일 중요한 li 테그의 bx _svp_item 클래스 의 data-cr-rank 속성들이 1부터 증가를 하는 것으로 확인이 됩니다.

1페이지당 30포스팅 까지 발생을 하고 추가적으로 발생되는건 + 30건씩 조회가 되는 것을 확인 했습니다.

그러면 반복문을 1부터 30까지 발생시켜 해당 url을 추출 하고 이동하여 테스트를 추출 합니다.

텍스트를 추출 하는 건 beautifulsoup 를 이용하여 진행 합니다.

웹상의 택스트를 정형화 하여 추출 하는것을 도와 주는 모듈 입니다.

pip install beautifulsoup4

url 접속을 도와주는 requests 모듈도 설치 한다.

pip install requests

 

전체 소스 코드는 아래와 같습니다.

카페, 블로그, 포스트 로 이루어진 VIEW 탭은 각기 별로 분기처리하는 로직이 필요하여 소스가 지저분해져 있습니다.

정형화 하고 함수로 정의 하는 부분은 나중에 정리해서 따로 포스팅 하도록 하겠습니다.

from cgitb import text
import selenium
from selenium import webdriver
from selenium.webdriver import ActionChains

from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait

from time import sleep
from bs4 import BeautifulSoup
from urllib.parse import quote
import requests
import time


#접속 url
URL_TMP = ''
#검색어
SEARCHWORD = "나이키"
#찾을 단어
MACHINGWORD = "버블검"
# 조회 한 페이지의 피드 리스트 저장할 리스트 선언
POSTINGLIST = list()

# 저장할 파일
f = open('C:/dev/test.txt', 'w', encoding='utf-8')

driver = webdriver.Firefox(executable_path='C:\dev\python\geckodriver.exe')
#driver = webdriver.Chrome(executable_path='C:\dev\python\chromedriver.exe')

driver.set_window_position(0, 0)
driver.set_window_size(100, 1000)

#네이버로 이동
driver.get(url=URL)

#사이트이름 매칭 확인
assert "NAVER" in driver.title

#input id = query, name = query -> "나이키 입력"
#searchName = driver.find_element_by_id("query")
searchName = driver.find_element_by_xpath("//*[@id='query']")
searchName.send_keys(SEARCHWORD)
searchName.submit()

#view 탭으로 이동 한다.
driver.implicitly_wait(100)
viewChage = driver.find_element_by_xpath("/html/body/div[3]/div[1]/div/div[2]/div[1]/div/ul/li[2]/a")
print(viewChage.text)
viewChage.click()

#반복
# 첫페이지에서 조회된 대상을 변수에 저장한다.
# 첫 페이지 대상은 1부터 30까지의 대상이다.
# 20210117 기준 xpath 는 /html/body/div[3]/div[2]/div/div[1]/section/div/div[2]/panel-list/div/more-contents/div/ul/li[1]/div[1]/div/a
# 여기서 li의 [n]번 값이 증가 한다.
#for n in range(1, 31):
for n in range(1, 31):
    pth_tmp = "/html/body/div[3]/div[2]/div/div[1]/section/div/div[2]/panel-list/div/more-contents/div/ul/li[{0}]/div[1]/div/a".format(n)
    #print(pth_tmp)
    POSTINGLIST.append(pth_tmp)

print("-"*50)

for i in POSTINGLIST:
    driver.switch_to.window(driver.window_handles[0])
    postSearch = driver.find_element_by_xpath(i)    # 1~30까지 포스팅 페이지를 담는다.
    print(postSearch.get_attribute("href"))
    URL_TMP = postSearch.get_attribute("href")
    postSearch.click()                              # 이동한다.
    driver.implicitly_wait(100)                     # 로딩될때까지 대기
   
    webpage = requests.get(postSearch.get_attribute("href"))
    soup = BeautifulSoup(webpage.content, "html.parser")

    print("-"*50)

    #url이 블로그일 경우
    if "blog.naver" in postSearch.get_attribute("href"):
        print("블로그")
        print("https://blog.naver.com" + soup.iframe["src"])

        webpage = requests.get("https://blog.naver.com" + soup.iframe["src"])
        print("encoding = " + webpage.encoding)
        webpage.encoding = 'UTF-8'
        soup = BeautifulSoup(webpage.content, "html.parser")

        if soup.find("div", attrs={"class":"se-main-container"}):
            text = soup.find("div", attrs={"class":"se-main-container"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("블로그")
            print(text)
        elif soup.find("p", attrs={"class":"se_textarea"}):
            text = soup.find("p", attrs={"class":"se_textarea"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("블로그")
            print(text)
        elif soup.find("div", attrs={"class":"ArticleContentBox"}):
            text = soup.find("div", attrs={"class":"ArticleContentBox"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("블로그")
            print(text)
        elif soup.find("div", attrs={"id":"postViewArea"}):
            text = soup.find("div", attrs={"id":"postViewArea"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("블로그")
            print(text)
        else:
            print("블로그 확인불가")
            text = soup
            f.write('블로그\n')
            f.write("https://blog.naver.com" + soup.iframe["src"] + '\n')
            f.write(str(text))
            f.write('\n')

    #url이 post일 경우
    elif "post.naver" in postSearch.get_attribute("href"):
        print("포스트")
        #print(soup)
        print(postSearch.get_attribute("href"))
       
        webpage = requests.get(postSearch.get_attribute("href"))
        print("encoding = " + webpage.encoding)
        soup = BeautifulSoup(webpage.content, "html.parser", from_encoding='ANSI')
       
        f.write("포스트11111111111111111111111\n")
        f.write(postSearch.get_attribute("href") + "\n")
        f.write(str(webpage.encoding))
        f.write('\n')
        f.write("포스트22222222222222222222222\n")

        if soup.find("div", attrs={"class":"se-main-container"}):
            text = soup.find("div", attrs={"class":"se-main-container"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("포스트1")
            print(text)
        elif soup.find("p", attrs={"class":"se_textarea"}):
            text = soup.find("p", attrs={"class":"se_textarea"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("포스트2")
            print(text)
        elif soup.find("div", attrs={"class":"ArticleContentBox"}):
            text = soup.find("div", attrs={"class":"ArticleContentBox"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("포스트3")
            print(text)
        elif soup.find("div", attrs={"id":"postViewArea"}):
            text = soup.find("div", attrs={"id":"postViewArea"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("포스트4")
            print(text)
        elif soup.find("div", attrs={"class":"se_component_wrap"}):
            text = soup.find("div", attrs={"class":"se_component_wrap"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("포스트5")
            print(text)
       
        elif soup.find("div", attrs={"id":"cont"}):
            text = soup.find("div", attrs={"id":"cont"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("포스트6")
            print(text)
        else:
            print("포스트 전체 조회")
            text = soup
            print(text)
            f.write("포스트 확인불가\n")
            f.write(postSearch.get_attribute("href") + "\n")
            f.write(str(text))
            f.write('\n')

    #url이 cafe일 경우
    elif "cafe.naver" in postSearch.get_attribute("href"):
        print("카페")
        #print(soup)

        #탭이동
        driver.switch_to.window(driver.window_handles[1])

        print("tap1 이동 완료")
        #print(driver.page_source)
        #f.write("11111111111111111111111111111카페\n")
        #f.write(driver.page_source + "\n")
        #f.write('\n')

        print("cafe_main 로딩시작")
        #cafe_main 로딩 완료 대기
        #driver.implicitly_wait(10)
        time.sleep(10)
        print("cafe_main 로딩완료")

        driver.switch_to.frame("cafe_main")          # cafe_main iframe으로 이동
        print("cafe_main frame 이동")
        #print(driver.page_source)
        #f.write("22222222222222222222222222222카페\n")
        #f.write(driver.page_source + "\n")
        #f.write('\n')
       
        driver.implicitly_wait(1)          
        req_tmp = driver.page_source
        print("페이지 확인")
        #print(driver.page_source)
        #f.write("33333333333333333333333333카페\n")
        #f.write(driver.page_source + "\n")
        #f.write('\n')

        soup = BeautifulSoup(req_tmp, "html.parser", from_encoding='ANSI')
        #print(soup)
       
        #webpage = requests.get(postSearch.get_attribute("href"))
        #print("encoding = " + webpage.encoding)
       
        #soup = BeautifulSoup(webpage.content, "html.parser", from_encoding='ANSI')

        if soup.find("div", attrs={"class":"se-main-container"}):
            text = soup.find("div", attrs={"class":"se-main-container"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("카페1")
            print(text)
        elif soup.find("p", attrs={"class":"se_textarea"}):
            text = soup.find("p", attrs={"class":"se_textarea"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("카페2")
            print(text)
        elif soup.find("div", attrs={"class":"ArticleContentBox"}):
            text = soup.find("div", attrs={"class":"ArticleContentBox"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("카페3")
            print(text)
        elif soup.find("div", attrs={"id":"postViewArea"}):
            text = soup.find("div", attrs={"id":"postViewArea"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("카페4")
            print(text)
        elif soup.find("div", attrs={"class":"se-component-content"}):
            text = soup.find("div", attrs={"class":"se-component-content"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("카페5")
            print(text)
        else:
            print("카페 확인불가")
            text = soup
            f.write("카페\n")
            f.write(postSearch.get_attribute("href") + "\n")
            f.write(str(text))
            f.write('\n')
   
    if MACHINGWORD in text:
        print("Found word " + MACHINGWORD)
        #print(postSearch.get_attribute("href"))
        driver.implicitly_wait(100)                     # 로딩될때까지 대기
        driver.switch_to.window(driver.window_handles[1])
        driver.close()
       
    else:
        print("Not Found word " + MACHINGWORD)
        #print(postSearch.get_attribute("href"))
        driver.implicitly_wait(100)                     # 로딩될때까지 대기
        driver.switch_to.window(driver.window_handles[1])
        driver.close()
       

    print("-"*50)

driver.quit()
f.close()

# 리스트의 url n번째 로 이동 하여 "트레비스스캇" 단어를 찾는다.
# 단어가 일치하는 대상이 있다면 변수에 url 을 담는다.
# 단어가 일치하면 count 를 한다.
# 다시 view 탭으로 이동한다.

파이썬 셀레니움 사용법 1

 

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

Phython Selenium 사용법 정리해 봅니다.

 

셀레니움 설치 명령어 실행 cmd 창에서 해도 되고 vscode의 Ctrl + Shift + ` 를 눌러서 터미널에서 실행해도 됩니다.

pip install selenium

 

 

셀레니움을 사용하려면 자신이 사용할 브라우저의 드라이브가 필요하다.

크롬

https://sites.google.com/a/chromium.org/chromedriver/downloads

 

Downloads - ChromeDriver - WebDriver for Chrome

WebDriver for Chrome

sites.google.com

파이어폭스

https://github.com/mozilla/geckodriver/releases

 

 

Releases · mozilla/geckodriver

WebDriver for Firefox. Contribute to mozilla/geckodriver development by creating an account on GitHub.

github.com

엣지

https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

 

Microsoft Edge Driver - Microsoft Edge Developer

canary Channel Daily release of our latest features and fixes. Version: 99.0.1135.0: x86 | x64 | ARM64

developer.microsoft.com

사파리

https://webkit.org/blog/6900/webdriver-support-in-safari-10/

 

WebDriver Support in Safari 10

Starting with Safari 10 on OS X El Capitan and macOS Sierra, Safari comes bundled with a WebDriver implementation that's maintained by the Web Developer Experience team at Apple.

webkit.org

 

이주 한 브라우저를 선택하고 버전도 자신이 필요로 하는 버전을 선택하여 프로그램에 응용을 합니다.

여기서 예제로 사용한 드라이브는 파이어폭스 0.30.0을 선택 하여 예제를 작성했습니다.

아래 대상을 다운로드합니다.

geckodriver-v0.30.0-win64.zip

https://github.com/mozilla/geckodriver/releases/download/v0.30.0/geckodriver-v0.30.0-win64.zip

필요한 라이브러리 Import 처리합니다.

import selenium
from selenium import webdriver
from selenium.webdriver import ActionChains

from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait

 

다운로드한 드라이브와 파이썬 파일을 아래 디렉터리를 생성하여 저장합니다.

C:\dev\python

위에 Import 한 대상을 "naver_search_my_word_count.py" 로 저장합니다.

드라이브를 지정하고 원하는 페이지를 오픈하도록 코딩합니다.

import selenium
from selenium import webdriver
from selenium.webdriver import ActionChains

from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait


driver = webdriver.Firefox(executable_path='C:\dev\python\geckodriver.exe')
#driver = webdriver.Chrome(executable_path='C:\dev\python\chromedriver.exe')
driver.get(url=URL)
 

프로그램을 실행하면 네이버 페이지로 이동하는 것을 알 수 있습니다.

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