반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

GUI(Graphical User Interface) 애플리케이션을 개발할 때, Python의 기본 GUI 라이브러리인 Tkinter를 많이 사용합니다. 하지만 Tkinter의 기본 스타일은 오래되어 모던한 디자인을 적용하기 어렵습니다. 이를 보완하기 위해 등장한 것이 CustomTkinter입니다!

 

CustomTkinter는 Tkinter를 기반으로 하면서도 더 세련된 디자인과 다크 모드 지원, 커스텀 스타일 적용이 가능한 강력한 GUI 라이브러리입니다. 특히, 기본적으로 반응형 UI 요소를 제공하여 더욱 깔끔하고 현대적인 인터페이스를 구현할 수 있습니다.

 

이 글에서는 지난 글에서 다루었던 CustomTkinter 기초에 이어서 CustomTkinter의 다양한 위젯을 소개하고, 각 위젯을 어떻게 사용할 수 있는지 코드 예제와 함께 설명해 보겠습니다.

 

아래는 CustomTkinter에서 제공하는 주요 위젯들을 한 번에 보여주는 코드입니다. 이 후 각 위젯을 개별적으로 설명하겠습니다.

 

[코드]

import customtkinter as ctk

# CustomTkinter 설정
ctk.set_appearance_mode("Dark")
ctk.set_default_color_theme("blue")

# 메인 윈도우 생성
root = ctk.CTk()
root.geometry("600x800")
root.title("CustomTkinter 위젯 예제")

# Switch 위젯 (모드 토글)
def toggle_mode():
    if ctk.get_appearance_mode() == "Dark":
        ctk.set_appearance_mode("Light")

    else:
        ctk.set_appearance_mode("Dark")

mode_toggle = ctk.CTkSwitch(root, text="모드 변경", command=toggle_mode)
mode_toggle.pack(pady=10, anchor="se", padx=10)

# Entry 위젯
entry = ctk.CTkEntry(root, placeholder_text="이름을 입력하세요")
entry.pack(pady=10)

# Slider 위젯 (라벨 위젯으로 슬라이더 값 표시)
label = ctk.CTkLabel(root, text="슬라이더 값: ")
label.pack(pady=10)

def slider_event(value):
    label.configure(text=f"슬라이더 값: {int(value)}")

slider = ctk.CTkSlider(root, from_=0, to=100, command=slider_event)
slider.pack(pady=10)

# CheckBox 위젯
checkbox = ctk.CTkCheckBox(root, text="동의합니다")
checkbox.pack(pady=10)

# RadioButton 위젯
radio_var = ctk.StringVar(value="옵션1")
radiobutton1 = ctk.CTkRadioButton(root, text="옵션 1", variable=radio_var, value="옵션1")
radiobutton2 = ctk.CTkRadioButton(root, text="옵션 2", variable=radio_var, value="옵션2")
radiobutton1.pack()
radiobutton2.pack()

# ComboBox 위젯
combobox = ctk.CTkComboBox(root, values=["선택 1", "선택 2", "선택 3"])
combobox.pack(pady=10)

# ProgressBar 위젯
progressbar = ctk.CTkProgressBar(root)
progressbar.pack(pady=10)
progressbar.set(0.5)  # 50% 진행 상태

# TabView 위젯
tabview = ctk.CTkTabview(root)
tabview.pack(pady=10)

# 탭 추가
tab1 = tabview.add("탭 1")
tab2 = tabview.add("탭 2")

# 각 탭에 내용 추가
ctk.CTkLabel(tab1, text="탭 1의 내용입니다").pack(pady=10)
ctk.CTkLabel(tab2, text="탭 2의 내용입니다").pack(pady=10) 

# ScrollableFrame 위젯
scrollable_frame = ctk.CTkScrollableFrame(root, width=300, height=150)
scrollable_frame.pack(pady=10)
for i in range(10):
    ctk.CTkLabel(scrollable_frame, text=f"항목 {i+1}").pack()

# 실행
root.mainloop()

 

[결과]


 

1. Switch 위젯

전환 가능한 스위치 버튼으로, ON/OFF 상태를 가집니다. CTkSwitch( ) 클래스를 이용해서 추가 가능하며, 이 스위치를 조작했을 때, 다크/라이트 모드가 변경되도록 함수를 정의하고 스위치 클래스와 연결해 보았습니다.

 

참고로 스위치는 pack( ) 메소드의 anchor 파라미터를 "e"로 설정해서 우측에 위치하도록 하였습니다.

 

  • "n": north (위) / "s": south (아래) / "e": east (오른쪽) / "w": west (왼쪽)  --> 조합도 가능 (ex. "ne")

[코드]

 

 

 

 

 

 

 

 

 

 

# Switch 위젯 (모드 토글)
def toggle_mode():
    if ctk.get_appearance_mode() == "Dark":
        ctk.set_appearance_mode("Light")

    else:
        ctk.set_appearance_mode("Dark")

mode_toggle = ctk.CTkSwitch(root, text="모드 변경", command=toggle_mode)
mode_toggle.pack(pady=10, anchor="ne", padx=10)

 

[결과]

 

2. Entry 위젯

Entry 위젯은 사용자가 텍스트를 입력할 수 있는 입력 필드입니다. Entry라는 용어가 익숙하지 않으신 분들은 Input 위젯이라고 생각하시면 되겠습니다. 이번 시간에는 입력 받은 값을 어떻게 사용하는지는 다루지 않고 이런 위젯이 있다는 것만 언급하고 넘어가도록 하겠습니다.

 

[코드]

entry = ctk.CTkEntry(root, placeholder_text="이름을 입력하세요")
entry.pack(pady=10)

 

[결과]

 

3. Slider 위젯

사용자가 드래그하여 값을 조정할 수 있는 슬라이더입니다. 슬라이더가 조정될 때 변하는 값을 관찰하기 위해서 지난 시간에 배웠던 Label 위젯을 먼저 추가해주었습니다. slider_event 함수는 CTkSlider의 값을 받아서 그 값을 포함한 Label을 출력해주도록 정의하였습니다.

 

CTkSlider는 "from_" 과 "to" 파라미터로 시작과 끝 값을 지정해주며, command 파라미터의 인자로 위에서 정의한 slider_event 함수를 입력해주었습니다.

 

여기서 slider_event의 파라미터인 value는 어떻게 입력되는지 잘 이해가 되지 않아서 찾아보니, 슬라이더의 현재 값이 자동으로 command 파라미터로 지정된 함수(slider_event)로 입력된다고 합니다.

 

[코드]

# Slider 위젯 (라벨 위젯으로 슬라이더 값 표시)
label = ctk.CTkLabel(root, text="슬라이더 값: ")
label.pack(pady=10)

def slider_event(value):
    label.configure(text=f"슬라이더 값: {int(value)}")

slider = ctk.CTkSlider(root, from_=0, to=100, command=slider_event)
slider.pack(pady=10)

 

[결과]

 

4. CheckBox 위젯

사용자가 체크할 수 있는 체크박스입니다. 체크 박스 옆의 메시지를 "text" 파라미터로 설정할 수 있습니다.

 

[코드]

checkbox = ctk.CTkCheckBox(root, text="동의합니다")
checkbox.pack(pady=10)

 

[결과]

 

 

 

5. RadioButton 위젯

여러 개의 옵션 중 하나를 선택할 수 있는 버튼입니다. radio_var이란 변수를 설정해주고, 그 값을 CTkRadioButton( )의 variable 파라미터의 인자로 넣어주는 이유는 옵션을 선택했을 때 그 옵션의 "value"를 저장하기 위함입니다. 이 값을 다른 코드에서 입력으로 받아서 사용할 수 있도록 말입니다. 참고로 value는 문자열이 아니라 숫자도 가능합니다.

 

[코드]

radio_var = ctk.StringVar(value="옵션1")
radiobutton1 = ctk.CTkRadioButton(root, text="옵션 1", variable=radio_var, value="옵션1")
radiobutton2 = ctk.CTkRadioButton(root, text="옵션 2", variable=radio_var, value="옵션2")
radiobutton1.pack()
radiobutton2.pack()

 

[결과]

 

6. ComboBox 위젯

드롭다운 목록을 통해 값을 선택할 수 있는 콤보박스입니다. values 파라미터에 선택지를 리스트 타입으로 입력합니다.

 

[코드]

combobox = ctk.CTkComboBox(root, values=["선택 1", "선택 2", "선택 3"])
combobox.pack(pady=10)

 

[결과]

 

7. ProgressBar 위젯

진행 상태를 표시하는 프로그레스 바입니다. 프로그레스 바는 무언가 진행되는 정도를 보여주기 위한 위젯이기 때문에 해당 위젯 이외에 프로그레스 바의 수치를 10초간 10%씩 증가시키는 update_progress( ) 함수와 해당 함수를 실행하기 위한 버튼을 추가해주었습니다.

 

여기서 조금 어려운 포인트는 lambda 함수를 사용해 준 부분입니다. 여기서 lambda 함수를 써준 이유는 버튼 한 번의 클릭으로 두 가지 기능을 수행하기 위함입니다. progressbar.set(0)로 프로그레스 바의 값을 0으로 초기화 해준 다음 update_progress( ) 함수를 수행하게 됩니다.

 

[코드]

# ProgressBar 위젯
progressbar = ctk.CTkProgressBar(root)
progressbar.pack(pady=10)
progressbar.set(0)  # 초기값 0%

def update_progress():
    current_value = progressbar.get()
    if current_value < 1.0:
        progressbar.set(current_value + 0.1)  # 10% 증가
        root.after(1000, update_progress)  # 1초 후 다시 실행

# 실행 버튼
start_button = ctk.CTkButton(root, text="실행", command=lambda: [progressbar.set(0), update_progress()])
start_button.pack(pady=10)

 

[결과]

 

8. TabView 위젯

여러 개의 탭을 포함하여 다양한 화면을 제공하는 위젯입니다. 먼저 CTkTabview( ) 클래스로 TabView 위젯을 하나 생성합니다. 메인 윈도우창인 root만 인자로 입력 받네요. 바로 이어서 방금 생성한 tabview 객체에 add( ) 메소드를 활용하여 "탭 1"과 "탭 2"를 생성해줍니다.

 

여기까지가 TabView 위젯을 생성하는 것이고, 다음 코드는 생성한 탭 안에 라벨 위젯을 넣는 코드입니다. 익숙한 코드인데 조금 다른 점은 pack( ) 메소드를 곧바로 붙여서 작성했다는 것과, 첫번째 인자를 root가 아니라 tab1과 tab2로 입력해주었다는 것입니다.

 

[코드]

# TabView 위젯
tabview = ctk.CTkTabview(root)
tabview.pack(pady=10)

# 탭 추가
tab1 = tabview.add("탭 1")
tab2 = tabview.add("탭 2")

# 각 탭에 내용 추가
ctk.CTkLabel(tab1, text="탭 1의 내용입니다").pack(pady=10)
ctk.CTkLabel(tab2, text="탭 2의 내용입니다").pack(pady=10)

 

[결과]

 

9. ScrollableFrame 위젯

스크롤 가능한 프레임으로, 많은 항목을 표시할 때 유용합니다. CTkScrollableFrame( ) 클래스는 width와 height 파라미터에 정수형 자료를 입력해서 크기를 조절할 수 있습니다. 그리고 그 안에 내용을 넣을 때는 위에서 탭에 내용을 추가 했을 때 처럼 Label 위젯의 첫번째 인자를 root가 아닌 방금 생성한 scrollable_frame 객체로 해주면 됩니다.

 

[코드]

scrollable_frame = ctk.CTkScrollableFrame(root, width=300, height=150)
scrollable_frame.pack(pady=10)
for i in range(10):
    ctk.CTkLabel(scrollable_frame, text=f"항목 {i+1}").pack()

 

[결과]


이번 글에서는 CustomTkinter의 다양한 위젯들을 살펴보며 각각의 기능과 사용법을 익혔습니다. 이제 기본적인 위젯 사용법을 이해했으니, 다음 글에서는 간단한 프로젝트를 통해 실제로 GUI 프로그램을 어떻게 활용할 수 있는지 알아보겠습니다. CustomTkinter를 사용하여 실용적인 애플리케이션을 만들고, 이를 통해 GUI 개발의 흐름과 응용 방법을 배워보도록 하겠습니다.

 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

이번 시간에는 우리가 .py 파일에 작성한 코드를 GUI(Graphical User Interface)를 기반으로 사용자 입력을 받아서 실행시킬 수 있는 방법에 대해서 알아보겠습니다.

 

예전 글에서는 PyQT에 대해서 주로 다루었습니다. 하지만 PyQT의 경우 기능이 많고 예쁜 GUI를 만들 수 있다는 장점이 있는 반면 라이브러리가 무거워서 불필요하게 프로그램 사이즈가 커지는 경우가 자주 발생했습니다. 비유를 들자면 아주 간단한 과자를 주문했는데 그걸 포장한 박스가 아주 비싸고 화려하고 무거운 느낌이랄까요?

 

그래서 이번 시간에는 파이썬에서 기본적으로 제공하지만 너무 못 생겨서 잘 사용하지 않는 Tkinter를 쓸만 할 정도로 예쁘게 만든 CustomTkinter에 대해서 알아보겠습니다.


1. CustomTkinter란?

CustomTkinter는 Tkinter의 확장 버전으로, 보다 현대적인 UI 디자인을 쉽게 적용할 수 있도록 만들어진 GUI 라이브러리입니다. 기존 Tkinter의 제한적인 디자인을 보완하며, 다크 모드 및 다양한 색상 테마를 지원합니다.

이 글에서는 CustomTkinter의 주요 기능, 장점과 단점, 그리고 간단한 사용법을 소개합니다.


2. CustomTkinter의 장점과 단점

[장점]

1) 모던한 UI 디자인: 기존 Tkinter보다 세련된 스타일을 제공하며, 기본적으로 다크 모드를 지원합니다.

2) Tkinter와의 높은 호환성: 기존 Tkinter 코드와 호환되며, 추가적인 스타일링 기능을 제공합니다.

3) 간단한 코드 작성: 보다 직관적인 API를 제공하여 코드 작성을 단순화합니다.

4) 다크 모드 및 테마 지원: 애플리케이션의 전체적인 색상 테마를 쉽게 조정할 수 있습니다.

5) 크로스 플랫폼 지원: Windows, Mac, Linux에서 원활하게 작동합니다.

[단점]

1) Tkinter의 한계를 가짐: Tkinter 기반이므로 PyQt나 PySide 같은 고급 GUI 프레임워크보다는 기능이 제한적입니다.

2) 커뮤니티 자료가 적음: 비교적 새로운 라이브러리라 CustomTkinter에 대한 예제나 문서가 많지 않습니다.


3. CustomTkinter 설치

터미널(또는 명령 프롬프트)에서 아래 명령어를 실행하세요.

pip install customtkinter

 


4. CustomTkinter 간단한 사용법

CustomTkinter는 Tkinter와 유사하지만 보다 현대적인 UI 디자인을 쉽게 적용할 수 있습니다. 이번 시간에는 아주 간단히 CustomTkinter 창을 띄우고 라벨과 버튼 하나씩을 창에 추가하는 코드로 CustomTkinter와 친해져보는 시간을 가져보겠습니다.

 

[코드]

import customtkinter as ctk

# 1) 기본 설정
ctk.set_appearance_mode("Light")  # 창 모드 설정 (System, Light, Dark)
ctk.set_default_color_theme("blue")  # UI 테마 설정 (blue, dark-blue, green)

# 2) 메인 윈도우 생성
root = ctk.CTk()
root.geometry("400x300")
root.title("CustomTkinter 예제")

# 3) 라벨 추가
label = ctk.CTkLabel(root, text="Hello, CustomTkinter!", font=("Arial", 20))
label.pack(pady=20)

# 4) 버튼 추가
def on_click():
    label.configure(text="버튼이 클릭됨!")

button = ctk.CTkButton(root, text="클릭하세요", command=on_click)
button.pack(pady=10)

# 5) 실행
root.mainloop()

 

1) 기본 설정

[코드]

# 기본 설정
ctk.set_appearance_mode("Dark")  # 다크 모드 설정 (System, Light, Dark)
ctk.set_default_color_theme("green")  # 테마 설정 (blue, dark-blue, green)

 

CustomTkinter는 3가지 창 모드와 3가지 UI 색상 테마를 설정할 수 있습니다.

 

창 모드는 set_appearance_mode( ) 클래스로 설정 가능하며, "System", "Light", "Dark" 모드를 괄호 안에 넣어서 설정 가능합니다. 여기서 "System" 모드는 사용자의 운영체제(OS) 설정에 따라서 자동으로 다크 또는 라이트 모드가 적용되는 모드입니다.

 

컬러 테마는 버튼 혹은 슬라이드, 체크 박스 등의 색상을 결정하는 옵션입니다. "blue", "dark-blue", "green" 모드를 괄호 안에 넣어서 설정 가능합니다. 개인적인 취향이지만 저는 "green"은 별로라서 안쓸 것 같네요.

 

[결과]

 

2) 메인 윈도우 생성

[코드]

# 메인 윈도우 생성
root = ctk.CTk()
root.geometry("400x300")
root.title("CustomTkinter 예제")

 

메인 윈도우 생성은 CTk( ) 클래스를 이용합니다. 보통 GUI 프로그래밍을 할 때, 관례적으로 메인창을 나타내는 변수명은 'root'로 지어줍니다.

 

창 크기는 geometry( ) 메소드의 괄호 안에 "가로x세로"를 입력함으로써 설정 가능하며, 창의 타이틀은 title( ) 메소드의 괄호 안에 "원하는 타이틀"을 문자열로 입력함으로써 설정 가능합니다.

 

3) 라벨 추가

[코드]

# 라벨 추가
label = ctk.CTkLabel(root, text="Hello, CustomTkinter!", font=("Arial", 20))
label.pack(pady=20) # pady: 위아래 여백

 

간단히 텍스트를 추가하는 코드입니다.  GUI 프로그래밍에서는 창 존재하는 텍스트를 "Label"이라고 부르는 편입니다. CTkLabel( ) 클래스를 이용하며 괄호 안에 들어가는 이번 시간에는 3가지만 알아보겠습니다.

 

버튼, 라벨 등의 위젯(Widget) 관련 클래스는 모두 가장 처음 root를 입력 받습니다. 가장 기본이 되는 규칙이니 기억해주세요. 다음은 라벨의 내용을 text 파라미터에 문자열로 입력해주었으며, 폰트의 글꼴과 사이즈를 튜플 형태로 입력해주었습니다.

 

pack( ) 메소드의 pady 파라미터를 통해서 텍스트의 위아래 여백도 넣어주었습니다. pack 메소드는 위젯을 창에 배치하는 역할로 넣어주지 않으면 안되는 코드입니다. 항상 어떤 위젯이든지 넣어준다고 생각하면 되겠습니다.

 

이 외에도 폰트 색상, 텍스트 배경 색상, 텍스트 상자의 크기, 그에 따른 자동 줄바꿈 설정까지 존재하지만, 아마도 이 CustomTkinter를 사용하는 이유가 심플하게 GUI를 구현하는 것이라서 큰 의미는 없을 것이라 생각되네요.

 

4) 버튼 추가

[코드]

# 버튼 추가
def on_click():
    label.configure(text="버튼이 클릭됨!")

button = ctk.CTkButton(root, text="클릭하세요", command=on_click)
button.pack(pady=10)

 

버튼을 추가하기 전에, 버튼을 눌렀을 때 실행되기 원하는 함수를 정의해주어야 합니다. on_click( )이라는 함수를 정의해주었고 그 기능은 위에서 만들어 주었던 label의 텍스트를 "버튼이 클릭됨!"으로 수정해주는 것입니다.

 

함수를 정의해주었으니 이제 버튼을 추가해보겠습니다. 버튼 추가 역시 라벨을 추가했을 때와 거의 동일합니다. CTkButton( ) 클래스로 추가해주며, 필수 요소인 root를 첫번째 인자로 넣어주고 그 다음 버튼을 나타낼 텍스트, 버튼을 눌렀을 때 실행될 함수명을 입력해줍니다. 마지막으로는 라벨 때와 마찬가지로 pack( )을 메소드로 버튼을 창에 배치해줍니다.

 

버튼을 클릭하니까 위에 있던 라벨이 "버튼이 클릭됨!"으로 변경된 것이 보이시나요?

 

[결과]

 

5) 버튼 추가

[코드]

# 실행
root.mainloop()

 

매우 간단하지만 코드지만 이 코드 한줄이 없으면 GUI 창이 열렸다가 바로 꺼질 정도로 필수적인 코드입니다. 참고로 mainloop()는 GUI 프로그램이 실행되는 동안 계속 동작하면서 사용자의 입력(클릭, 키보드 입력 등)을 감지하고 처리하는 역할을 합니다.


5. CustomTkinter 위젯 종류들

CustomTkinter에는 위에서 소개드린 위젯 (라벨, 버튼) 외에 여러가지 위젯들이 존재합니다. 이러한 위젯들을 활용하면 프로그램 실행에 필요한 변수들을 사용자가 쉽게 조정 가능하죠. 추가적인 위젯들에 대한 내용은 다음 글에서 소개드리도록 하겠습니다.

CustomTkinter 위젯들

 


오늘 준비한 내용은 여기까지입니다. 다음에도 코딩유치원을 찾아주세요~

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

2022.03.11 - [파이썬 패키지/라이브러리&패키지 소개] - 파이썬 주요 라이브러리 정리

 

 

 

 

 

 


1.  요상한 클래스명이란?

 

최근 들어 아래와 같은 길고 빈칸이 많은 클래스 명을 사용해서 웹사이트를 구현하는 곳이 많아졌습니다. 저는 Web 개발자가 아니다 보니 도대체 어쩌다가 이런 요상한 클래스명을 사용하는지 궁금해져서 ChatGPT에게 물어봤습니다.

 

 

답변 받은 내용을 요약하자면 다음과 같습니다.

 

1. 이러한 CSS 선택자 방식을 "유틸리티 클래스" 또는 "유틸리티 퍼스트 CSS"라고 합니다. 이는 주로 Tailwind CSS 프레임워크에서 사용되는 접근 방식입니다. (참고로 CSS란 웹페이지를 꾸며주는 문법을 뜻합니다.)

 

2. 이러한 방식을 웹사이트 개발자가 사용하는 이유는 클래스 이름이 직관적이며 HTML 요소에 직접 스타일을 적용할 수 있어 빠른 개발이 가능하기 때문이라고 합니다. 또한 반응형 디자인과 테마 변경 등에 유연하게 대응할 수 있다고 합니다. 한마디로 웹사이트 개발자가 웹 프로그래밍 할 때 편한 방식이라 이해하시면 될 것 같습니다

 

3. 이 방식은 CSS 작성 시간을 줄이고 일관된 디자인을 유지하는 데 도움이 되지만, HTML이 다소 복잡해 보일 수 있다는 단점도 있습니다.

 

2.  유틸리티 퍼스트 CSS가 웹크롤링 할 때 까다로운 이유

안타깝게도 "유틸리스 클래스" 방식의 웹 사이트는 제가 지금까지 블로그나 책을 통해서 알려드린 방법으로 웹크롤링하기가 매우 까다롭습니다.

 

이유는 많지만 딱하나만 꼽아도 충분할 것 같습니다. 그 이유는 바로 띄어쓰기가 많다는 것입니다.

 

아래와 같이 class name이나 id에 가끔 띄어쓰기가 존재하는 경우에는 빈칸 대신 . (dot)을 입력해 주어야 합니다. 모를 때는 정말 고생하는 내용이고 알더라도 위에서 보신 클래스명과 같은 경우는 모든 빈칸들을 .으로 변경해줘야하기 때문에 매우 번거롭습니다.

driver.find_element(By.CLASS_NAME, "thumb.api_get")

 

 

 

3.  XPATH를 이용한 CLASS_NAME 인덱싱

그럼 기존 방식과 새로 알려드릴 방식을 비교하며 설명드려 보겠습니다. 자세히 보시면 " "로 쌓여진 클래스명에는 7개의 띄어쓰기가 존재합니다. 기존 방식으로는 이 띄어쓰기를 하나씩 찾아서 .으로 바꿔줘야 하죠.

 

[크롤링할 HTML 요소]

<a class="btn_pgnext inline-block h-[38px] w-[37px] bg-[url(https://common.jobplanet.co.kr/images/common/global_spt.png)] bg-[-96px_0] bg-no-repeat hover:bg-[-96px_-48px]" href=""><span class="sr-only">Next</span></a>

 

[기존 방식]

driver.find_element(By.CLASS_NAME, "btn_pgnext.inline-block.h-[38px].w-[37px].bg-[url(https://common.jobplanet.co.kr/images/common/global_spt.png)].bg-[-96px_0].bg-no-repeat.hover:bg-[-96px_-48px]"

 

[BY.XPATH 방식]

driver.find_element(By.XPATH, "//*[@class='btn_pgnext inline-block h-[38px] w-[37px] bg-[url(https://common.jobplanet.co.kr/images/common/global_spt.png)] bg-[-96px_0] bg-no-repeat hover:bg-[-96px_-48px]']")

 

하지만 driver.find_element(By.XPATH, "//*[@class='btn_pgnext inline-block h-[38px] w-[37px] bg-[url(https://common.jobplanet.co.kr/images/common/global_spt.png)] bg-[-96px_0] bg-no-repeat hover:bg-[-96px_-48px]']") 와 같이 붉은색으로 표시된 부분에 클래스명을 그대로 붙여넣어 주기만 하면 띄어쓰기에 대한 고민 없이 웹 크롤링이 가능합니다.

 


 

이외에도 XPATH를 활용해서 HTML 요소를 찾는 방법들을  최근 알게되었는데 이 부분은 다음 시간에 더 자세히 다루어보도록 하겠습니다.

 

오늘 준비한 내용은 여기까지입니다. 오늘도 코딩유치원을 찾아주셔서 감사합니다.

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 어느 독자분의 질문에 답해드리기 위해서 글을 써보려 합니다.

 

질문의 핵심은 다음과 같았습니다.

 

파이썬으로 PDF 파일을 읽어서 검색으로 특정 문자를 찾고 그 문제에 대해 형광펜으로 강조하고 싶은데, 어떻게 해야할지 몰라 문의드립니다.

 

자 그럼 이 문제를 해결하기 위해서 함께 방법을 알아보겠습니다.

 

 


1. PyMuPDF란?

 

PyMuPDF는 Python용 PDF 처리 라이브러리로, PDF 파일의 생성, 수정, 추출, 텍스트 검색, 이미지 추출 등 다양한 작업을 수행할 수 있습니다. 챗GPT에게 물어보니 제가 항상 사용하던 PyPDF2 보다 더  빠른 속도와 더 많은 기능을 제공하며, 특히 큰 규모의 PDF 파일에 대해서도 효율적으로 작동하는 패키지라고 하네요.

 

패키지 설치는 터미널에 아래의 코드를 입력 후 엔터를 눌러주시면 진행 됩니다.

pip install pymupdf

 

아래와 같은 메시지가 출력되면 설치가 정상적으로 완료된거예요. 

 

2. 형광펜으로 특정 문자 강조하기

 

새롭게 알게 된 PyMuPDF의 전체적인 기능에 대해서는 차차 알아가는 걸로 하고, 오늘은 바로 독자분의 궁금증을 해결해보도록 하겠습니다. 전체적인 코드는 아래와 같습니다.

 

주석을 자세하게 달아 두었으니 코드의 흐름만 간단히 써보겠습니다.

 

1) PyMuPDF 패키지 import (불러올 때는 fitz라는 이름으로 불러옴에 주의!)

2) 불러올 pdf 경로, 저장할 경로, 검색할 텍스트 변수에 입력

3) 앞서 정의한 함수(higlight_text_in_pdf)에 인자 입력하여 함수 실행

4) 함수 내부 동작

    - 강조하고 싶은 PDF 불러오기

    - 전체 페이지 각각 가져오면서 텍스트 검색

    - 검색 텍스트와 일치된 텍스트 강조 (색상은 R, G, B 순이며 1,1,0은 노란색, 0,1,0은 초록색)

    - 저장 후 닫기

 

# PyMuPDF 패키지 불러오기
import fitz  

# 함수 정의
def highlight_text_in_pdf(input_pdf_path, output_pdf_path, search_text):

    # PDF 파일 열기
    pdf_document = fitz.open(input_pdf_path)

    # PDF의 각 페이지를 순회하며
    for page_number in range(len(pdf_document)):
        # 페이지 가져오기
        page = pdf_document.load_page(page_number)

        # 페이지에서 텍스트 검색
        matches = page.search_for(search_text)

        # 각 일치 항목을 강조
        for match in matches:
            # 일치 항목의 사각형 좌표 가져오기
            highlight = page.add_highlight_annot(match)

            # 강조의 색상 설정 (예: 노란색)
            highlight.set_colors({"stroke": (1, 1, 0), "fill": (1, 1, 0)})

    # 수정된 PDF 저장
    pdf_document.save(output_pdf_path)
    pdf_document.close()

# 사용 예시
input_pdf_path = "input.pdf"  # 입력 PDF 파일 경로
output_pdf_path = "output.pdf"  # 출력 PDF 파일 경로
search_text = "검색할_텍스트"  # 검색하고자 하는 텍스트

# 함수 실행
highlight_text_in_pdf(input_pdf_path, output_pdf_path, search_text)

 

[실행 결과] _ 보유하고 있던 PDF 문서에서 '빅데이터'만 노란색 형광펜 표시

 


 

오늘 준비한 내용은 여기까지 입니다. 오늘 배운 PyMuPDF를 이용해 텍스트나 이미지도 추출 가능하다고 하니 빨리 공부해서 포스팅 해보도록 하겠습니다.

 

감사합니다.

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

2022.03.11 - [파이썬 패키지/라이브러리&패키지 소개] - 파이썬 주요 라이브러리 정리


업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

이번 시간에는 qrcode와 segno 패키지로 qrcode를 생성하는 방법을 공부해보겠습니다.

 

두 패키지를 모두 학습하는 이유는 qrcode는 png, jpeg, bmp 등의 이미지 형식의 확장자로만 qrcode가 저장되며, 여러 옵션을 선택할 수 있지만 SVG 형태로 저장이 불가능하기 때문입니다. 확대 시에도 이미지가 깨지지 않는 SVG 확장자로 저장하기 위해서는 segno 패키지를 사용하여야 합니다.

 

두 패키지 모두 사용법이 정말 간단하니 아주 쉽게 업무에 적용하실 수 있을거예요!


1. qrcode 라이브러리

 

1) 설치

 

 설치는 pip install qrcode 명령을 cmd 창 혹은 주피터노트북 창에 입력하시면 됩니다.

pip install qrcode

 

 

2) 초간단 사용법

 

 사용법은 매우 간단합니다. 아래의 코드가 qrcode 라이브러리의 거의 전부거든요.

import qrcode

# 데이터 생성
data = "https://www.example.com"
qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.constants.ERROR_CORRECT_L,
    box_size=10,
    border=4,
)

# 데이터 추가
qr.add_data(data)
qr.make(fit=True)

# QR 코드 이미지 생성
img = qr.make_image(fill='black', back_color='white')

# 이미지 파일로 저장
img.save("example_qr.png")

  

보시면 다양한 옵션이 있는데 이 옵션들이 무엇을 의미하는지 하나씩 설명드리겠습니다.

 

[version]

QR 코드의 버전을 지정합니다. 값은 1에서 40 사이여야 하며, 숫자가 높을수록 QR 코드의 크기가 커지고 더 많은 데이터를 저장할 수 있습니다.


[error_correction]

 QR 코드의 오류 보정 수준을 설정합니다. 즉 QR 코드가 더럽혀지거나 손상되었을 때도 원하는 url 페이지로 이동할 수 있게 해주는 수준에 대한 옵션입니다. 다음 네 가지 수준 중 하나를 선택할 수 있습니다.


ERROR_CORRECT_L: 약 7%의 오류를 복구
ERROR_CORRECT_M (기본값): 약 15%의 오류를 복구
ERROR_CORRECT_Q: 약 25%의 오류를 복구
ERROR_CORRECT_H: 약 30%의 오류를 복구

 

참고로 오류 복구 수준이 높아질 수록 Data Size가 커진다고 하지만 제가 테스트 해보니 유의미한 차이는 없었습니다. 또한 ChatGPT에게 오류 복구 수준이 높아지만 훼손된 QR코드가 원하지 않는 url로 이동하는 링크로 복구 해주는 것이 아니냐는 질문에는 그렇지는 않다고 하네요.

 

 

[box_size]

QR 코드의 각 박스(픽셀)의 크기를 지정합니다. 이 값은 생성되는 이미지의 전체 크기에 영향을 미칩니다. 아래는 box_size를 10으로 했을 때와 100으로 했을 때의 크기 차이입니다.


[border]

QR 코드 이미지 주변의 테두리 크기를 박스 단위로 지정합니다. 기본값은 4입니다.

2. segno 라이브러리

 

1) 설치

 

 설치는 pip install qrcode 명령을 cmd 창 혹은 주피터노트북 창에 입력하시면 됩니다.

pip install segno

 

 

2) 초간단 사용법

 

 segno의 사용법은 더 간단합니다.

import segno

# QR 코드 생성
qr = segno.make("https://www.google.com", error='H', version=3)

# SVG 형식으로 저장
qr.save('qr-segno.svg', scale=10)

  

segno 패키지는 크게 make 함수와 save 함수가 있습니다. qrcode 패키지와 마찬가지로 다양한 옵션이 있는데 필요한 옵션들 위주로 각각 무엇을 의미하는지 하나씩 설명드리겠습니다.

 

make 함수의 옵션

 

[error]
QR 코드의 오류 보정 수준을 설정합니다. 가능한 값은 'L', 'M', 'Q', 'H' 입니다. 위에서 배운 qrcode와 동일한 개념이므로 자세한 설명은 생략하겠습니다.


[version]
QR 코드의 버전을 설정합니다. 별도로 설정하지 않으면 기본적으로 segno가 자동으로 적절한 버전을 선택합니다. 마찬가지로 위에서 배운 qrcode와 동일한 개념이므로 자세한 설명은 생략하겠습니다.

 

[micro]
True로 설정하면 마이크로 QR 코드를 생성합니다. 마이크로 QR 코드는 작은 양의 데이터를 위해 최적화된 작은 QR 코드입니다. 제가 테스트 해보니 url 데이터는 담지 못하고 숫자나 문자 정도만 담을 수 있습니다.

 

 

save 함수의 옵션

 

save 함수의 경우에는 위에서 배웠던 box_size 옵션과 비슷하게 scale 옵션을 이용하여 qrcode의 사이즈를 조절할 수 있고, bolder 옵션과 같이 quiet_zone 옵션을 이용하여 여백의 사이즈를 조절할 수 있습니다.

 

[scale]
QR 코드의 크기를 조정합니다. scale 값은 QR 코드의 각 모듈(픽셀)의 크기를 결정합니다. 예를 들어, scale=2는 기본 크기의 두 배 크기로 QR 코드를 생성합니다.

 

[quiet_zone]
QR 코드 주변의 여백(quiet zone)의 크기를 설정합니다. 이 값은 모듈의 수로 지정되며, QR 코드 표준에 따라 기본값은 4입니다.

 

[kind]
저장할 파일의 형식을 지정합니다. 예를 들어, 'png', 'svg', 'eps', 'pdf' 등을 지정할 수 있습니다. 파일 확장자를 통해 자동으로 결정되기도 하지만, 이 옵션을 통해 명시적으로 형식을 지정할 수 있습니다.

 


오늘 준비한 내용은 여기까지입니다.

 

최근 글을 블로그에 소홀해서 글을 많이 올리지 않았는데 좀 더 분발해 보도록 해보겠습니다.

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

2022.03.11 - [파이썬 패키지/라이브러리&패키지 소개] - 파이썬 주요 라이브러리 정리

 

 

 

오늘은 23년 7월경 부터 발생하기 시작한 Chromedriver 에러의 원인과 해결법에 대해서 알아보겠습니다.

 

[요약]

1) 크롬 드라이버는 114 버전 이후 배포 방식을 다르게 변경하여서 webdriver_manager로는 자동 다운로드가 되지 않음.

2) 사실은 selenium 4.6 버전 (2022년 4월) 이후로 webdriver_manager 없이 크롬 드라이버 자동 다운로드가 가능함.

3) 현재 2023년 9월 16일 기준, selenium 버전은 4.12이며, pip install --upgrade selenium으로 업그레이드 한 후, 아래의 코드로 실행하면 크롬 드라이버 115버전 이상도 자동 다운로드가 됨.

from selenium import webdriver

# chromedriver 자동 다운로드 됨
driver = webdriver.Chrome()

driver.get('https://www.naver.com')

 

 


1. History

 

1) 직접 다운로드 방식

 

 Chromedriver를 처음 배울 때에는 크롬이 업데이트 될 때마다 크롬 드라이버를 다운로드하는 곳에서 매번 크롬과 동일한 버전의 Chromedriver를 다운로드 받아서 사용했습니다. 다운로드 경로를 설정해줘야 하고, 크롬 버전이 자동 업데이트 되면 코드가 에러가 나는 불편함이 있었죠.

(참고글:  2021.03.23 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 크롬드라이버 크롬 버전에 맞춰서 설치하는법)

 

[사용 방식]

from selenium import webdriver

# chromedriver가 저장된 경로 직접 입력
driver = webdriver.Chrome(r'C:\users\chromedriver.exe')

driver.get('https://www.naver.com')

 

 

2) 자동 다운로드 방식 (With webdriver_manager)

 

 매번 크롬 버전에 맞춰서 다운로드 받아야하는 불편함을 해결하기 위해서, webdriver_manager라는 모듈을 설치해서 코드를 실행할 때마다 사용자의 크롬 버전에 맞는 크롬 드라이버를 자동 설치하는 방식으로 변경하였습니다. 저도 이 방식으로 최근까지 사용해왔습니다.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

chrome_service = Service(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=chrome_service)

driver.get('https://www.naver.com')

 

2. Chromdriver 버전 에러 발생 원인

 

webdriver_manager는 Chromedriver를 다운로드 받는 사이트(https://chromedriver.chromium.org/downloads)에서 자동으로 크롬 버전에 맞는 크롬 드라이버를 다운로드 받습니다.

 

그러나 114버전 (23년 5월 31일 릴리즈)를 마지막으로 해당 사이트에서는 크롬 드라이버를 배포 하지 않고, 7월 중순경 부터 https://googlechromelabs.github.io/chrome-for-testing/  사이트를 통해 크롬 드라이버를 배포하고 있습니다.

이러한 이유로 webdriver_manger를 통한 자동 다운로드 방식은 더 이상 사용하지 못하게 되었습니다. 이로 인해 전세계적으로 수 많은 selenium 유저들이 혼란을 겪기 시작했죠. 

 

3. Chromdriver 버전 에러 해결 방법

 정말 많은 해결 방법들이 여러 블로그를 통해서 나오고 있지만 명료하지가 않습니다. 결론만 말씀드리면 현재 글을 작성하는 2023년 9월 16일 기준으로 selenium 최신 버전은 4.12.0이며, 4.6.0 미만의 버전을 사용하시는 경우는 버전을 업그레이드 하시고 아래의 코드를 사용하시면 됩니다.

 

[버전 확인 방법]

pip show selenium

[실행 결과]

Name: selenium
Version: 4.5.0
Summary:
Home-page: https://www.selenium.dev
Author:
Author-email:
License: Apache 2.0
Location: C:\Users\SANGWOO\AppData\Local\Programs\Python\Python311\Lib\site-packages
Requires: certifi, trio, trio-websocket, urllib3
Required-by:

 

[버전 업그레이드 방법]

pip install --upgrade selenium

[실행 결과]

Installing collected packages: selenium
  Attempting uninstall: selenium
    Found existing installation: selenium 4.5.0
    Uninstalling selenium-4.5.0:
      Successfully uninstalled selenium-4.5.0
Successfully installed selenium-4.12.0

 

selenium 버전을 업그레이드 하셨다면 사용하시는 IDE를 종료했다가 재시작 해주시고, 아래의 코드로 chromedriver를 실행해보세요. webdriver 모듈만으로도 크롬 드라이버 자동 다운로드가 되고 실행되는 것을 확인하실 수 있을거예요.

from selenium import webdriver

# chromedriver가 저장된 경로 직접 입력
driver = webdriver.Chrome()

driver.get('https://www.naver.com')

 


이상으로 최근 selenium 사용자들이 가장 많이 겪는, 모르면 너무 답답한 문제의 원인과 해결방법에 대해서 알아보았습니다. 많은 분들께 도움이 되기를 바랍니다.

 

 

 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

2022.03.11 - [파이썬 패키지/라이브러리&패키지 소개] - 파이썬 주요 라이브러리 정리

 

 

 

이번 시간에는 Windows 환경에서 파이썬 코드를 주기적으로 작동시킬 수 있는 방법에 대해서 소개 드리겠습니다.

 

예전 글에서 schedule 모듈에 대해 다루어 보았었는데요. schedule 모듈의 경우에는 파이썬 파일이 while문을 통해서 계속 실행되고 있어야 하기 때문에 실제로 적용할 때에는 한계점이 보이는 듯 합니다. 아직 제가 schedule 모듈의 활용법을 잘 몰라서 그런지 모르겠습니다ㅎㅎ

 

2021.11.19 - [파이썬 패키지/스케쥴러] - [Python/Schedule] 정해진 주기(초, 분, 시간, 요일, 특정 시각)마다 함수 실행하기

 

[Python/Schedule] 정해진 주기(초, 분, 시간, 요일, 특정 시각)마다 함수 실행하기

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다. 코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록

coding-kindergarten.tistory.com

 

그럼 서론은 이쯤하고 본론으로 들어가보겠습니다.


1. python 파일을 실행할 batch 파일 만들기

 

python 파일, 그러니깐 .py 파일을 바로 작업 스케줄러로 실행시켜줘도 되지만 이건 경로설정이 초보자에게 조금 어려운 것 같아서 bat 파일을 만드는 방법으로 소개드려보려 합니다.

 

1) batch 파일이란?

배치 파일은 일련의 명령 또는 지침을 포함하는 ".bat" 확장자를 가진 간단한 텍스트 파일입니다. Windows 운영 체제에서 작업을 자동화하거나 여러 명령을 순서대로 실행하는 데 사용됩니다.

 

2) batch 파일 만드는 법

batch 파일(.bat)은 텍스트 파일(.txt)을 이용해서 만들기 때문에 어려울 것이 전혀 없어요. 우선 실행시키고자 하는 파이썬 파일과 동일한 폴더에 txt 파일을 만들어 주세요. 폴더의 빈 공간에 우클릭해서 아래의 그림을 참고하셔서 '텍스트 문서'를 클릭하시면 됩니다.

 

클릭하시면 새 텍스트 문서.txt가 생성되고, 이름을 바로 바꿀 수가 있는데 편의상 python 파일의 이름과 동일하게 작성해줍니다. 이 때 중요한 것은 .txt 확장자를 .bat로 변경해주는 것입니다.

 

 

이름을 바꾸신 후에 batch 파일을 그냥 더블 클릭하시면 열리지 않고, 우클릭을 하신 후 편집을 클릭해주셔야해요.

 

편집을 클릭 하셨다면 아래와 같은 메모장 화면이 출력되는데, 아래와 같이 python "실행하고자 하는 파이썬 파일 이름.py"을 입력하시면 됩니다. 잘 입력하셨으면 저장 후 파일을 닫아주세요.

참고로 이렇게 생성된 batch 파일을 더블 클릭하시면 방금 저장한 python 파일이 실행된답니다.

 

여기서 잠깐!
만약 파이썬 파일의 이름에 공백이 들어가있다면 무조건 쌍따옴표 (" ")를 붙여주셔야 합니다. 컴퓨터는 쌍따옴표가 없으면 띄어쓰기를 문자열의 끝으로 인식하므로 제대로 파이썬 파일을 실행시키지 못합니다.
하지만 여러분들의 파이썬 파일 이름에 공백이 없다면 쌍따옴표를 붙여주지 않으셔도 됩니다.

 

 

2. batch 파일을 작업 스케줄러에 등록하기

 

step1. batch 파일을 만들었으니, 우리가 원하는 시간에 python 파일이 실행 될 수 있도록 작업 스케줄러에 등록해보겠습니다. 우선 좌측 하단의 '찾기' 창에 작업 스케줄러를 검색하셔서 클릭해주세요.

 

step2. 작업 스케줄러가 실행되면 이런 창이 나오는데요. 우측의 '기본 작업 만들기...'를 클릭해주세요.

 

step3. 아래와 같은 화면이 나오면 해당 작업을 잘 표현할 수 있는 이름을 입력하고, 필요하다면 간단히 설명도 넣어주세요. 모두 입력하셨다면 다음 버튼을 클릭해주세요.

 

step4. 다음은 작업 트리거, 즉 작업을 어떤 주기 혹은 어떤 조건에서 실행할지 정해주는 단계입니다. 아래 그림과 같이 매일, 매주, 매월, 한 번, 검퓨터 시작 시, 로그온할 때, 특정 이벤트가 기록될 때로 구체적으로 정해줄 수 있습니다.

 

이번 시간에는 '매일'로 설정하고 다음 버튼을 클릭해주겠습니다.

 

step5. 앞서 '매일' 옵션을 선택했기 때문에 아래와 같이 매일 언제 작업을 실행할지 설정하는 단계가 나옵니다. 각자 원하시는 시간을 설정하시면 됩니다. 그 아래에 몇일 간격으로 실행할 지도 나오는걸 보니 2를 입력한다면 격일 단위로도 가능하겠네요.

 

step6. 어떤 작업을 한 것인지에 대한 설정 단계입니다. 기본으로 설정된 '프로그램 시작'  그대로 다음 버튼을 클릭해주세요.

 

step7. 가장 어려운(?) 단계입니다. 프로그램/스크립트 칸에는 방금 전 만들었던 batch 파일의 절대 경로를 입력해줍니다. 찾아보기 버튼으로 해당 파일을 GUI 방식으로 선택하셔도 되고, 파일 경로를 복붙해주셔도 됩니다. 단, 복붙하실 때는 쌍따옴표(" ") 안에 경로를 넣어주세요. 이유는 위에서 설명드렸던 이유와 동일합니다.

 

그리고 시작 위치(옵션)는 batch 파일이 위치하는 폴더의 경로를 입력해줍니다. 이때는 쌍따옴표를 넣어주면 안됩니다. 이랬다 저랬다 헷갈리시죠?ㅎㅎ

 

step8. 마침 버튼을 누르고 기본 작업 만들기를 완료해주세요.

 

여기까지 따라 오셨다면 아래와 같이 작업 스케줄러에 작업이 추가된 것을 확인 하실 수 있을 거예요. 혹시 시간이나 경로를 수정하고 싶으시면 해당 작업을 더블 클릭하셔서 수정 하시면 됩니다.

 

정해진 시간이 되면 아래와 같이 cmd 창이 뜨면서 제가 출력하고자 했던 "Hello Python" 문자열이 출력되는 것을 확인할 수 있습니다. 테스트 하실 때는 현재 시간의 1분 뒤로 설정하시면서 확인해보세요!

제가 테스트를 위해서 만들었던 코드는 아래와 같고 참고로 time.sleep(10)은 cmd 창이 바로 종료되면 확인을 못하기 때문에 추가해주었답니다.

import time

print("Hello Python")
time.sleep(10)

 

오늘 준비한 내용은 여기까지입니다.

 

감사합니다.

 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

2022.03.11 - [파이썬 패키지/라이브러리&패키지 소개] - 파이썬 주요 라이브러리 정리


업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

지난 시간에 요즘 너무나도 핫한 ChatGPT를 우리가 코드로 직접 사용할 수 있도록 만들어진 OpenAI API의 사용법을 알아보았습니다.

 

오늘은 유튜버 코드깎는노인님께서 OpenAI API를 이용해서 개발하신 VSCODE에서 코드와 주석 작성을 도와주거나, 코드 리뷰까지 해주는 정말 유용한 Extension을 소개드리려고 합니다.

 

이 Extension 역시 OpenAI API를 기반으로 만들어졌기 때문에 개인이 발급받은 API key가 필요하며, 사용량에 따라서 비용이 나가게 되는 점 참고 부탁드립니다. (gpt-3.5-turbo 모델 기준: 1000개의 토큰에 약 0.002달러)

 

당연한 이야기지만 이번 내용을 따라오기 위해서는 당연히 VSCODE와 Python 개발환경이 갖추어져 있어야 합니다. 혹시나 설치가 되지 않으신분들은 '개발환경 구축(VScode)' 카테고리의 글들을 참고해주세요.

 

그럼 본론으로 들어가보겠습니다.


1.  VSCODE에서 AICodeHelper 설치하기

 

VSCODE의 좌측에 테트리스 모양의 아이콘을 클릭한 후, 검색창에 'aicodehelper'를 입력하시고 install 버튼을 클릭해서 설치를 해주세요.

 

화면이 아래와 같이 바뀌면 설치가 완료된 상태입니다. 설치가 완료되었다면 VSCODE를 종료 후 재시작 해주세요.

 

2.  AICodeHelper 설정하기

설치가 완료되었다면 기본 설정에 들어가서 Settings를 클릭해주세요. 윈도우는 어디에 있는지 추후에 찾아서 업데이트 하겠습니다.

 

 

셋팅 해줄 것은 두 가지입니다. 첫번째는 API key를 등록해주는 것이고, 두번째는 언어를 설정해주는 거예요.

언어는 선택적인 것이니깐 API key만 잘 등록해주시면 사용하시는데에는 문제가 없답니다.

 

 

API key를 등록하는 법은 간단합니다. Ctrl+Alt+Shift+Q를 입력 후, 지난 시간 발급 받았던 API Key를 아래의 창에 입력해주시면 됩니다. 만약 까먹으셨다면 다시 발급하시면 되니깐 걱정마세요.

 

입력 후 엔터를 누르시면 화면 우측 하단에 아래와 같은 메세지가 출력됩니다. 그러면 API Key가 정상적으로 등록된 것입니다.

 

설정창을 조금 아래로 내려보시면 Language 설정창이 나오는데요. 기본으로 들어가 있는 값을 korean으로 바꾸어 주시면 저같은 한국어 능통한 사람이 잘 사용할 수 있답니다ㅎㅎ.

 

3.  AICodeHelper의 여러가지 기능

이제 여기까지 따라 오셨다면 AICodeHelper의 놀라운 성능을 확인해보실 차례입니다.

 

1) 코드 작성 (단축키: Ctrl+Alt+Shift+g)

"1부터 10까지의 숫자를 모두 더한 합을 리턴해주는 함수를 만들어 줘"라고 부탁했더니 아래와 같은 함수를 만들어 주네요. 흠잡을 데 없는 함수를 작성해주었습니다.

def sum_of_numbers():
    # 1부터 10까지의 숫자를 리스트로 만든다.
    numbers = list(range(1, 11))
    # 리스트의 모든 요소를 더한 값을 리턴한다.
    return sum(numbers)

 

2)  주석 작성 (단축키: Ctrl+Alt+Shift+z)

이번에는 제가 예전에 작성했던 코드에 주석을 달아달라고 해보았어요. 주석을 찬찬히 읽어보니 꽤 정확하게 주석을 달아주네요.

 

3) 리팩토링 (단축키: Ctrl+Alt+Shift+r )

리팩토링이란 코드를 더 효율적이고 가독성 있게 만들어 주는 것이라고 이해하시면 된답니다. 아래 영상을 보시면 코드가 더 깔끔하게 정리되는 것을 보실 수 있습니다. (주석도 없어져서 더 효과가 있어보이는 건 함정이네요ㅎㅎ)

 

4)  코드 리뷰 (단축키: Ctrl+Alt+Shift+c)

마지막으로 소개드릴 기능은 코드 리뷰입니다. 작성한 코드를 드래그한 후 단축키를 누르면 시간이 지난 후에 주석으로 코드 제일 상단에 리뷰를 작성해줍니다.

 

<코드 리뷰 결과>

# |이 코드의 좋은 점은 함수가 잘 구성되어 있다는 것입니다. 함수는 1부터 10까지의 숫자를 리스트로 만들고, 그 리스트의 모든 요소를 더한 값을 리턴합니다. 이렇게 함수를 작성하면 코드의 재사용성이 높아지고, 유지보수가 쉬워집니다.
# |
# |하지만 이 코드의 단점은 함수의 이름이 명확하지 않다는 것입니다. 함수 이름이 "sum_of_numbers"인데, 실제로는 1부터 10까지의 숫자를 더한 값을 리턴하는 함수입니다. 함수 이름을 "sum_1_to_10"과 같이 더 명확하게 지정하는 것이 좋을 것입니다.
def sum_of_numbers():
# 1부터 10까지의 숫자를 리스트로 만든다.
numbers = list(range(1, 11))
# 리스트의 모든 요소를 더한 값을 리턴한다.
return sum(numbers)

sum_1_10 = sum_of_numbers()

print(sum_1_10)

 

 

 

 

[요약]

Ctrl+Alt+Shift+z 주석달기
Ctrl+Alt+Shift+r 리팩토링
Ctrl+Alt+Shift+c 코드리뷰
Ctrl+Alt+Shift+g 자연어명령->코드
Ctrl+Alt+Shift+m 개발 이외 일반적인 질문
(맥 : Shift+Ctrl+Option)

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

2022.03.11 - [파이썬 패키지/라이브러리&패키지 소개] - 파이썬 주요 라이브러리 정리


업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 요즘 너무나도 핫한 ChatGPT를 우리가 코드로 직접 사용할 수 있도록 만들어진 OpenAI API의 사용법을 알아보겠습니다.

 

개인적으로 ChatGPT를 사용해보면서 너무나도 빨리 변해가는 세상에 두려움도 느끼지만 그만큼 새로운 기회도 많이 생길 것이라 생각합니다. 비록 AI 연구자들만큼 AI의 원리나 이를 구현할 능력은 부족하지만, 그들이 만들어놓은 멋진 서비스들을 이용해서 저의 일에 활용할 수 있다면 그것 역시 큰 가치를 가질 것이라 믿습니다. 마치 자동차를 만들지 못해도 운전을 기가 막히게 잘하는 카레이서들 처럼 말이죠.

 

본론으로 들어가기에 앞서, OpenAI API는 사용하는 모델 및 토큰의 양에 따라서 비용이 나가게 됩니다.

(gpt-3.5-turbo 모델 기준: 1000개의 토큰에 약 0.002달러)

 

토큰이란 용어가 익숙하지 않으실텐데요. 예를 들어 "The quick brown fox jumped over the lazy dog"이란 무장이 있다고 할 때,

토큰은 "The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog". 총 9개라고 할 수 있습니다.

처음 가입을 하면 5달러를 무료로 제공해주니, 해당 내용을 따라하고 여러분들이 실습해보시는데에 아주아주 충분할 것이라 생각합니다.

 

그럼 본론으로 들어가보겠습니다.


1.  OpenAI API  페이지 접속 및 로그인

 

호랑이를 잡기 위해서는 호랑이 굴로 들어가야겠죠? 맞는 비유인지 모르겠지만 ChatGPT를 잡으러 ChatGPT를 만든 OpenAI 사의 웹페이지로 들어가봅시다.

 

저는 구글에서 'chatgpt'를 검색했을 때 가장 상단에 나오는 페이지로 들어간 후, 아래의 사진과 같이 'Developers' 메뉴를 클릭하면 나타나는 'API reference'를 클릭했습니다.

 

 

편의를 위해서 API 페이지로 바로 가는 링크를 달아두겠습니다.

https://platform.openai.com/docs/api-reference

 

그러면 아래와 같이 로그인(Log in)과 가입(Sign up) 버튼이 나오는데, 가입한 적이 없으시다면 가입해주시고, 이미 가입하셨더면 로그인 해주시면 됩니다. 참고로 구글이나 마이크로소프트 계정을 이용해서 가입하실 수도 있어요.

 

로그인이 완료되면 아래와 같이 우측 상단에 Personal 버튼이 생깁니다.

 

2. OpenAI API  key 발급받기

VScode로 넘어가서 OpenAI API를 코드로 다루기 전에 해야할 일이 있습니다. 바로 API key를 발급받는 것입니다.

 

1) 우측 상단에 있는 'Personal'을 클릭하시고, 'View API keys'를 클릭해주세요.

2) 그러면 아래와 같은 화면이 나오는데 'Create new secret key' 버튼을 눌러주세요.

3) 생성된 키는 아래에 표시된 곳에 생성됩니다. 여기서 'OK'를 바로 누르시면 다시 발급받아야 하므로, 꼭 초록색 버튼을 눌러서 복사한 뒤에, 메모장 같은 곳에 따로 붙여넣어서 저장해주세요. 그리고 다른 사람에게 노출되지 않도록 주의해주세요!!

 

3. OpenAI API  설치하기

이제 OpenAI API를 파이썬 코드를 이용해서 사용하기 위해서 VSCODE를 켜주세요. 켜셨다면 터미널 창에 아래의 코드를 작성하고 엔터를 눌러주세요.

pip install openai

아래와 같은 문구가 출력되면 설치가 완료된 것입니다.

 

4. VSCODE 개발환경에서 ChatGPT 구현하기

 

간단한 파이썬 코드를 통해서 ChatGPT 페이지가 아닌 터미널에서 ChatGPT와 질문을 주고 받아 보겠습니다.

 

<코드>

# openai api를 불러오고, 발급 받은 api key를 문자열로 입력
import openai
openai.api_key = "OPENAI_API_KEY"

# gpt와 주고받은 메세지를 저장할 빈 리스트 생성
messages = []

# 무한 루프 생성 (질문과 답변을 계속 반복)
while True:
    # 사용자의 질문을 입력받고, messages 리스트에 저장
    user_content = input("사용자: ")
    messages.append({"role": "user", "content": f"{user_content}"})

    # OpenAI의 Chat API 생성
    completion = openai.ChatCompletion.create(
        model="gpt-3.5-turbo", messages=messages)

    # 답변 받은 메세지를 messages 리스트에 저장
    assistant_content = completion.choices[0].message["content"].strip()
    messages.append({"role": "assistant", "content": f"{assistant_content}"})

    # ChatGPT의 답변 출력
    print(f"ChatGPT: {assistant_content}")

<출력>

저는 저녁 메뉴를 추천해달라고 했고, 추가로 더 메뉴를 추천해달라고 하였습니다. 질문과 답변을 잘 보면 이전 채팅을 참고하여 답변을 하는 것을 알 수 있어요.

 

참고로 ChatCompletion.create( ) 함수에는 여러가지 파라미터들이 있고, 이것들을 목적에 따라서 조금씩 바꿔가면서 다른 결과를 낼 수 있다고 합니다. 공부를 더 해서 추후에 해당 파라미터들의 의미에 대해서 소개드릴 수 있도록 하겠습니다.

 

오늘 준비한 내용은 여기까지입니다.

 

감사합니다.


<참고 자료>

파이썬 chatgpt API 사용법(gpt-3.5-turbo) 코드 10줄로 챗GPT 만들기_프로그래머 김플 스튜디오

https://www.youtube.com/watch?v=b-QeMi1A2go 

 

 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 


아주 오래 전에 아두이노로 파이썬으로 제어하는 법을 알아보고 모터 제어하는 방법도 포스팅 하겠다고 해놓고 이제서야 포스팅 해봅니다.

 

2021.12.18 - [파이썬 패키지/아두이노] - [Python/Serial] 파이썬으로 아두이노 제어하기

 

[Python/Serial] 파이썬으로 아두이노 제어하기

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다. 코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도

coding-kindergarten.tistory.com

 

예전에 했던 프로젝트를 정리하는 느낌으로 포스팅 해보겠습니다.

 

이 글을 보시는 대부분의 분들께서는 이미 아두이노를 아신다는 가정하에 글을 썼으니, 이 점 참고 부탁드립니다.

 

1. 개념도

 

저의 경우엔 차트를 180도 회전시키는 프로젝트를 진행했었는데 전원이 꺼지면 원점 정보를 잃어버리는 스텝 모터를 보완해주기 위해서 리미트 센서도 함께 사용했었습니다.

 

2. 준비물

 

1) 스테핑모터 NK243-01AT 2상스테핑모터, 23,100

     (모터 구매 링크)

 

2) 아두이노 우노

 

3) 아두이노 L293D 모터 드라이버 쉴드

 

DC모터 최대 4개, 스탭모터 최대 2개까지 제어 가능

 

4) 리미트 센서

 

5) 9V 1A 전원 어댑터

 

3. 배선

 

저는 모터 구매 사이트에서 알려주는 배선도와 모터 케이블의 색깔이 달라서 배선에 매우 애를 먹었었습니다.

 

참고로 GND에 빨간색과 파란색 선을 연결해주지 않아도 모터가 돌아는 가지만 소음이 심하고 힘도 부족합니다. 

 

모터 드라이버 쉴드&nbsp; &ndash;&nbsp; 모터&nbsp; ( 방향에 주의할 것 )

 

아두이노 - 리미트 센서

 

4. 아두이노

 

아두이노 모터 드라이버 쉴드를 사용하기 위해서는 Adafruit Motor Shield library라는 라이브러리를 설치해주어야 합니다.

 

라이브러리 설치방법
검색 후 설치 버튼 클릭

 

아래는 아두이노 코드입니다. 앞서 말씀드렸 듯이 스텝모터와 리미트 센서를 함께 사용했기에 조금 코드가 깁니다.

혹시나 필요하실 분들을 위해 함께 남겼고, 스텝모터만 제어하실 분들은 더 아래의 코드를 이용해주세요. 

#define OFFMODE 0
#define CW 1
#define CCW 2

#include <AFMotor.h>

int sensorPin = 2;
int flag_start;

AF_Stepper motor(200, 2);

char cmd;
int state = OFFMODE;

void setup() {
  Serial.begin(9600);
  motor.setSpeed(8);
  pinMode(sensorPin, INPUT);

  // 가장 처음 스텝모터의 원점을 잡기 위한 코드
  while(true){

    int val = digitalRead(sensorPin);

    if(val==1){
      break;
    }

    Serial.println(val);

    if(val==0){
      motor.step(1, FORWARD, MICROSTEP);
    }
    
    Serial.println(val);
  
    if(val==1){
      break;
    }
  }

}

void loop() {

  if(Serial.available()){
  cmd = Serial.read();
  }
  if(cmd=='a'){
    state=CW;
  }else if(cmd=='b'){
    state=CCW;
  }else{
    state=OFFMODE;
  }

  if(state==CW){
  motor.step(100, FORWARD, MICROSTEP);
  delay(1000);
  state=OFFMODE;
  }
  
  else if(state==CCW){
  motor.step(100, BACKWARD, MICROSTEP);
  delay(1000);
  state=OFFMODE;
  }
  
  else{
  state=OFFMODE;
  }
}

 

<리미트 센서 제외한 스텝모터 제어 코드>

#define OFFMODE 0
#define CW 1
#define CCW 2

#include <AFMotor.h>

//모터 셋팅(360도를 200step으로 설정, 모터 드라이버 쉴드 2번 포트 사용)
AF_Stepper motor(200, 2);

char cmd;
int state = OFFMODE;

void setup() {
  Serial.begin(9600);
  motor.setSpeed(8);
  pinMode(sensorPin, INPUT);
}

void loop() {

  if(Serial.available()){
  cmd = Serial.read();
  }
  if(cmd=='a'){
    state=CW;
  }else if(cmd=='b'){
    state=CCW;
  }else{
    state=OFFMODE;
  }

  //모터 정회전(180도)
  if(state==CW){
  motor.step(100, FORWARD, MICROSTEP);
  delay(1000);
  state=OFFMODE;
  }
  
  //모터 역회전(180도)
  else if(state==CCW){
  motor.step(100, BACKWARD, MICROSTEP);
  delay(1000);
  state=OFFMODE;
  }
  
  else{
  state=OFFMODE;
  }
}

 

 

5. 파이썬 코드

 

import serial
import time

py_serial = serial.Serial(

    # serial port 설정
    port = "com3",
    # 보드 레이트 (통신 속도)
    baudrate=9600
)

while True:

    commend = input('아두이노에게 내릴 명령:')
    
    #정회전
    commend = 'a'
    py_serial.write(commend.encode())
    
    #역회전
    commend = 'b'
    py_serial.write(commend.encode())

 


오늘 준비한 내용은 여기까지입니다.

 

감사합니다.

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

2022.03.11 - [파이썬 패키지/라이브러리&패키지 소개] - 파이썬 주요 라이브러리 정리


업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 인스타그램으로 특정 태그의 게시물을 캡처하거나 좋아요를 누르는 등의 자동화를 위한 가장 첫 단계로 인스타그램을  selenium으로 자동 로그인하는 방법에 대해서 알아보겠습니다.

 

해당 강의를 따라하기 위해서는 인스타그램 아이디와 비밀번호가 필요하답니다.

(facebook 계정으로도 로그인 하는 방법이 있지만 그 방법은 다루지 않았습니다.)

 

그리고 크롬 드라이버가 설치되어 있어야 합니다. 혹시 안되어 있으신분들은 아래의 강의를 참고해주세요.

 

2021.03.23 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 크롬드라이버 크롬 버전에 맞춰서 설치하는법

 

[Python/웹 크롤링] 크롬드라이버 크롬 버전에 맞춰서 설치하는법

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다. 코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도

coding-kindergarten.tistory.com

 


1. 패키지 import

 

가장 먼저 할 일은 당연히 웹 자동화를 위한 필수 패키지를 불러오는 일입니다.

# step1. 필요한 패키지와 모듈 불러오기
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

 

2. 크롬 드라이버 실행 및 인스타그램 로그인 화면 출력

 

그 다음은 크롬 드라이버를 실행하고, 인스타그램 로그인 url로 이동해보겠습니다. 아래의 코드의 경로 대신에 여러분들의 크롬 드라이버(chromedriver.exe)가 있는 경로를 입력해주어야 한다는 것 주의해주세요.

 

driver = webdriver.Chrome(r"C:\Users\SANGWOO\Desktop\chromedriver.exe")

driver.get("https://www.instagram.com/accounts/login/")

time.sleep(1)

 

3. 아이디 & 비밀번호 입력 후 엔터

 

다음으로 해줄 일은 아이디와 비밀번호를 입력하고 엔터를 눌러주는 것입니다.

 

 

# 인스타 아이디
id = "여러분의 아이디를 입력해주세요"
# 비밀번호
pw = "여러분의 비밀번호를 입력해주세요"

# id와 pw를 입력하는 창의 요소 정보 획득
input = driver.find_elements_by_tag_name("input")

# 아이디를 입력
input[0].send_keys(id)

# 비밀번호 입력
input[1].send_keys(pw)

# 엔터
input[1].send_keys(Keys.RETURN)
time.sleep(5)

 

4. 옵션 설정 단계 통과하기

 

위에서 로그인을 하고나면 아래와 같은 화면이 출력됩니다. 그것도 2개나 말이죠.

둘 모두 '나중에 하기' 버튼을 찾아서 클릭해서 장애물을 극복해줍시다!

 

첫번째 장애물. 로그인 정보 저장 여부

 

두번째 장애물. 알림 설정 여부

 

# 로그인 정보 저장 여부 ("나중에 하기 버튼 클릭")
btn_later1 = driver.find_element_by_class_name('_acan._acao._acas')
btn_later1.click()
time.sleep(5)

# 알림 설정 ("나중에 하기 버튼 클릭")
btn_later2 = driver.find_element_by_class_name('_a9--._a9_1')
btn_later2.click()

 

참고로 저는 보통 xpath로 element를 찾는 방식을 선호하는데, 하루만에 xpath가 변경되거나 알림 설정의 '나중에 하기' 버튼을 클릭할 때는 잘 작동하지 않아서 class_name을 이용했습니다.

 

여기까지 하면 로그인이 완료되고 여러분들의 인스타그램 홈화면이 나올거예요.

 

5. 전체코드 (좀 더 세련된 코드)

 

전체 코드를 함수 개념을 이용해서 좀 더 깔끔하게 정리했습니다. 위에서 코드가 실행되는 흐름을 이해하셨다면 아래의 코드를 사용하시면 됩니다.

# step1.필요한 패키지와 모듈 불러오기
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

# step2.아이디, 비밀번호 설정
id = "여러분의 아이디를 입력해주세요"
pw = "여러분의 비밀번호를 입력해주세요"

# step3.크롬 웹드라이버 실행
driver = webdriver.Chrome(r"C:\Users\SANGWOO\Desktop\chromedriver.exe")

# step4.인스타그램 로그인 함수 정의
def login(id, pw):
    # 로그인 페이지로 이동
    driver.get("https://www.instagram.com/accounts/login/")
    time.sleep(1)
    
    # id와 pw를 입력하는 창의 요소 정보 획득
    input = driver.find_elements_by_tag_name("input")

    # 아이디를 입력
    input[0].send_keys(id)

    # 비밀번호 입력
    input[1].send_keys(pw)

    # 엔터
    input[1].send_keys(Keys.RETURN)
    time.sleep(5)

    # 로그인 정보 저장 여부 팝업창 제거 ("나중에 하기 버튼 클릭")
    btn_later1 = driver.find_element_by_class_name('_acan._acao._acas')
    btn_later1.click()
    time.sleep(5)

    # 알림 설정 팝업창 제거 ("나중에 하기 버튼 클릭")
    btn_later2 = driver.find_element_by_class_name('_a9--._a9_1')
    btn_later2.click()

# step5.로그인 함수 실행
login(id,pw)

 


오늘 준비한 내용은 여기까지입니다.

 

감사합니다. 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

저번 시간에 기본적인 슬라이드를 만드는 법과 원하는 레이아웃(혹은 템플릿)의 슬라이드를 만드는 방법을 소개드렸습니다.

 

이번 시간에는 지난 시간에 잠시 언급하였던 placeholder, 쉽게 말해 "글자, 그림과 같은 컨텐츠를 담는 틀"에 대하여 알아보고, 틀 안에 내용을 채우는 법에 대해서 공부해보겠습니다.


1. placeholder의 종류

 

placeholder의 종류는 총 18가지가 있다고 합니다만, 우선 기본 레이아웃들에 들어있는 7가지만 소개드려보겠습니다.

쉬운 이해를 돕기 위해 우리에게 익숙한 ppt 화면을 바탕으로 설명드리겠습니다.

 

1) Tilte: 제목 상자

2) Subtitle: 부제목 상자

 

3) Content Placeholder: 콘텐츠 상자

 

4) Picture Placeholder: 그림 상자

5) Text Placeholder: 텍스트 상자

 

6) Vertical Text Placeholder: 세로 텍스트 상자

7) Vertical Title: 세로 제목

 

 

만약 11가지 레이아웃가 어떤 Placeholder들을 갖고 있는지 확인해보고 싶으시다면 아래의 코드를 실행시켜 보세요.

(결과는 생략할테니 여러분들이 직접 확인해보세요ㅎㅎ)

 

코드
#python-pptx의 가장 기본이 되는 Presentation 클래스 불러오기
from pptx import Presentation

#Presentation 객체 생성
prs = Presentation()

# 반복문으로 기본 레이아웃 11가지 만들기
for i in range(0, 11):
    print("\n======="+"%d"%(i+1)+"번 슬라이드=======")
    slide = prs.slides.add_slide(prs.slide_layouts[i])
    
    # 생성한 레이아웃 안의 모든 placeholder 이름 확인
    for shape in slide.placeholders:
        print('%s' % (shape.name))

 

 

2. placeholder에 내용 넣기

 

1) 텍스트

 

제목 상자와 부제목 상자에 글을 입력하는 방법은 지난 시간에 잠시 다루어 보았습니다.

 

placeholders[인덱싱 번호]로 각 상자들을 변수에 넣어서 객체화 해준 다음, text 함수를 이용해서 텍스트를 입력해주시면 된답니다. 간단하죠?

 

코드의 실행 결과는 지난 시간에 해보았으니 따로 결과는 확인하지 않겠습니다.

 

코드

from pptx import Presentation

prs = Presentation()

slide_layout = prs.slide_layouts[0]
slide = prs.slides.add_slide(slide_layout)

# 제목과 부제 박스를 선택해서 변수에 대입
title = slide.placeholders[0]   # title = slide.shapes.title와 동일
subtitle = slide.placeholders[1]

# 제목과 부제에 글자 입력
title.text = "안녕하세요, 여기는 코딩유치원입니다."
subtitle.text = "python-pptx 강의입니다."

# 추가 문단 입력하고 싶을 때 해당 코드 사용
tf = subtitle.text_frame
p = tf.add_paragraph()
p.text = '추가 문단'

#ppt 저장
prs.save('test.pptx')

 

 

2) 그림

 

이번에는 그림을 넣어보기 위해서 Picture Placeholder가 있는 9번째 레이아웃을 사용했답니다. 그리고 저는 현재 실행하고 있는 파이썬 파일과 같은 경로에 그림 상자에 넣어 줄 고양이 사진을 따로 저장해주었습니다.

 

 

* 참고

=======9번 슬라이드=======
Title 1
Picture Placeholder 2
Text Placeholder 3

 

기본 슬라이드 11개 중에 9번째 슬라이드인 '캡션 있는 그림' 슬라이드입니다. 아래 그림을 보시면 위에서부터 순서대로 '그림 - 제목 - 텍스트' 상자 순일 것 같지만 코드로 해당 슬라이드의 placeholders 인덱싱을 보면 Title이 1번, 그림상자가 2번, 텍스트 상자가 3번인 것을 확인하실 수 있어요.

기본 9번 슬라이드

 

텍스트를 넣을 때와 흐름은 비슷하니 코드를 이해하시는데에 어려움은 없으실거예요.

 

코드

from pptx import Presentation

prs = Presentation()

slide_layout = prs.slide_layouts[8]  # 그림 상자가 있는 슬라이드
slide = prs.slides.add_slide(slide_layout)

# Picture Placeholder 선택
ph_picture = slide.placeholders[1] # 0:title, 1:Picture, 2:Text

# 현재 경로에 있는 cat.jpt를 그림 상자에 추가
picture = ph_picture.insert_picture('cat.jpg')

# 저장
prs.save('test_picture.pptx')

 

결과

 

귀여운 고양이 그림이 그림상자에 잘 들어간 것을 확인하실 수 있습니다.

 

오늘 준비한 내용은 여기까지 입니다.

 

오늘도 코딩유치원을 찾아주신 여러분들께 감사드립니다.


<참고 자료>

python-pptx 공식문서_Working with placeholders 부분

https://python-pptx.readthedocs.io/en/latest/user/placeholders-using.html

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 


1. python-pptx 설치하기

 

2. ppt 생성하고 슬라이드 추가하기

 

우리가 파워포인트를 가장 처음 켰을 때, 프로그램을 실행시키고, 새 슬라이드를 추가하 듯이 파이썬 코드로 동일한 상황을 구현해보겠습니다.

 

<코드>

#python-pptx의 가장 기본이 되는 Presentation 클래스 불러오기
from pptx import Presentation

#Presentation 객체 생성
prs = Presentation()

#슬라이드의 레이아웃 선택
slide_layout = prs.slide_layouts[0]

#선택한 레이아웃의 슬라이드 추가
slide = prs.slides.add_slide(slide_layout)

#pptx 파일 저장
prs.save('test.pptx')

 

<결과>

 

 

아시다시피 ppt의 기본 레이아웃(Office Theme)는 11개가 있습니다. 아래의 순서대로 prs.slide_layouts[ ]의 괄호 안에 0~11 중 숫자 하나를 선택해서 넣어주면 해당 레이아웃을 사용할 수 있습니다.

다양한 레이아웃

 

3. 슬라이드에 글자 쓰기

 

방금 전 추가했던 '제목+부제' 레이아웃(혹은 템플릿)에는 두 가지 placeholder가 존재합니다. 여기서 placeholder는 그냥 상자라고 생각하시면 간단합니다. (다음시간에 placeholder의 여러 종류에 대해서 자세히 알아보겠습니다.)

 

우리는 이 placeholder를 선택해서 글자를 입력해주면 됩니다. 긴 설명보다는 코드를 실행해보시고 결과와 비교해보시는게 빠를 것 같아요.

 

<코드>

from pptx import Presentation

prs = Presentation()

slide_layout = prs.slide_layouts[0]
slide = prs.slides.add_slide(slide_layout)

# 제목과 부제 박스를 선택해서 변수에 대입
title = slide.placeholders[0]   # title = slide.shapes.title와 동일
subtitle = slide.placeholders[1]

# 제목과 부제에 글자 입력
title.text = "안녕하세요, 여기는 코딩유치원입니다."
subtitle.text = "python-pptx 강의입니다."

# 추가 문단 입력하고 싶을 때 해당 코드 사용
tf = subtitle.text_frame
p = tf.add_paragraph()
p.text = '추가 문단'

#ppt 저장
prs.save('test.pptx')

 

<결과>

 


오늘 준비한 내용은 여기까지입니다.

 

다음 시간에 더 알찬 내용으로 돌아오겠습니다. 감사합니다. 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

2022.03.11 - [파이썬 패키지/라이브러리&패키지 소개] - 파이썬 주요 라이브러리 정리


업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 파이썬으로 여러명에게 첨부파일이 포함된 메일을 보내는 방법에 대해 공부해보겠습니다.

 

<파이썬으로 이메일 보내기 관련 글>

2022.03.23 - [파이썬 패키지/이메일] - [python/smtplib] 파이썬으로 구글 Gmail 보내기 2편. smtplib와 email 모듈

2022.06.01 - [파이썬 패키지/이메일] - [python/imaplib] 파이썬으로 구글 Gmail 읽기

 

1. 구글 메일 자동화를 위한 설정

2022.03.17 - [파이썬 패키지/이메일] - [python/smtplib] 파이썬으로 구글 Gmail 보내기 1편. SMTP의 개념과 구글 앱 비밀번호 발급받기

 

2. 네이버 메일 자동화를 위한 설정

2022.06.15 - [파이썬 패키지/이메일] - [#shorts] 파이썬으로 네이버 메일 보내기 위한 초간단 설정

 


 

이전 시간까지는 정말 단순하게 단 한명에게 메일 제목과 내용만 포함하여 메일을 보내는 것을 해보았습니다. 

 

 

오늘 배워볼 내용은 한번에 여러명에게, 첨부파일을 포함시켜서 메일을 보내는 방법입니다.

 

1. 관련 모듈, 클래스 불러오기

 

우선 오늘 새로 등장하는 모듈과 클래스들이 많으므로 쉬운 이해를 위해서 기능에 따라 배치해보았습니다.

 

그림을 기준으로 소개드리자면,

 

MIMEBase:

첨부파일이 포함된 메일은 멀티파트(Multipart)로 구성되어 있으며, MIMEBase가 기본 포맷의 역할을 합니다. 즉, MIMEBase라는 종이 위에 텍스트도 넣고, 첨부파일도 넣는 느낌인 것입니다.

 

Header:

Header는 사람의 문장을 컴퓨터가 이해할 수 있는 문장으로 변환해줄 때 사용하는 모듈로 전반적으로 사용합니다.

 

MIMEText:

지난 시간에도 사용했던 MIMEText 클래스는 '본문 메세지'를 작성할 때 사용합니다.

 

MIMEApplication:

MIMEApplication 클래스는 파일을 첨부해줄 때 사용합니다. 

 

 

2. 전체 코드

 

위의 개념도만 대략 이해하시면, 그 외의 부분은 주석을 읽어보시면서 따라해보시면 되리하 생각합니다.

(더 친절하지 못해 죄송합니다..ㅜㅜ)

#step1.관련 모듈, 클래스 불러오기
import os
import smtplib
from email.header import Header
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication


#step2.SMTP 서버를 dictionary로 정의
smtp_info = {
    'gmail.com': ('smtp.gamil.com', 587),
    'naver.com': ('smtp.naver.com', 587),
    'outlook.com': ('smtp-mail.outlook.com', 587),
    'hotmail.com': ('smtp-mail.outlook.com', 587),
    'yahoo.com': ('smtp.mail.yahoo.com', 587),
    'nate.com': ('smtp.mail.nate.com', 465),
    'daum.net': ('smtp.daum.net', 465),
    'hanmail.net': ('smtp.daum.net',465)
}

#step3.메일 보내는 함수 정의 (발신 메일, 수신 메일(여러개 가능), 제목, 본문, 첨부파일 경로, 비밀번호)
def send_email(From, To, subject, message, attach_files=(), passwd='', subtype='plain'):
    
    
    #step4.멀티파트로 메일을 만들기 위한 포맷 생성
    form = MIMEBase('multipart', 'mixed')
    
    #step5.입력받은 메일주소와 제목, 본문 등의 문자열을 인코딩해서 form에 입력
    form['From'] = From
    form['To'] = ', '.join(To) #수신 메일 리스트를 문자열로 변환 (,와 한칸 공백을 추가해서 구분)
    form['Subject'] = Header(subject.encode('utf-8'), 'utf-8')
    msg = MIMEText(message.encode('utf-8'), _subtype=subtype, _charset='utf-8')
    form.attach(msg)
    
    #step6.여러개의 파일을 하나씩 첨부
    for fpath in attach_files:
        
        folder, file = os.path.split(fpath) # 파일의 절대 경로를 입력하면, 두 가지 문자열을 나눠서 반환
                                            # (ex./home/User/Desktop/file.txt --> (/home/User/Desktop/, file.txt)
        
        with open(fpath, 'rb') as f: # 첨부 파일을 열어서 내용을 가져옴
            body = f.read()
        
        msg = MIMEApplication(body, _subtype=subtype)
        
        msg.add_header('Content-Disposition', 'attatchment',
                        filename=(Header(file, 'utf-8').encode()))
        form.attach(msg)
        
    #step7.SMTP 서버 로그인 및 작성된 메일 보내기
    id, host = From.rsplit("@",1) #발신인 메일 주소의 @를 기준으로 id와 host로 나눔
    
    smtp_server, port = smtp_info[host] #step2의 dict를 이용해서 host와 port 정보들을 받아옴
    
    # SMTP 서버 접속 여부 확인
    if port == 587:
        smtp = smtplib.SMTP(smtp_server, port)
        rcode1, _ = smtp.ehlo()
        rcode2, _ = smtp.starttls()
    
    else:
        smtp = smtplib.SMTP_SSL(smtp_server, port)
        rcode1, _ = smtp.ehlo()
        rcode2 = 220 
        
    if rcode1 != 250 or rcode2 != 220:
        smtp.quit()
        return '연결에 실패하였습니다.'
    
    smtp.login(From, passwd)
    smtp.sendmail(From, To, form.as_string())    
    smtp.quit
    

#step8.실제 함수 실행 부분
me = 'continent9@naver.com'
receivers = ['codingswson@gmail.com','sonsangwoo91@gmail.com']

subject = '파이썬으로 메일 보내기 테스트'
message = """
안녕하세요, 코딩유치원에서 제작한 '메일 전송 봇'입니다.

첨부드리는 파일 참고 부탁드립니다.

감사합니다.
"""

attatch_files = ['5.png', 'test_excel.xlsx','Excel_sum.py','text파일.txt']
send_email(me, receivers, subject, message, attatch_files, passwd='네이버 로그인 비밀번호')

 

글을 마치며, 제가 네이버 메일로 발신했을 땐 정상작동 하는 코드가, 이상하게도 구글 메일로 발신하려고 하면 에러가 납니다. 당연히 구글 비밀번호를 '앱 비밀번호'로 하였는데도 말이죠.

 

혹시 여러분들은 되신다면 댓글을 달아주시면 감사하겠습니다!

 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

2022.03.11 - [파이썬 패키지/라이브러리&패키지 소개] - 파이썬 주요 라이브러리 정리


업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 


 

파이썬 코드를 이용해서 네이버 메일을 발신/수신하기 위해서는 아래의 설정이 반드시 선행되어야합니다.

 

해당 설정을 하지 않으시고 파이썬 코드를 실행하시면 아래와 같은 오류가 출력된답니다.

 

SMTPAuthenticationError: (535, b'5.7.1 Username and Password not accepted wIKXs+XGQSmZsM0dOtS9cA - nsmtp')

 

그럼 지금부터 함께 설정을 해보겠습니다.

 

설정 방법

 

step1. 사용하고자 하시는 네이버 메일에 로그인 하신 후, 화면 왼쪽에 위치한 '외부메일 가져오기' 탭 오른쪽에 위치한 톱니바퀴 아이콘을 클릭해주세요.

 

 

step2. 화면이 전환되었다면 아마 '외부 메일 가져오기' 탭이 클릭된 상태일 거예요. 'POP3/IMAP 설정' 탭을 클릭하신 후, 아래 그림과 같이 사용함을 클릭해주세요.

 

 

정말 간단하죠?

 

반응형

+ Recent posts