안녕하세요! 오늘은 PySimpleGUI에서 sys 라이브러리를 이용하여 로그나 출력을 GUI 컴포넌트로 리다이렉션되지 않도록 설정하는 방법에 대해 알아보겠습니다. 개발하시는 도중 GUI에 로그나 출력이 나타나지 않게 하고 싶으시다면, 이 글이 도움이 될 거예요!
728x90
1. 코드리뷰 - 리다이렉션 설정
PysimpleGUI 사용시 리다이렉션이 변경되어 콘솔창에 출력안되는 문제를 아래와 같이 sys.stdout , sys.stderr 을 호출하여 복원 하는 코드로 해결.
1. PySimpleGUI와 sys 라이브러리의 기본 이해 먼저, PySimpleGUI는 파이썬에서 간단하게 GUI를 만들 수 있도록 도와주는 라이브러리랍니다. sys 라이브러리는 파이썬 인터프리터와 관련된 변수와 함수를 제공하는데, 여기에는 표준 입출력에 관련된 기능들도 포함돼 있죠.
2. 출력 리다이렉션 설정 방법 PySimpleGUI를 사용할 때는 특히 sys.stdout과 sys.stderr의 리다이렉션을 관리해야 합니다. 기본적으로 PySimpleGUI는 이 두 출력 스트림을 GUI 컴포넌트로 리다이렉션하는데요, 이를 원하지 않는다면 다음과 같이 설정할 수 있습니다.
import PySimpleGUI as sg
# PysimpleGUI 라이브러리 사용을 위해 호출하여 sg 이름으로 줄여서 사용
import sys
# 표준 출력 설정 라이브러리 호출
# 초기 표준 출력과 오류 스트림 저장
original_stdout = sys.stdout
original_stderr = sys.stderr
#윈도우 생성시 변경되는 리다이렉션을 다시 복원하기 위함
# 간단한 윈도우 생성 예제
layout = [[sg.Text("Hello from PySimpleGUI")], [sg.Button("OK")]]
# 윈도우 생성
window = sg.Window("Window Title", layout)
# 이벤트 루프
while True:
event, values = window.read()
if event == sg.WIN_CLOSED or event == 'OK':
break
window.close()
# 윈도우가 닫힌 후 콘솔에 메시지 출력을 위해 표준 스트림 복원
sys.stdout = original_stdout
sys.stderr = original_stderr
print("This will print to the console.")
3. 실용적인 팁 로그 파일 관리: 프로그램의 로그를 파일로 관리하고자 한다면 logging 모듈을 설정해서 로그 출력을 파일로 리다이렉션 할 수 있습니다. 오류 관리: 예기치 못한 오류를 사용자에게 보여주고 싶지 않을 때는 sys.stderr의 출력을 적절히 관리하세요.
마무리
- 이번 포스팅은 표준 출력을 이용하여 PysimpleGUI 종료후 콘솔 출력 문제 해결에 대해 알아봤습니다.
- 이 글을 통해 PySimpleGUI에서 sys 라이브러리를 활용해 로그와 출력을 GUI 컴포넌트로부터 독립적으로 관리하는 방법을 알아보았습니다. 개발하시는 과정에서 이 정보가 유용하게 사용되기를 바랍니다!
반응형
궁금한 사항은 lution2@gmail.com로 문의사항 주시면 답변 드리겠습니다. 감사합니다.
PySimpleGUI는 다양한 팝업 창을 포함하여 파이썬에서 GUI 어플리케이션을 만들기 위한 간단한 방법을 제공합니다. 다음은 PySimpleGUI에서 다양한 유형의 팝업 창을 사용하는 방법을 보여주는 예제 모음입니다. 자세한 문서와 더 많은 예제는 PySimpleGUI 공식 문서를 참고하세요.
1. Basic Popup ( 기본창 )
The most basic form of popup to display a message:
가장 기본적인 팝업창 메세지 :
import PySimpleGUI as sg
sg.popup('CostZeroCode')
반응형
2. Popup with Title( 제목창이 있는 팝업창)
A popup window with a custom title:
import PySimpleGUI as sg
sg.popup('This is the main message', title='Custom Title')
3. Popup with Multiple Lines ( 여러줄로 메세지 출력하는 창)
To display multiple lines of text, you can separate text using a newline character \n:
여러개의 텍스트 라인으로 팝업창 생성
import PySimpleGUI as sg
sg.popup('Line 1\nLine 2\nLine 3', title='Multiple Lines')
4. Popup to Get User Input
To get input from the user through a popup:
import PySimpleGUI as sg
user_input = sg.popup_get_text('Please enter something')
sg.popup(f'You entered: {user_input}')
5. Popup to Show an Error ( 에러 메시지 창)
For showing error messages:
import PySimpleGUI as sg
sg.popup_error('An error has occurred!')
5. Popup to Display an OK/Cancel Dialog
To ask the user a yes/no question:
OK 또는 Cancel 버튼 선택창
import PySimpleGUI as sg
result = sg.popup_ok_cancel('Do you want to proceed?')
sg.popup(f'You chose: {result}')
6. Popup with Custom Button Text ( 사용자 정의 버튼과 결과 출력창)
To create a popup with custom button texts:
사용자 정의 버튼 과 선택한 버튼의 텍스트를 출력하는 팝업
import PySimpleGUI as sg
result = sg.popup('Custom button text example', button_type=sg.POPUP_BUTTONS_YES_NO, custom_text=('Proceed', 'Stop'))
sg.popup(f'You chose: {result}')
7. Popup for Folder Selection
To ask the user to select a folder:
import PySimpleGUI as sg
folder = sg.popup_get_folder('Please select a folder')
sg.popup(f'You selected: {folder}')
이 예제들은 PySimpleGUI에서 팝업의 기본 사용법을 다룹니다. 이 템플릿들로 실험해 보고 PySimpleGUI 문서를 확인하여 더 고급 기능과 사용자 정의 옵션을 알아보세요.
These examples cover basic usage of popups in PySimpleGUI. Experiment with these templates and check the PySimpleGUI documentation for more advanced features and customization options.
728x90
마무리
- 이번 포스팅은 PysimplgeGUI 기본 팝업창 생성에 대해 알아봤습니다.
궁금한 사항은 lution2@gmail.com로 문의사항 주시면 답변 드리겠습니다. 감사합니다.
Tkinter GUI 라이브러리가 있지만, 저는 PysimpleGUI이 좀더 동작이 가볍고 구현이 쉬워 자주 활용 하고있습니다.
PySimpleGUI: PySimpleGUI는 Tkinter, Qt, WxPython, Remi를 래핑한 라이브러리입니다. 이름에서 알 수 있듯이, PySimpleGUI는 사용하기 쉬우며, 빠르게 GUI를 구축할 수 있도록 설계되었습니다. 코드가 더 짧고, 이해하기 쉬운 편이며, 빠르게 프로토타입을 만들기에 적합합니다. 다양한 테마와 위젯을 지원하여 멋진 인터페이스를 쉽게 만들 수 있습니다. PySimpleGUI를 선택하는 것은 사용의 용이성과 빠른 개발이 필요할 때 좋은 선택일 수 있습니다. 복잡한 요구 사항이 없고, 간단하면서도 효율적인 GUI를 원한다면 PySimpleGUI가 매우 적합할 것입니다. 반면, 더 복잡하고 맞춤화된 GUI가 필요하다면 Tkinter를 고려해볼 수 있습니다.
Tkinter: Tkinter는 파이썬의 표준 GUI 툴킷입니다. 광범위하게 사용되며, 파이썬 설치와 함께 기본적으로 제공됩니다. Tkinter는 매우 유연하며, 맞춤화가 가능하지만, 복잡한 인터페이스를 만들 때는 코드가 길어질 수 있습니다. 플랫폼 독립적이며, 윈도우, 맥OS, 리눅스에서 잘 작동합니다.
1. 코드리뷰
이 PySimpleGUI 스크립트는 사용자가 파일을 선택할 수 있는 간단한 파일 브라우저 GUI를 구현하고 있습니다.
import PySimpleGUI as sg
import os
current_path = os.getcwd() # Get the current working directory
layout = [
[sg.Text("Choose a file: ")],
[sg.InputText(key="-FILE-"), sg.FileBrowse(initial_folder=current_path, file_types=[("ALL Files", "*.*")])],
[sg.Button("OK"), sg.Exit()]
]
window = sg.Window("File Browser", layout)
while True:
event, values = window.read()
if event in (sg.WIN_CLOSED, "Exit"):
break
elif event == "OK":
file_path = values["-FILE-"]
if file_path:
print(f"Loaded File: {file_path}")
else:
print("No file selected.")
window.close()
위의 sg.Exit() 버튼은 sg.Button('EXIT')로 변경해서 사용하셔도 됩니다.
코드 분석 모듈 임포트: PySimpleGUI와 os 모듈을 사용합니다. PySimpleGUI는 GUI를 만드는데 사용되고, os는 현재 작업 디렉토리 경로를 얻는데 사용됩니다. 현재 디렉토리 경로: os.getcwd()를 사용하여 현재 실행중인 디렉토리 위치를 가져옵니다. GUI 레이아웃 설정: 파일을 선택할 수 있는 인터페이스와 'OK' 및 'Exit' 버튼이 포함된 GUI 레이아웃을 정의합니다. 이벤트 루프: 사용자의 입력을 기다리고, 'OK' 버튼을 누르면 파일 경로를 출력하고, 'Exit' 버튼이나 창 닫기를 통해 프로그램을 종료합니다.
이벤트 처리 개선: if event in (sg.WIN_CLOSED, "Exit") 부분은 명확하지만, elif event == "OK"는 else로 대체할 수 있습니다. 현재 구조에서는 'OK' 외의 다른 이벤트는 발생하지 않기 때문입니다.
리소스 관리: GUI 프로그램에서는 리소스 관리도 중요합니다. PySimpleGUI는 내부적으로 리소스 관리를 잘 하지만, 크고 복잡한 응용 프로그램에서는 리소스 관리를 더 신경 써야 할 수 있습니다.
오류 처리: 사용자가 파일을 선택하지 않고 'OK'를 누를 경우를 대비해 오류 처리를 추가하는 것이 좋습니다.
다른 예제 코드:
import PySimpleGUI as sg
import os
def create_file_browser():
# 현재 작업 디렉토리를 가져옵니다.
current_path = os.getcwd()
# 레이아웃을 정의합니다.
layout = [
[sg.Text("Choose a file: ")],
[sg.InputText(key="-FILE-"), sg.FileBrowse(initial_folder=current_path, file_types=[("ALL Files", "*.*")])],
[sg.Button("Open"), sg.Button("Cancel")]
]
# 윈도우 객체를 생성합니다.
window = sg.Window("File Browser", layout)
# 이벤트 루프
while True:
event, values = window.read()
if event in (None, "Cancel"):
break
if event == "Open":
file_path = values["-FILE-"]
if file_path:
sg.popup(f"You selected: {file_path}")
else:
sg.popup("No file selected.")
window.close()
# 파일 브라우저 실행
create_file_browser()
- os.getcwd() 는 현재 작업 디렉토리를 가져오는 데 사용됩니다.
- 레이아웃 생성: GUI의 레이아웃을 정의합니다. 여기에는 파일 선택을 위한 InputText와 FileBrowse 버튼, 그리고 'Open'과 'Cancel' 버튼이 포함됩니다.
- 이벤트 루프: 사용자의 입력을 처리하는 이벤트 루프입니다. 사용자가 파일을 선택하고 'Open'을 클릭하면 선택된 파일 경로를 팝업으로 표시합니다. 'Cancel'을 클릭하거나 창을 닫으면 프로그램이 종료됩니다.
2. 여러파일 또는 폴더 선택
sg.FileBrowse()에서 sg.FilesBrowse()로 변경한다. values['-FILE-']를 values['-FILE-'].split(';')로 세미콜론 단위로 파일 정보를 가져온다.
import PySimpleGUI as sg
# Create the layout for the file browser
layout = [[sg.Text('Select multiple files:')],
[sg.Input(key='-FILES-'), sg.FilesBrowse()],
[sg.Button('Submit'), sg.Button('Cancel')]]
# Create the window
window = sg.Window('File Browser', layout)
# Event loop
while True:
event, values = window.read()
if event == sg.WINDOW_CLOSED or event == 'Cancel':
break
elif event == 'Submit':
selected_files = values['-FILES-'].split(';')
print('Selected Files:', selected_files)
# Close the window
window.close()
2.폴더(디렉토리) 의 정보를 가져오기.
폴더 정보를 가져는 연습을 해보자.
이번에는 한글을 적용해서 만든 코드 예제 입니다.
import PySimpleGUI as sg
# 파일 브라우저를 위한 레이아웃 생성
layout = [[sg.Text('폴더를 선택하세요:')],
[sg.Input(key='-FOLDER-'), sg.FolderBrowse()],
[sg.Button('확인'), sg.Button('취소')]]
# 창 생성
window = sg.Window('파일 브라우저', layout)
# 이벤트 루프
while True:
event, values = window.read()
if event == sg.WINDOW_CLOSED or event == '취소':
break
elif event == '확인':
selected_folder = values['-FOLDER-']
print('선택된 폴더:', selected_folder)
# 창 닫기
window.close()
마무리
- 이번 포스팅은 PySimpleGUI의 파일 브라우저를 사용하여 Python GUI 애플리케이션에서 파일과 폴더를 선택할 수 있는 기본적인 사용법을 알아 보았습니다.
tkinter 보다 저는 주로 간단하게 PySimpleGUI을 주로 이용합니다. 모듈이름 처럼 간단한 주요 10가지 예제를 알아 봅시다.
1. 코드리뷰- 텍스트 입력창 만들기
이 예제는 간단한 텍스트 입력 윈도우를 생성합니다. "이름을 입력하세요."라는 텍스트와 입력 필드, 그리고 "확인" 버튼으로 구성되어 있습니다. "확인" 버튼을 누르면 입력된 텍스트가 출력됩니다.
import PySimpleGUI as sg
# 윈도우 생성
layout = [
[sg.Text("이름을 입력하세요.")],
[sg.InputText()],
[sg.Button("확인")]
]
window = sg.Window("간단한 텍스트 입력", layout)
# 이벤트 처리
while True:
event, values = window.read()
if event == sg.WIN_CLOSED:
break
# 입력된 텍스트 출력
print(values["input_text"])
# 윈도우 종료
window.close()
결과 화면 :
2. 코드리뷰 - 텍스트 출력
텍스트를 윈도우 창에 출력
import PySimpleGUI as sg
# 윈도우 생성
layout = [
[sg.Text("오늘은 화요일입니다.")]
]
window = sg.Window("텍스트 출력", layout)
# 윈도우 표시
window.read()
# 윈도우 종료
window.close()
결과 :
3. 코드리뷰 - 콤보 박스
이 예제는 콤보박스를 사용하여 이름을 선택하는 윈도우를 생성합니다. "선수를 선택하세요."라는 텍스트와 콤보박스, 그리고 "확인" 버튼으로 구성되어 있습니다. "확인" 버튼을 누르면 선택된 선수 이름이 출력됩니다.
import PySimpleGUI as sg
# 윈도우 생성
layout = [
[sg.Text("축구 선수를 선택하세요.")],
[sg.Combo(key='combo' ,values=["손흥민", "이강인", "김민재"], size=(30, 50))],
[sg.Button("확인")]
]
window = sg.Window("콤보박스", layout)
# 이벤트 처리
while True:
event, values = window.read()
if event == sg.WIN_CLOSED:
break
# 선택된 이름 출력
print(values["combo"])
# 윈도우 종료
window.close()
결과 화면 :
4. 코드리뷰 - 라디오 버튼
import PySimpleGUI as sg
# 윈도우 생성
layout = [
[sg.Text("성별을 선택하세요.")],
[sg.Radio("남성", "gender", key = 'gender', default=True)],
[sg.Radio("여성", "gender", key = 'gender')],
[sg.Button("확인")]
]
window = sg.Window("라디오 버튼", layout)
# 이벤트 처리
while True:
event, values = window.read()
if event == sg.WIN_CLOSED:
break
# 선택된 성별 출력
print(values["gender"])
# 윈도우 종료
window.close()
결과 화면 :
5. 코드리뷰 - 체크박스
이 예제는 체크박스를 사용하여 취미를 선택하는 윈도우를 생성합니다. "취미를 선택하세요."라는 텍스트와 체크박스 3개, 그리고 "확인" 버튼으로 구성되어 있습니다. "확인" 버튼을 누르면 선택된 취미가 출력됩니다.
import PySimpleGUI as sg
# 윈도우 생성
layout = [
[sg.Text("취미를 선택하세요.")],
[sg.Checkbox("독서", "hobby")],
[sg.Checkbox("운동", "hobby")],
[sg.Checkbox("여행", "hobby")],
[sg.Button("확인")]
]
window = sg.Window("체크박스", layout)
# 이벤트 처리
while True:
event, values = window.read()
if event == sg.WIN_CLOSED:
break
# 선택된 취미 출력
hobbies = []
for key, value in values.items():
if value:
hobbies.append(key)
print(hobbies)
# 윈도우 종료
window.close()
결과
6. 코드리뷰 - 리스트 박스
참고 : size() 속성을 (-1, -1)로 설정하면 콤보 박스의 크기가 윈도우 크기에 맞게 자동으로 조정됩니다.
import PySimpleGUI as sg
# 윈도우 생성
layout = [
[sg.Text("선수를 선택하세요.")],
[sg.Listbox(values=["손흥민", "김민재", "이강인", "황희찬"], size=(10,5), key='listbox')],
[sg.Button("확인")]
]
window = sg.Window("리스트박스", layout)
# 이벤트 처리
while True:
event, values = window.read()
if event == sg.WIN_CLOSED:
break
# 선택된 이름 출력
print(values["listbox"])
# 윈도우 종료
window.close()
결과
7. 코드리뷰 - 슬라이더
import PySimpleGUI as sg
# 윈도우 생성
layout = [
[sg.Text("밝기를 조절하세요.")],
[sg.Slider(range=(0, 100), default_value=50, orientation="horizontal")],
[sg.Button("확인")]
]
window = sg.Window("슬라이더", layout)
# 이벤트 처리
while True:
event, values = window.read()
if event == sg.WIN_CLOSED:
break
# 슬라이더 값 출력
print(values["slider"])
# 윈도우 종료
window.close()
결과
8. 코드리뷰 -텍스트 에디터 , 여러 문장 출력하기
이 예제는 텍스트 에디터를 사용하여 텍스트를 입력하는 윈도우를 생성합니다.
import PySimpleGUI as sg
# 윈도우 생성
layout = [
[sg.Text("텍스트를 입력하세요.")],
[sg.Multiline(size=(50, 10),key='multiline')],
[sg.Button("확인")]
]
window = sg.Window("텍스트 에디터", layout)
# 이벤트 처리
while True:
event, values = window.read()
if event == sg.WIN_CLOSED:
break
# 입력된 텍스트 출력
print(values["multiline"])
# 윈도우 종료
window.close()
이 코드는 pandas를 사용하여 CSV 파일에서 데이터를 읽어와서 특정 날짜 범위에 해당하는 데이터를 추출하는 작업
1. 코드 리뷰
import pandas as pd
# CSV 파일 또는 다른 소스에서 데이터프레임을 읽어옴 (예: read_csv) df = pd.read_csv('your_data.csv', parse_dates=['date_column'])
# 특정 날짜 이후의 데이터 추출 start_date = '2023-01-01' filtered_df = df[df['date_column'] >= start_date]
# 특정 날짜 이전의 데이터 추출 end_date = '2023-01-31' filtered_df = df[df['date_column'] <= end_date]
위의 내용으로 정리한 코드
import pandas as pd
# 데이터 읽기
df = pd.read_csv('your_data.csv', parse_dates=['date_column'])
# 특정 날짜 범위 추출
start_date = '2023-01-01'
end_date = '2023-01-31'
# 조건을 합쳐서 한 번에 필터링
filtered_df = df[(df['date_column'] >= start_date) & (df['date_column'] <= end_date)]
두 번의 필터링을 하나로 합치면 코드가 간결해지고 가독성이 향상됩니다. 또한, 필터링된 데이터프레임을 생성하고 저장하는 데 필요한 메모리 및 연산 비용을 줄일 수 있습니다.
필터링된 데이터를 보존하는 방법은 여러 가지가 있습니다.
새로운 변수에 할당: 필터링된 데이터를 새로운 변수에 할당하여 원본 데이터를 보존할 수 있습니다. 복사: copy() 메서드를 사용하여 데이터프레임을 복사하고, 이후에 필터링을 적용합니다. 인덱싱: 필터링된 결과를 인덱싱하여 새로운 데이터프레임을 생성합니다.
while True: event, values = window.read() if event in (sg.WIN_CLOSED, 'Exit'): break elif event == 'Book a Ticket': sg.popup(ticket_Info(values)) window.close()
마무리
- 이번 포스팅은 PySimpleGUI로 달력을 활용한 간단한 메뉴를 만드는법에 대해 알아봤습니다.