일전에 파이썬과 텔레그램을 이용하여 KTX 열차표 자동예매를 만들었습니다. 이번에는 PC에서 PyQt5로 프로그램을 만들어 SRT 열차표 예매하는 프로그램을 만들어 보겠습니다.
아래는 결과화면입니다.1초단위로 계속 브라우저 새로고침을 하며 열차표 자리가 나면 바로 예약합니다.😎
결과화면
사실 이전 텔레그램을 이용하여 KTX 열차표 예매하는 코딩짜기보다 훨씬 난이도는 낮지만 웹 크롤링이라는 것이 참... 어렵진 않은데 피로도가 쌓이는 작업입니다. 말로 설명하긴 어려운데 정말 다양한 케이스가 있어 그것에 맞는 코드를 찾는데 참 삽질을 많이 했습니다.
사용한 파이썬 라이브러리는 다음과 같습니다.
PyQt5
(pip install pyqt5)Selenium
(pip install selenium)sys
(내장 라이브러리, pyqt5를 돌리는데 필수로 들어갑니다.)time
(내장 라이브러리, 중간중간 시간 딜레이를 줄 때 사용합니다.)datetime
(내장 라이브러리, 년월일 데이터를 가공하는데 쓰입니다.)playsound
(내장 라이브러리, mp3 파일을 재생하는데 쓰입니다. 매크로 돌려놓고 딴일하다가 예약하면 음악이 재생되도록 했습니다.😋)
PyQt5
는 파이썬 프로그램을 GUI로 구현해 주는 프로그램입니다. 대표적으로 Tkinter
, Pygame
등이 있고 아예 웹브라우저로 구현할 때는 Flask
를 사용하기도 합니다. 각각의 경우에 맞는 프로그램을 쓰는것이 가장 좋겠지요.
그리고 PyQt5
를 설치하면 Qt Designer
라는 툴을 제공하는데 직접 레이아웃을 짤 수 있습니다. 훨씬 편하지요. Qt Designer
의 경로는 별도의 가상환경을 세팅하여 설치하지 않았다면 다음의 경로에 있습니다.
C:\Users\내이름\AppData\Local\Programs\Python\Python38\Lib\site-packages\qt5_applications\Qt\bin\designer.exe
파일을 찾았으면 바로가기로 빼 놓읍시다. 매번 들어가기 귀찮으니..
기본적인 프로그램의 구동 순서를 이해하고 진행하는 것은 중요할 것 같습니다. 뭐든지 그렇지만 삽질을 최소화하기 위해서는 아이디어 만큼이나 기획이 중요합니다.
- 파이어폭스 웹브라우저 구동
- SRT 웹페이지로 이동하여 자동 로그인 및 예매화면으로 이동(최초 1번만 수행)
- PyQt GUI 창 오픈
- 출발지, 목적지, 날짜, 시간을 입력하고 검색 (반복가능)
- SRT 웹페이지에서 검색하여 PyQt로 전송
- SRT 웹페이지를 보고 원하는 좌석이 매진일경우 PyQt화면의 예약에 Check한 후 아래 예약 시도를 클릭
- 예약할때까지 계속 창을 새로고침하다가 자리가 나면 바로 예약하고 mp3를 재생해줌.
이제 본격적인 코딩을 해 봅시다.🤓
PyQt5, Qt Designer로 Layout 짜기
왼쪽 상단에 원하는 정보(출발지/목적지/일자/시간)를 선택하고 검색하는 화면입니다. 그리고 왼쪽에는 검색 후 결과를 보여주는 화면이며 왼쪽하단에 예약시도 버튼이 있습니다. 그리고 오른쪽 SRT 지도는 출발지/목적지를 선택하는 참고일 뿐 별다른 기능은 없습니다.
항상 여러 파일이 모여있는 파이썬 프로그램을 코딩할 경우 실행파일은 __init__.py
로 작성해 봅니다.
일단 기본적인 PyQt5의 기본창이 뜨는 필수적인 코딩입니다.
from PyQt5 import QtWidgets
from PyQt5 import uic
from PyQt5.QtCore import *
from srt_book import SRT_page
import sys
import time
import playsound
import datetime
class Form(QtWidgets.QDialog):
def __init__(self, parent=None):
QtWidgets.QDialog.__init__(self, parent)
self.ui = uic.loadUi("gui.ui")
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = Form()
sys.exit(app.exec())
일단 관련된 모든 모듈을 불러옵니다. PyQt5
안에서도 세부적인 모듈이 있어 세가지로 나뉘어 있는데 그냥 저렇게 사용합시다.
그리고 from srt_book import SRT_page
는 짐작하시듯 srt_book.py
안의 SRT_page
라는 클래스를 불러옵니다.
그리고 이어서 위와 같이 작성했는데 다른 건 그대로 사용하고 self.ui = uic.loadUi("gui.ui")
는 제가 앞서 언급한 Qt Designer를 통해서 만든 레이아웃을 불러오는 구문입니다. gui.ui에는 각 요소들(레이블, 버튼, 표, 그림)들의 위치정보를 포함한 각종 정보들이 모두 코딩으로 들어있습니다.
그리고 우리는 __init__.py
에는 각 요소들의 이름만 가져와서 각종 event를 넣어 구동하게 만들면 됩니다.
기본적인 Qt Designer 사용법을 알아봅니다.
새 폼 만들기
를 통해 Main Window
를 만듧니다.
위의 사진과 같이 오른쪽 동그라미는 창이름과 창의 크기를 설정하는 메뉴이고 다른 수많은 메뉴들은 창의 속성을 컨트롤합니다.
창 사이즈 변경 불가/가능 등과 같은 설정들이 있겠지요.
그리고 왼쪽의 각종 요소들을 내 폼에 끌어와 레이아웃을 구성하는 것입니다. 본 프로그램의 경우 다음의 요소들을 끌어왔습니다.
- QComboBox : 출발지/도착지 선택하는 메뉴입니다.
- QDateEdit : 날짜 선택 메뉴입니다.
- QLabel : 오른쪽 SRT 지도표시에 사용되었습니다. 가장 일반적인 특징없는 요소라고 보시면 됩니다.
- QCheckBox : 예약 체크 버튼입니다.
- QTableWidget : 검색후 기차편 정보가 보여지는 테이블 위젯입니다.
- QPushButton : 열차편 검색/예약 시도 버튼
그리고 위의 그림 오른쪽 상단과 같이 내가 각 요소를 내 폼에 끌어놓으면 오른쪽 객체 탐색기에 추가가 되고 왼쪽은 이름(곧 변수명)이고 오른쪽은 요소 속성(클래스)이 나옵니다.
각 요소들의 사용법은 실제로 사용할 때 설명하도록 하겠습니다.
첨부 파일을 참고하셔서 전체 레이아웃을 확인하세요. (SRT 지도 그림파일도 함께)
그리고 __init__.py
파일에 추가한 요소들에 대한 변수를 저장합니다.
class Form(QtWidgets.QDialog):
def __init__(self, parent=None):
QtWidgets.QDialog.__init__(self, parent)
self.ui = uic.loadUi("gui.ui")
self.dep = self.ui.depCity #출발지
self.arr = self.ui.arrCity #도착지
self.dat = self.ui.depDate #출발일
self.hou = self.ui.depHour #출발시간
self.table = self.ui.resTable #검색결과 표
self.check_list = [self.ui.checkBox_01, #체크박스 10개
self.ui.checkBox_02,
self.ui.checkBox_03,
self.ui.checkBox_04,
self.ui.checkBox_05,
self.ui.checkBox_06,
self.ui.checkBox_07,
self.ui.checkBox_08,
self.ui.checkBox_09,
self.ui.checkBox_10
]
self.ui.show()
SRT 지도는 어떠한 기능도 없기때문에 저장할 필요가 없고 검색 버튼과 예약하기 버튼은 잠시 홀딩합니다.
그리고 창을 띄우는 self.ui.show()
도 추가해봅시다.
이제 프로그램을 실행하면 기본적인 Layout이 작성 되었습니다.😎
Python, SRT 자동예매(매크로) 프로그램 만들기 (feat. PyQt5) - 1. 시작, 레이아웃 작성
Python, SRT 자동예매(매크로) 프로그램 만들기 (feat. PyQt5) - 2. Selenium 원격 컨트롤
Python, SRT 자동예매(매크로) 프로그램 만들기 (feat. PyQt5) - 3. 자동 예매, 매크로, 끝