본문 바로가기
소프트웨어/파이썬

[파이썬]PySimpleGUI - 간략한 소개

by 만들오 2022. 2. 7.
728x90
안녕하세요? 만들오 입니다.

최근 진행중인 리니지W 매크로 프로젝트에서 가장 큰 고민을 하게 만든것이 바로 GUI입니다.

얼마 전 OpenCV로 직접 GUI를 만들어 보기도 했는데 아쉬운 부분이 너무 많았습니다.

이것저것 라이브러리를 사용해봤지만, PySimpleGUI가 가장 쉽고 편리했습니다.

리니지W 매크로 V4를 위해 초안으로 사용했던 코드를 이용해 소개를 하겠습니다.

PySimpleGUI로 만든 GUI

 

import PySimpleGUI as sg      

sg.theme('DarkGray') #테마 설정

s1 = (8, None) # 1st column size
s2 = (3, None) # I size
s3 = (11, None)

row1 = [sg.T("캐릭터명", size=s1), sg.I(size=(18,None)), sg.B("시작하기", size=(6,None)), sg.B("저장하기", size=(6,None)), sg.B("불러오기", size=(6,None))]
row2 = [sg.T("사용모드", size=s1), sg.R("아두이노", "mode"), sg.R("화상 키보드", "mode"), sg.T("옵션"), sg.I(size=(13,None))]
row3 = [sg.T("HP:", size=s1), sg.Im(filename=""), sg.B("변경")]
row4 = [sg.T("MP:", size=s1), sg.Im(filename=""), sg.B("변경")]
row5 = [sg.CB("귀환", size=s1), sg.T("최소:"), sg.I(size=s2), sg.T("최대:"), sg.I(size=s2), sg.T("키:"), sg.I(size=s2), sg.T("쿨타임:"), sg.I(size=s2)]
row6 = [sg.CB("순간이동", size=s1), sg.T("최소:"), sg.I(size=s2), sg.T("최대:"), sg.I(size=s2), sg.T("키:"), sg.I(size=s2), sg.T("쿨타임:"), sg.I(size=s2)]
row7 = [sg.CB("힐", size=s1), sg.T("최소:"), sg.I(size=s2), sg.T("최대:"), sg.I(size=s2), sg.T("키:"), sg.I(size=s2), sg.T("쿨타임:"), sg.I(size=s2)]
row8 = [sg.CB("HP타이머", size=s1), sg.T("최소:"), sg.I(size=s2), sg.T("최대:"), sg.I(size=s2), sg.T("키:"), sg.I(size=s2), sg.T("쿨타임:"), sg.I(size=s2)]
row9 = [sg.CB("MP타이머", size=s1), sg.T("최소:"), sg.I(size=s2), sg.T("최대:"), sg.I(size=s2), sg.T("키:"), sg.I(size=s2), sg.T("쿨타임:"), sg.I(size=s2)]
row10 = [sg.B("가방열기", size=s3), sg.B("텔레그램 연결", size=s3), sg.B("사용 방법", size=s3), sg.B("후원하기", size=s3)]

layout = [row1, row2, row3, row4, row5, row6, row7, row8, row9, row10]

window = sg.Window('LinW Macro V4 @MANDLOH', layout)
while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED: break
    print(event)

window.close()

 

이정도면 정말 심플합니다.👏👏👏

 

row1 ~ row10으로, 각 행의 위젯들을 배치하고 이를 layout에 집어넣어 쌓는 방식으로 사용했습니다.

행 안의 위젯들은 정식 명칭을 축약해서 썼는데 아래와 같습니다.

  • sg.T() = sg.Text()
  • sg.B() = sg.Button()
  • sg.I() = sg.InputText()
  • sg.CB() = sg.Combo()
  • sg.Im() = sg.Image()

파라미터는 위젯별로 차이가 있어 공식 홈페이지를 참고해야 합니다.

https://pysimplegui.readthedocs.io/en/latest/call%20reference/

 

Call reference - PySimpleGUI

 

pysimplegui.readthedocs.io

 

이 상태에서 버튼을 클릭하면, 버튼의 라벨이 출력됩니다.

 

만약, 동일한 라벨을 사용해야 한다면 어떻게 해야 할까요?

위젯에 key값을 넣으면 됩니다.

[sg.B("안녕", key="btn1"), sg.B("안녕", key="btn2")]

key값을 넣은 버튼은 event값으로 key값이 출력됩니다.

공식 홈페이지에 예제도 약 200여개나 있어 따라하기도 쉽습니다.

 

 

파이썬을 이용한 GUI구성을 배우고 싶다면 PySimpleGUI로 시작하시길 추천드리겠습니다.

궁금하신 부분은 댓글을 남겨주세요.

감사합니다.

[끝].

댓글