본문 바로가기
프로젝트/SRT&KTX 매진표 예매

SRT&KTX 기차표 매크로 예매 - (5) UI 만들기 (PyQt5)

by 매크로메이커 2024. 1. 12.

기본적인 기능은 구현이 다 됐으나, 매 번 코드를 바꿔가며 예매하기는 힘드니 UI를 만들어보자.

 

우선은 실행파일로 제작하고 추후 웹을 구축해볼까 한다.

 

Python 기반으로 제작되었기에 PyQT를 이용해서 UI를 제작한다.

 

속도를 위해 Qt Designer 툴을 이용하자.

 

UI에 들어가야할 기능은 아래와 같다.

  • SRT / KTX 선택
  • 로그인
  • 로그인 상태 확인
  • 출발역, 도착역, 시간, 날짜, 시간, 인원 등 예매 관련 정보
  • 예매 시작 버튼 ( = 중단 버튼)
  • 예매 시도 주기 설정
  • 에러 로그 창
  • 예매 시도 상태 확인 창

에매 프로그램 초안

Qt Designer를 이용하면 .ui파일로 나오는데, 결과물로 exe나 dmg 파일을 만들고 싶으므로 .py 확장자로 변경해준다.

python -m PyQt5.uic.pyuic -x [변환대상.ui] -o [변환완료이름.py]

 

 

main.py
import sys

from PyQt5.QtWidgets import QApplication, QDialog

from srt.srt import SRT

from design import Ui_dialog


# 프로그램 메인을 담당하는 Class 선언
class UiMainClass(QDialog):
    def __init__(self):
        QDialog.__init__(self)
        # UI 선언
        main_ui = Ui_dialog()
        # UI 준비
        main_ui.setupUi(self)
        # 화면을 보여준다.
        self.show()

if __name__ == "__main__":

    srt = SRT()

    app = QApplication(sys.argv)
    window = UiMainClass()
    app.exec_()
    # srt.login('1', srt_id, srt_pwd)
    # schedules = srt.fetch_schedule('수서', '부산', '20240112', '053100', 1, 0, 0, 0, 0)
    #
    # srt.book_ticket(1, 0, 0, 0, 0, schedules[0], '000', '015', True, True)

 

srt 예매 관련 코드를 분리해내고, qt 코드 위와 같이 구성하고 실행하면 잘 뜨는 것을 확인할 수 있다.

예매 프로그램 실행 화면

 

이제 각 ui 요소들과 코드를 연결시키자.

 

main.py
import sys
import time

from PyQt5.QtCore import Qt, QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QDialog, QTableWidgetItem, QRadioButton, QWidget, QHBoxLayout, QMessageBox

from design import Ui_dialog
from srt.srt import SRT

from util import *

max_error_log = 20
max_try_log = 100


class SrtThread(QThread):
    reservation_func = pyqtSignal()
    update_ctr_signal = pyqtSignal(int)

    def __init__(self, parent):
        super().__init__(parent)
        self.parent = parent
        self.running = False

    def isRunning(self):
        return self.running

    def stop(self):
        self.running = False
        self.quit()
        self.wait(3000)     # 종료 대기

    def run(self):
        self.running = True
        ctr = 0

        while self.running:
            ctr += 1
            self.reservation_func.emit()
            self.update_ctr_signal.emit(ctr)
            time.sleep(float(self.parent.main_ui.doubleSpinBox_srt_delay.text()))


class UiMainClass(QDialog):
    def __init__(self):
        self.srt = SRT(self.error_callback, self.srt_try_callback)
        self.srt_stations = self.srt.get_stations()
        self.srt_thread = None

        self.radiobuttons = []
        self.schedules = []

        self.reservation_list = []
        self.reservation_idx = 0

        QDialog.__init__(self)
        # UI 선언
        self.main_ui = Ui_dialog()
        # UI 준비
        self.main_ui.setupUi(self)
        self.init_ui()
        # 화면을 보여준다.
        self.show()

    def init_ui(self):
        self.main_ui.label_srt_logged_in.hide()

        ### SRT ###
        self.main_ui.comboBox_srt_adult.setCurrentIndex(1)
        self.main_ui.comboBox_srt_dpt_stn.addItems(self.srt_stations.keys())
        self.main_ui.comboBox_srt_arv_stn.addItems(self.srt_stations.keys())
        self.main_ui.comboBox_srt_arv_stn.setCurrentIndex(1)

        self.main_ui.dateTimeEdit_srt_time.setDateTime(datetime.datetime.now())

        self.main_ui.pushButton_srt_reservation.setStyleSheet("QPushButton{background-color : lightblue;}")

        # 로그인 타입 변경
        self.main_ui.comboBox_srt_login_type.currentIndexChanged.connect(self.comboBox_srt_login_type_changed)
        # 로그인
        self.main_ui.pushButton_srt_login.clicked.connect(self.pushButton_srt_login_clicked)
        # 열차 조회
        self.main_ui.pushButton_srt_search.clicked.connect(self.pushButton_srt_search_clicked)
        # 열차 예매
        self.main_ui.pushButton_srt_reservation.clicked.connect(self.pushButton_srt_reservation_clicked)

    def comboBox_srt_login_type_changed(self):
        self.main_ui.label_srt_id.setText(self.main_ui.comboBox_srt_login_type.currentText())

    def pushButton_srt_login_clicked(self):
        login_type = self.main_ui.comboBox_srt_login_type.currentIndex()
        srt_id = self.main_ui.lineEdit_srt_id.text()
        srt_pwd = self.main_ui.lineEdit_srt_pwd.text()

        if self.srt.login(str(login_type + 1), srt_id, srt_pwd):
            # 로그인 성공
            self.main_ui.groupBox_login.hide()
            self.main_ui.label_srt_logged_in.setText(f'로그인 계정 : {srt_id}')
            self.main_ui.label_srt_logged_in.show()

    def pushButton_srt_search_clicked(self):
        dptRsStnCdNm = self.main_ui.comboBox_srt_dpt_stn.currentText()
        arvRsStnCdNm = self.main_ui.comboBox_srt_arv_stn.currentText()
        dptDt = self.main_ui.dateTimeEdit_srt_time.date().toString('yyyyMMdd')
        dptTm = self.main_ui.dateTimeEdit_srt_time.time().toString('HHmmss')
        adult = self.main_ui.comboBox_srt_adult.currentIndex()
        child = self.main_ui.comboBox_srt_child.currentIndex()
        senior = self.main_ui.comboBox_srt_senior.currentIndex()
        svrDsb = self.main_ui.comboBox_srt_svrDsb.currentIndex()
        mldDsb = self.main_ui.comboBox_srt_mldDsb.currentIndex()
        chtnDvCd = '1'  # 직통
        locSeatAttCd1 = self.get_srt_locSeatAttCd()
        rqSeatAttCd1 = self.get_srt_rqSeatAttCd()
        trnGpCd = '300' # SRT
        dlayTnumAplFlg = 'Y'

        if dptRsStnCdNm == arvRsStnCdNm:
            self.error_callback('열차 조회 실패', '출발역과 도착역이 같습니다')
            return False
        self.schedules = self.srt.fetch_schedule(dptRsStnCdNm, arvRsStnCdNm, dptDt, dptTm, adult, child, senior, svrDsb,
                                                 mldDsb, chtnDvCd, locSeatAttCd1, rqSeatAttCd1, trnGpCd, dlayTnumAplFlg)

        # 기차 스케쥴 초기화
        self.radiobuttons = []
        self.main_ui.tableWidget_srt_schedule.setRowCount(0)

        for idx, schedule in enumerate(self.schedules):
            dptTm = schedule['dptTm'][0:2] + ':' + schedule['dptTm'][2:4]

            self.main_ui.tableWidget_srt_schedule.insertRow(idx)
            self.main_ui.tableWidget_srt_schedule.setItem(idx, 0, QTableWidgetItem(str(int(schedule['trnNo']))))
            self.main_ui.tableWidget_srt_schedule.setItem(idx, 1, QTableWidgetItem(schedule['dptRsStnCdNm']))
            self.main_ui.tableWidget_srt_schedule.setItem(idx, 2, QTableWidgetItem(schedule['arvRsStnCdNm']))
            self.main_ui.tableWidget_srt_schedule.setItem(idx, 3, QTableWidgetItem(dptTm))

            self.main_ui.tableWidget_srt_schedule.item(idx, 0).setTextAlignment(Qt.AlignCenter)
            self.main_ui.tableWidget_srt_schedule.item(idx, 1).setTextAlignment(Qt.AlignCenter)
            self.main_ui.tableWidget_srt_schedule.item(idx, 2).setTextAlignment(Qt.AlignCenter)
            self.main_ui.tableWidget_srt_schedule.item(idx, 3).setTextAlignment(Qt.AlignCenter)

            radiobutton = QRadioButton()
            radiobutton.setAutoExclusive(False)
            self.radiobuttons.append(radiobutton)
            cellWidget = QWidget()
            layoutCB = QHBoxLayout(cellWidget)
            layoutCB.addWidget(self.radiobuttons[-1])
            layoutCB.setAlignment(Qt.AlignCenter)
            layoutCB.setContentsMargins(0, 0, 0, 0)
            cellWidget.setLayout(layoutCB)

            self.main_ui.tableWidget_srt_schedule.setCellWidget(idx, 4, cellWidget)

    def pushButton_srt_reservation_clicked(self):
        if not self.srt_thread:
            self.srt_thread = SrtThread(self)
            self.srt_thread.reservation_func.connect(self.reservation_func)
            self.srt_thread.update_ctr_signal.connect(self.update_ctr)

        if self.srt_thread.isRunning():     # 동작 중일 때
            self.srt_thread.stop()
            self.main_ui.pushButton_srt_reservation.setStyleSheet("QPushButton{background-color : lightblue;}")
            self.main_ui.pushButton_srt_reservation.setText('예매시작')
        else:                   # 동작 중 아닐 때
            self.main_ui.tableWidget_srt_try_log.setRowCount(0)
            self.reservation_list = []
            self.reservation_idx = 0
            adult = self.main_ui.comboBox_srt_adult.currentIndex()
            child = self.main_ui.comboBox_srt_child.currentIndex()
            senior = self.main_ui.comboBox_srt_senior.currentIndex()
            svrDsb = self.main_ui.comboBox_srt_svrDsb.currentIndex()
            mldDsb = self.main_ui.comboBox_srt_mldDsb.currentIndex()

            for idx, radiobutton in enumerate(self.radiobuttons):
                if radiobutton.isChecked():
                    class_idx = self.main_ui.comboBox_srt_class.currentIndex()
                    if class_idx == 0 or class_idx == 2:
                        self.reservation_list.append({
                            'adult': adult,
                            'child': child,
                            'senior': senior,
                            'svrDsb': svrDsb,
                            'mldDsb': mldDsb,
                            'train_schedule': self.schedules[idx],
                            'locSeatAttCd': self.get_srt_locSeatAttCd(),
                            'rqSeatAttCd': self.get_srt_rqSeatAttCd(),
                            'isReservation': self.main_ui.radioButton_srt_waiting.isChecked(),
                            'isBusiness': False,
                        })
                    if class_idx == 1 or class_idx == 2:
                        self.reservation_list.append({
                            'adult': adult,
                            'child': child,
                            'senior': senior,
                            'svrDsb': svrDsb,
                            'mldDsb': mldDsb,
                            'train_schedule': self.schedules[idx],
                            'locSeatAttCd': self.get_srt_locSeatAttCd(),
                            'rqSeatAttCd': self.get_srt_rqSeatAttCd(),
                            'isReservation': self.main_ui.radioButton_srt_waiting.isChecked(),
                            'isBusiness': True,
                        })

            if not self.srt.is_logged_in():
                self.error_callback('예매 실패', '로그인을 먼저 해주세요')
                return False
            if adult + child + senior + svrDsb + mldDsb < 1:
                self.error_callback('예매 실패', '인원을 선택해주세요')
                return False
            if not self.schedules:
                self.error_callback('예매 실패', '열차 조회를 먼저 해주세요')
                return False
            if not self.reservation_list:
                self.error_callback('예매 실패', '선택된 열차가 없습니다')
                return False

            self.srt_thread.start()
            self.main_ui.pushButton_srt_reservation.setStyleSheet("QPushButton{background-color : red;}")
            self.main_ui.pushButton_srt_reservation.setText('예매중지')

    def reservation_func(self):
        rsv_item = self.reservation_list[self.reservation_idx]
        success = self.srt.book_ticket(
            rsv_item['adult'],
            rsv_item['child'],
            rsv_item['senior'],
            rsv_item['svrDsb'],
            rsv_item['mldDsb'],
            rsv_item['train_schedule'],
            rsv_item['locSeatAttCd'],
            rsv_item['rqSeatAttCd'],
            rsv_item['isReservation'],
            rsv_item['isBusiness'],
        )

        self.reservation_idx = (self.reservation_idx+1) % len(self.reservation_list)

        if success:
            self.srt_thread.stop()
            self.main_ui.pushButton_srt_reservation.setStyleSheet("QPushButton{background-color : lightblue;}")
            self.main_ui.pushButton_srt_reservation.setText('예매시작')
            QMessageBox.about(self, '예매 성공', '10분 내에 앱에서 결제해주세요')

    def get_srt_locSeatAttCd(self): # 좌석 위치
        idx = self.main_ui.comboBox_srt_locSeatAttCd.currentIndex()
        if idx == 0:
            return "000"    # default
        elif idx == 1:
            return "011"    # 1인석
        elif idx == 2:
            return "012"    # 창측좌석
        elif idx == 3:
            return "013"    # 내측좌석
        else:
            self.error_callback('좌석 위치 인덱스 에러', f"인덱스 - {idx}")
            return "000"

    def get_srt_rqSeatAttCd(self):  # 좌석 종류
        idx = self.main_ui.comboBox_srt_rqSeatAttCd.currentIndex()
        if idx == 0:
            return "015"    # 일반
        elif idx == 1:
            return "021"    # 휠체어
        elif idx == 2:
            return "028"    # 전동휠체어
        else:
            self.error_callback('좌석 종류 인덱스 에러', f"인덱스 - {idx}")
            return "015"    # 일반

    def update_ctr(self, ctr):
        self.main_ui.lcdNumber_srt_ctr.display(ctr)

    def srt_try_callback(self, success, reason, detail_info):
        self.main_ui.tableWidget_srt_try_log.insertRow(0)
        self.main_ui.tableWidget_srt_try_log.setItem(0, 0, QTableWidgetItem(get_nowtime()))
        self.main_ui.tableWidget_srt_try_log.setItem(0, 1, QTableWidgetItem("성공" if success else "실패"))
        self.main_ui.tableWidget_srt_try_log.setItem(0, 2, QTableWidgetItem(reason))
        self.main_ui.tableWidget_srt_try_log.setItem(0, 3, QTableWidgetItem(detail_info))

        # 일정 개수 이상 로그가 쌓이면 삭제
        if self.main_ui.tableWidget_srt_try_log.rowCount() > max_try_log:
            self.main_ui.tableWidget_srt_try_log.removeRow(max_try_log)

        self.main_ui.tableWidget_srt_try_log.resizeColumnToContents(0)
        self.main_ui.tableWidget_srt_try_log.resizeColumnToContents(1)
        self.main_ui.tableWidget_srt_try_log.resizeColumnToContents(2)
        self.main_ui.tableWidget_srt_try_log.resizeRowsToContents()

    def error_callback(self, type_, detail_):
        self.main_ui.tableWidget_error_log.insertRow(0)
        self.main_ui.tableWidget_error_log.setItem(0, 0, QTableWidgetItem(get_nowtime()))
        self.main_ui.tableWidget_error_log.setItem(0, 1, QTableWidgetItem(type_))
        self.main_ui.tableWidget_error_log.setItem(0, 2, QTableWidgetItem(detail_))

        # 일정 개수 이상 로그가 쌓이면 삭제
        if self.main_ui.tableWidget_error_log.rowCount() > max_error_log:
            self.main_ui.tableWidget_error_log.removeRow(max_error_log)

        self.main_ui.tableWidget_error_log.resizeColumnToContents(0)
        self.main_ui.tableWidget_error_log.resizeColumnToContents(1)
        self.main_ui.tableWidget_error_log.resizeRowsToContents()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = UiMainClass()
    app.exec_()
design.py
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'design.ui'
#
# Created by: PyQt5 UI code generator 5.15.10
#
# 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.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_dialog(object):
    def setupUi(self, dialog):
        dialog.setObjectName("dialog")
        dialog.resize(1191, 987)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(dialog.sizePolicy().hasHeightForWidth())
        dialog.setSizePolicy(sizePolicy)
        dialog.setSizeGripEnabled(False)
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(dialog)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.tabWidget = QtWidgets.QTabWidget(dialog)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(5)
        sizePolicy.setHeightForWidth(self.tabWidget.sizePolicy().hasHeightForWidth())
        self.tabWidget.setSizePolicy(sizePolicy)
        self.tabWidget.setObjectName("tabWidget")
        self.tab_srt = QtWidgets.QWidget()
        self.tab_srt.setEnabled(True)
        self.tab_srt.setAutoFillBackground(False)
        self.tab_srt.setObjectName("tab_srt")
        self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.tab_srt)
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.verticalGroupBox = QtWidgets.QGroupBox(self.tab_srt)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(1)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.verticalGroupBox.sizePolicy().hasHeightForWidth())
        self.verticalGroupBox.setSizePolicy(sizePolicy)
        self.verticalGroupBox.setObjectName("verticalGroupBox")
        self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.verticalGroupBox)
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.label_srt_logged_in = QtWidgets.QLabel(self.verticalGroupBox)
        self.label_srt_logged_in.setEnabled(True)
        font = QtGui.QFont()
        font.setPointSize(20)
        self.label_srt_logged_in.setFont(font)
        self.label_srt_logged_in.setAlignment(QtCore.Qt.AlignCenter)
        self.label_srt_logged_in.setObjectName("label_srt_logged_in")
        self.verticalLayout_3.addWidget(self.label_srt_logged_in)
        self.groupBox_login = QtWidgets.QGroupBox(self.verticalGroupBox)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(3)
        sizePolicy.setVerticalStretch(1)
        sizePolicy.setHeightForWidth(self.groupBox_login.sizePolicy().hasHeightForWidth())
        self.groupBox_login.setSizePolicy(sizePolicy)
        self.groupBox_login.setObjectName("groupBox_login")
        self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.groupBox_login)
        self.verticalLayout_6.setObjectName("verticalLayout_6")
        self.verticalWidget = QtWidgets.QWidget(self.groupBox_login)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.verticalWidget.sizePolicy().hasHeightForWidth())
        self.verticalWidget.setSizePolicy(sizePolicy)
        self.verticalWidget.setObjectName("verticalWidget")
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.verticalWidget)
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.comboBox_srt_login_type = QtWidgets.QComboBox(self.verticalWidget)
        self.comboBox_srt_login_type.setObjectName("comboBox_srt_login_type")
        self.comboBox_srt_login_type.addItem("")
        self.comboBox_srt_login_type.addItem("")
        self.comboBox_srt_login_type.addItem("")
        self.horizontalLayout_3.addWidget(self.comboBox_srt_login_type)
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_3.addItem(spacerItem)
        self.verticalLayout_6.addWidget(self.verticalWidget)
        self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
        self.verticalLayout_5 = QtWidgets.QVBoxLayout()
        self.verticalLayout_5.setContentsMargins(-1, -1, -1, 0)
        self.verticalLayout_5.setObjectName("verticalLayout_5")
        self.horizontalLayout_9 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_9.setObjectName("horizontalLayout_9")
        self.label_srt_id = QtWidgets.QLabel(self.groupBox_login)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(1)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.label_srt_id.sizePolicy().hasHeightForWidth())
        self.label_srt_id.setSizePolicy(sizePolicy)
        self.label_srt_id.setObjectName("label_srt_id")
        self.horizontalLayout_9.addWidget(self.label_srt_id)
        self.lineEdit_srt_id = QtWidgets.QLineEdit(self.groupBox_login)
        self.lineEdit_srt_id.setEnabled(True)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(5)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.lineEdit_srt_id.sizePolicy().hasHeightForWidth())
        self.lineEdit_srt_id.setSizePolicy(sizePolicy)
        self.lineEdit_srt_id.setObjectName("lineEdit_srt_id")
        self.horizontalLayout_9.addWidget(self.lineEdit_srt_id)
        self.verticalLayout_5.addLayout(self.horizontalLayout_9)
        self.horizontalLayout_6 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_6.setContentsMargins(-1, 0, -1, -1)
        self.horizontalLayout_6.setObjectName("horizontalLayout_6")
        self.label_srt_pwd = QtWidgets.QLabel(self.groupBox_login)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(1)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.label_srt_pwd.sizePolicy().hasHeightForWidth())
        self.label_srt_pwd.setSizePolicy(sizePolicy)
        self.label_srt_pwd.setObjectName("label_srt_pwd")
        self.horizontalLayout_6.addWidget(self.label_srt_pwd)
        self.lineEdit_srt_pwd = QtWidgets.QLineEdit(self.groupBox_login)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(5)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.lineEdit_srt_pwd.sizePolicy().hasHeightForWidth())
        self.lineEdit_srt_pwd.setSizePolicy(sizePolicy)
        self.lineEdit_srt_pwd.setInputMethodHints(QtCore.Qt.ImhHiddenText|QtCore.Qt.ImhNoAutoUppercase|QtCore.Qt.ImhNoPredictiveText|QtCore.Qt.ImhSensitiveData)
        self.lineEdit_srt_pwd.setEchoMode(QtWidgets.QLineEdit.Password)
        self.lineEdit_srt_pwd.setObjectName("lineEdit_srt_pwd")
        self.horizontalLayout_6.addWidget(self.lineEdit_srt_pwd)
        self.verticalLayout_5.addLayout(self.horizontalLayout_6)
        self.horizontalLayout_5.addLayout(self.verticalLayout_5)
        self.pushButton_srt_login = QtWidgets.QPushButton(self.groupBox_login)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton_srt_login.sizePolicy().hasHeightForWidth())
        self.pushButton_srt_login.setSizePolicy(sizePolicy)
        self.pushButton_srt_login.setObjectName("pushButton_srt_login")
        self.horizontalLayout_5.addWidget(self.pushButton_srt_login)
        self.verticalLayout_6.addLayout(self.horizontalLayout_5)
        self.verticalLayout_3.addWidget(self.groupBox_login)
        self.groupBox_4 = QtWidgets.QGroupBox(self.verticalGroupBox)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(1)
        sizePolicy.setHeightForWidth(self.groupBox_4.sizePolicy().hasHeightForWidth())
        self.groupBox_4.setSizePolicy(sizePolicy)
        self.groupBox_4.setObjectName("groupBox_4")
        self.verticalLayout_7 = QtWidgets.QVBoxLayout(self.groupBox_4)
        self.verticalLayout_7.setObjectName("verticalLayout_7")
        self.horizontalLayout_10 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_10.setObjectName("horizontalLayout_10")
        self.comboBox_srt_class = QtWidgets.QComboBox(self.groupBox_4)
        self.comboBox_srt_class.setObjectName("comboBox_srt_class")
        self.comboBox_srt_class.addItem("")
        self.comboBox_srt_class.addItem("")
        self.comboBox_srt_class.addItem("")
        self.horizontalLayout_10.addWidget(self.comboBox_srt_class)
        self.radioButton_srt_waiting = QtWidgets.QRadioButton(self.groupBox_4)
        self.radioButton_srt_waiting.setObjectName("radioButton_srt_waiting")
        self.horizontalLayout_10.addWidget(self.radioButton_srt_waiting)
        self.horizontalLayout_16 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_16.setObjectName("horizontalLayout_16")
        self.label_5 = QtWidgets.QLabel(self.groupBox_4)
        self.label_5.setObjectName("label_5")
        self.horizontalLayout_16.addWidget(self.label_5)
        self.doubleSpinBox_srt_delay = QtWidgets.QDoubleSpinBox(self.groupBox_4)
        self.doubleSpinBox_srt_delay.setInputMethodHints(QtCore.Qt.ImhDigitsOnly|QtCore.Qt.ImhFormattedNumbersOnly)
        self.doubleSpinBox_srt_delay.setDecimals(1)
        self.doubleSpinBox_srt_delay.setSingleStep(0.2)
        self.doubleSpinBox_srt_delay.setProperty("value", 2.0)
        self.doubleSpinBox_srt_delay.setObjectName("doubleSpinBox_srt_delay")
        self.horizontalLayout_16.addWidget(self.doubleSpinBox_srt_delay)
        self.label_6 = QtWidgets.QLabel(self.groupBox_4)
        self.label_6.setObjectName("label_6")
        self.horizontalLayout_16.addWidget(self.label_6)
        self.horizontalLayout_10.addLayout(self.horizontalLayout_16)
        self.verticalLayout_7.addLayout(self.horizontalLayout_10)
        self.horizontalLayout_12 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_12.setObjectName("horizontalLayout_12")
        self.comboBox_srt_adult = QtWidgets.QComboBox(self.groupBox_4)
        self.comboBox_srt_adult.setObjectName("comboBox_srt_adult")
        self.comboBox_srt_adult.addItem("")
        self.comboBox_srt_adult.addItem("")
        self.comboBox_srt_adult.addItem("")
        self.comboBox_srt_adult.addItem("")
        self.comboBox_srt_adult.addItem("")
        self.comboBox_srt_adult.addItem("")
        self.comboBox_srt_adult.addItem("")
        self.comboBox_srt_adult.addItem("")
        self.comboBox_srt_adult.addItem("")
        self.comboBox_srt_adult.addItem("")
        self.horizontalLayout_12.addWidget(self.comboBox_srt_adult)
        self.comboBox_srt_child = QtWidgets.QComboBox(self.groupBox_4)
        self.comboBox_srt_child.setObjectName("comboBox_srt_child")
        self.comboBox_srt_child.addItem("")
        self.comboBox_srt_child.addItem("")
        self.comboBox_srt_child.addItem("")
        self.comboBox_srt_child.addItem("")
        self.comboBox_srt_child.addItem("")
        self.comboBox_srt_child.addItem("")
        self.comboBox_srt_child.addItem("")
        self.comboBox_srt_child.addItem("")
        self.comboBox_srt_child.addItem("")
        self.comboBox_srt_child.addItem("")
        self.horizontalLayout_12.addWidget(self.comboBox_srt_child)
        self.comboBox_srt_senior = QtWidgets.QComboBox(self.groupBox_4)
        self.comboBox_srt_senior.setObjectName("comboBox_srt_senior")
        self.comboBox_srt_senior.addItem("")
        self.comboBox_srt_senior.addItem("")
        self.comboBox_srt_senior.addItem("")
        self.comboBox_srt_senior.addItem("")
        self.comboBox_srt_senior.addItem("")
        self.comboBox_srt_senior.addItem("")
        self.comboBox_srt_senior.addItem("")
        self.comboBox_srt_senior.addItem("")
        self.comboBox_srt_senior.addItem("")
        self.comboBox_srt_senior.addItem("")
        self.horizontalLayout_12.addWidget(self.comboBox_srt_senior)
        self.comboBox_srt_svrDsb = QtWidgets.QComboBox(self.groupBox_4)
        self.comboBox_srt_svrDsb.setObjectName("comboBox_srt_svrDsb")
        self.comboBox_srt_svrDsb.addItem("")
        self.comboBox_srt_svrDsb.addItem("")
        self.comboBox_srt_svrDsb.addItem("")
        self.comboBox_srt_svrDsb.addItem("")
        self.comboBox_srt_svrDsb.addItem("")
        self.comboBox_srt_svrDsb.addItem("")
        self.comboBox_srt_svrDsb.addItem("")
        self.comboBox_srt_svrDsb.addItem("")
        self.comboBox_srt_svrDsb.addItem("")
        self.comboBox_srt_svrDsb.addItem("")
        self.horizontalLayout_12.addWidget(self.comboBox_srt_svrDsb)
        self.comboBox_srt_mldDsb = QtWidgets.QComboBox(self.groupBox_4)
        self.comboBox_srt_mldDsb.setObjectName("comboBox_srt_mldDsb")
        self.comboBox_srt_mldDsb.addItem("")
        self.comboBox_srt_mldDsb.addItem("")
        self.comboBox_srt_mldDsb.addItem("")
        self.comboBox_srt_mldDsb.addItem("")
        self.comboBox_srt_mldDsb.addItem("")
        self.comboBox_srt_mldDsb.addItem("")
        self.comboBox_srt_mldDsb.addItem("")
        self.comboBox_srt_mldDsb.addItem("")
        self.comboBox_srt_mldDsb.addItem("")
        self.comboBox_srt_mldDsb.addItem("")
        self.horizontalLayout_12.addWidget(self.comboBox_srt_mldDsb)
        self.verticalLayout_7.addLayout(self.horizontalLayout_12)
        self.horizontalLayout_11 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_11.setContentsMargins(-1, -1, -1, 0)
        self.horizontalLayout_11.setObjectName("horizontalLayout_11")
        self.comboBox_srt_locSeatAttCd = QtWidgets.QComboBox(self.groupBox_4)
        self.comboBox_srt_locSeatAttCd.setObjectName("comboBox_srt_locSeatAttCd")
        self.comboBox_srt_locSeatAttCd.addItem("")
        self.comboBox_srt_locSeatAttCd.addItem("")
        self.comboBox_srt_locSeatAttCd.addItem("")
        self.comboBox_srt_locSeatAttCd.addItem("")
        self.horizontalLayout_11.addWidget(self.comboBox_srt_locSeatAttCd)
        self.comboBox_srt_rqSeatAttCd = QtWidgets.QComboBox(self.groupBox_4)
        self.comboBox_srt_rqSeatAttCd.setObjectName("comboBox_srt_rqSeatAttCd")
        self.comboBox_srt_rqSeatAttCd.addItem("")
        self.comboBox_srt_rqSeatAttCd.addItem("")
        self.comboBox_srt_rqSeatAttCd.addItem("")
        self.horizontalLayout_11.addWidget(self.comboBox_srt_rqSeatAttCd)
        self.verticalLayout_7.addLayout(self.horizontalLayout_11)
        self.verticalLayout_3.addWidget(self.groupBox_4)
        self.groupBox_5 = QtWidgets.QGroupBox(self.verticalGroupBox)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(2)
        sizePolicy.setHeightForWidth(self.groupBox_5.sizePolicy().hasHeightForWidth())
        self.groupBox_5.setSizePolicy(sizePolicy)
        self.groupBox_5.setObjectName("groupBox_5")
        self.verticalLayout_8 = QtWidgets.QVBoxLayout(self.groupBox_5)
        self.verticalLayout_8.setObjectName("verticalLayout_8")
        self.horizontalLayout_13 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_13.setObjectName("horizontalLayout_13")
        self.comboBox_srt_dpt_stn = QtWidgets.QComboBox(self.groupBox_5)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(1)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.comboBox_srt_dpt_stn.sizePolicy().hasHeightForWidth())
        self.comboBox_srt_dpt_stn.setSizePolicy(sizePolicy)
        self.comboBox_srt_dpt_stn.setObjectName("comboBox_srt_dpt_stn")
        self.horizontalLayout_13.addWidget(self.comboBox_srt_dpt_stn)
        self.label_3 = QtWidgets.QLabel(self.groupBox_5)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.label_3.sizePolicy().hasHeightForWidth())
        self.label_3.setSizePolicy(sizePolicy)
        self.label_3.setObjectName("label_3")
        self.horizontalLayout_13.addWidget(self.label_3)
        self.comboBox_srt_arv_stn = QtWidgets.QComboBox(self.groupBox_5)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(1)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.comboBox_srt_arv_stn.sizePolicy().hasHeightForWidth())
        self.comboBox_srt_arv_stn.setSizePolicy(sizePolicy)
        self.comboBox_srt_arv_stn.setObjectName("comboBox_srt_arv_stn")
        self.horizontalLayout_13.addWidget(self.comboBox_srt_arv_stn)
        self.verticalLayout_8.addLayout(self.horizontalLayout_13)
        self.horizontalLayout_15 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_15.setContentsMargins(-1, -1, -1, 0)
        self.horizontalLayout_15.setObjectName("horizontalLayout_15")
        self.label_4 = QtWidgets.QLabel(self.groupBox_5)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.label_4.sizePolicy().hasHeightForWidth())
        self.label_4.setSizePolicy(sizePolicy)
        self.label_4.setObjectName("label_4")
        self.horizontalLayout_15.addWidget(self.label_4)
        self.dateTimeEdit_srt_time = QtWidgets.QDateTimeEdit(self.groupBox_5)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(2)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.dateTimeEdit_srt_time.sizePolicy().hasHeightForWidth())
        self.dateTimeEdit_srt_time.setSizePolicy(sizePolicy)
        self.dateTimeEdit_srt_time.setCalendarPopup(False)
        self.dateTimeEdit_srt_time.setObjectName("dateTimeEdit_srt_time")
        self.horizontalLayout_15.addWidget(self.dateTimeEdit_srt_time)
        self.verticalLayout_8.addLayout(self.horizontalLayout_15)
        self.pushButton_srt_search = QtWidgets.QPushButton(self.groupBox_5)
        self.pushButton_srt_search.setObjectName("pushButton_srt_search")
        self.verticalLayout_8.addWidget(self.pushButton_srt_search)
        self.tableWidget_srt_schedule = QtWidgets.QTableWidget(self.groupBox_5)
        self.tableWidget_srt_schedule.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
        self.tableWidget_srt_schedule.setObjectName("tableWidget_srt_schedule")
        self.tableWidget_srt_schedule.setColumnCount(5)
        self.tableWidget_srt_schedule.setRowCount(0)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget_srt_schedule.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget_srt_schedule.setHorizontalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget_srt_schedule.setHorizontalHeaderItem(2, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget_srt_schedule.setHorizontalHeaderItem(3, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget_srt_schedule.setHorizontalHeaderItem(4, item)
        self.tableWidget_srt_schedule.horizontalHeader().setStretchLastSection(True)
        self.verticalLayout_8.addWidget(self.tableWidget_srt_schedule)
        self.verticalLayout_3.addWidget(self.groupBox_5)
        self.pushButton_srt_reservation = QtWidgets.QPushButton(self.verticalGroupBox)
        self.pushButton_srt_reservation.setAutoFillBackground(False)
        self.pushButton_srt_reservation.setObjectName("pushButton_srt_reservation")
        self.verticalLayout_3.addWidget(self.pushButton_srt_reservation)
        self.horizontalLayout_4.addWidget(self.verticalGroupBox)
        self.groupBox_2 = QtWidgets.QGroupBox(self.tab_srt)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(1)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.groupBox_2.sizePolicy().hasHeightForWidth())
        self.groupBox_2.setSizePolicy(sizePolicy)
        self.groupBox_2.setObjectName("groupBox_2")
        self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.groupBox_2)
        self.verticalLayout_4.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_4.setObjectName("verticalLayout_4")
        self.horizontalLayout_17 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_17.setContentsMargins(-1, -1, -1, 0)
        self.horizontalLayout_17.setObjectName("horizontalLayout_17")
        self.label_7 = QtWidgets.QLabel(self.groupBox_2)
        self.label_7.setObjectName("label_7")
        self.horizontalLayout_17.addWidget(self.label_7)
        self.lcdNumber_srt_ctr = QtWidgets.QLCDNumber(self.groupBox_2)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHorizontalStretch(1)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.lcdNumber_srt_ctr.sizePolicy().hasHeightForWidth())
        self.lcdNumber_srt_ctr.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(13)
        self.lcdNumber_srt_ctr.setFont(font)
        self.lcdNumber_srt_ctr.setSegmentStyle(QtWidgets.QLCDNumber.Flat)
        self.lcdNumber_srt_ctr.setObjectName("lcdNumber_srt_ctr")
        self.horizontalLayout_17.addWidget(self.lcdNumber_srt_ctr)
        self.verticalLayout_4.addLayout(self.horizontalLayout_17)
        self.tableWidget_srt_try_log = QtWidgets.QTableWidget(self.groupBox_2)
        self.tableWidget_srt_try_log.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
        self.tableWidget_srt_try_log.setObjectName("tableWidget_srt_try_log")
        self.tableWidget_srt_try_log.setColumnCount(4)
        self.tableWidget_srt_try_log.setRowCount(0)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget_srt_try_log.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget_srt_try_log.setHorizontalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget_srt_try_log.setHorizontalHeaderItem(2, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget_srt_try_log.setHorizontalHeaderItem(3, item)
        self.tableWidget_srt_try_log.horizontalHeader().setStretchLastSection(True)
        self.verticalLayout_4.addWidget(self.tableWidget_srt_try_log)
        self.horizontalLayout_4.addWidget(self.groupBox_2)
        self.tabWidget.addTab(self.tab_srt, "")
        self.tab_ktx = QtWidgets.QWidget()
        self.tab_ktx.setObjectName("tab_ktx")
        self.tabWidget.addTab(self.tab_ktx, "")
        self.verticalLayout_2.addWidget(self.tabWidget)
        self.groupBox = QtWidgets.QGroupBox(dialog)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(1)
        sizePolicy.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth())
        self.groupBox.setSizePolicy(sizePolicy)
        self.groupBox.setObjectName("groupBox")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.groupBox)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.tableWidget_error_log = QtWidgets.QTableWidget(self.groupBox)
        self.tableWidget_error_log.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
        self.tableWidget_error_log.setObjectName("tableWidget_error_log")
        self.tableWidget_error_log.setColumnCount(3)
        self.tableWidget_error_log.setRowCount(0)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget_error_log.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget_error_log.setHorizontalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget_error_log.setHorizontalHeaderItem(2, item)
        self.tableWidget_error_log.horizontalHeader().setStretchLastSection(True)
        self.tableWidget_error_log.verticalHeader().setStretchLastSection(False)
        self.horizontalLayout.addWidget(self.tableWidget_error_log)
        self.verticalLayout_2.addWidget(self.groupBox)

        self.retranslateUi(dialog)
        self.tabWidget.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(dialog)

    def retranslateUi(self, dialog):
        _translate = QtCore.QCoreApplication.translate
        dialog.setWindowTitle(_translate("dialog", "기차표 예매 프로그램"))
        self.label_srt_logged_in.setText(_translate("dialog", "로그인 계정"))
        self.groupBox_login.setTitle(_translate("dialog", "로그인"))
        self.comboBox_srt_login_type.setItemText(0, _translate("dialog", "회원번호"))
        self.comboBox_srt_login_type.setItemText(1, _translate("dialog", "이메일"))
        self.comboBox_srt_login_type.setItemText(2, _translate("dialog", "휴대전화"))
        self.label_srt_id.setText(_translate("dialog", "회원번호"))
        self.label_srt_pwd.setText(_translate("dialog", "비밀번호"))
        self.pushButton_srt_login.setText(_translate("dialog", "로그인"))
        self.groupBox_4.setTitle(_translate("dialog", "환경설정"))
        self.comboBox_srt_class.setItemText(0, _translate("dialog", "일반실"))
        self.comboBox_srt_class.setItemText(1, _translate("dialog", "특실"))
        self.comboBox_srt_class.setItemText(2, _translate("dialog", "일반실+특실"))
        self.radioButton_srt_waiting.setText(_translate("dialog", "예약대기 신청"))
        self.label_5.setText(_translate("dialog", "예매 시도 주기"))
        self.label_6.setText(_translate("dialog", "초"))
        self.comboBox_srt_adult.setCurrentText(_translate("dialog", "성인 1명"))
        self.comboBox_srt_adult.setItemText(0, _translate("dialog", "성인 0명"))
        self.comboBox_srt_adult.setItemText(1, _translate("dialog", "성인 1명"))
        self.comboBox_srt_adult.setItemText(2, _translate("dialog", "성인 2명"))
        self.comboBox_srt_adult.setItemText(3, _translate("dialog", "성인 3명"))
        self.comboBox_srt_adult.setItemText(4, _translate("dialog", "성인 4명"))
        self.comboBox_srt_adult.setItemText(5, _translate("dialog", "성인 5명"))
        self.comboBox_srt_adult.setItemText(6, _translate("dialog", "성임 6명"))
        self.comboBox_srt_adult.setItemText(7, _translate("dialog", "성인 7명"))
        self.comboBox_srt_adult.setItemText(8, _translate("dialog", "성인 8명"))
        self.comboBox_srt_adult.setItemText(9, _translate("dialog", "성인 9명"))
        self.comboBox_srt_child.setItemText(0, _translate("dialog", "어린이 0명"))
        self.comboBox_srt_child.setItemText(1, _translate("dialog", "어린이 1명"))
        self.comboBox_srt_child.setItemText(2, _translate("dialog", "어린이 2명"))
        self.comboBox_srt_child.setItemText(3, _translate("dialog", "어린이 3명"))
        self.comboBox_srt_child.setItemText(4, _translate("dialog", "어린이 4명"))
        self.comboBox_srt_child.setItemText(5, _translate("dialog", "어린이 5명"))
        self.comboBox_srt_child.setItemText(6, _translate("dialog", "어린이 6명"))
        self.comboBox_srt_child.setItemText(7, _translate("dialog", "어린이 7명"))
        self.comboBox_srt_child.setItemText(8, _translate("dialog", "어린이 8명"))
        self.comboBox_srt_child.setItemText(9, _translate("dialog", "어린이 9명"))
        self.comboBox_srt_senior.setItemText(0, _translate("dialog", "노인 0명"))
        self.comboBox_srt_senior.setItemText(1, _translate("dialog", "노인 1명"))
        self.comboBox_srt_senior.setItemText(2, _translate("dialog", "노인 2명"))
        self.comboBox_srt_senior.setItemText(3, _translate("dialog", "노인 3명"))
        self.comboBox_srt_senior.setItemText(4, _translate("dialog", "노인 4명"))
        self.comboBox_srt_senior.setItemText(5, _translate("dialog", "노인 5명"))
        self.comboBox_srt_senior.setItemText(6, _translate("dialog", "노인 6명"))
        self.comboBox_srt_senior.setItemText(7, _translate("dialog", "노인 7명"))
        self.comboBox_srt_senior.setItemText(8, _translate("dialog", "노인 8명"))
        self.comboBox_srt_senior.setItemText(9, _translate("dialog", "노인 9명"))
        self.comboBox_srt_svrDsb.setItemText(0, _translate("dialog", "중증장애인 0명"))
        self.comboBox_srt_svrDsb.setItemText(1, _translate("dialog", "중증장애인 1명"))
        self.comboBox_srt_svrDsb.setItemText(2, _translate("dialog", "중증장애인 2명"))
        self.comboBox_srt_svrDsb.setItemText(3, _translate("dialog", "중증장애인 3명"))
        self.comboBox_srt_svrDsb.setItemText(4, _translate("dialog", "중증장애인 4명"))
        self.comboBox_srt_svrDsb.setItemText(5, _translate("dialog", "중증장애인 5명"))
        self.comboBox_srt_svrDsb.setItemText(6, _translate("dialog", "중증장애인 6명"))
        self.comboBox_srt_svrDsb.setItemText(7, _translate("dialog", "중증장애인 7명"))
        self.comboBox_srt_svrDsb.setItemText(8, _translate("dialog", "중증장애인 8명"))
        self.comboBox_srt_svrDsb.setItemText(9, _translate("dialog", "중증장애인 9명"))
        self.comboBox_srt_mldDsb.setItemText(0, _translate("dialog", "경증장애인 0명"))
        self.comboBox_srt_mldDsb.setItemText(1, _translate("dialog", "경증장애인 1명"))
        self.comboBox_srt_mldDsb.setItemText(2, _translate("dialog", "경증장애인 2명"))
        self.comboBox_srt_mldDsb.setItemText(3, _translate("dialog", "경증장애인 3명"))
        self.comboBox_srt_mldDsb.setItemText(4, _translate("dialog", "경증장애인 4명"))
        self.comboBox_srt_mldDsb.setItemText(5, _translate("dialog", "경증장애인 5명"))
        self.comboBox_srt_mldDsb.setItemText(6, _translate("dialog", "경증장애인 6명"))
        self.comboBox_srt_mldDsb.setItemText(7, _translate("dialog", "경증장애인 7명"))
        self.comboBox_srt_mldDsb.setItemText(8, _translate("dialog", "경증장애인 8명"))
        self.comboBox_srt_mldDsb.setItemText(9, _translate("dialog", "경증장애인 9명"))
        self.comboBox_srt_locSeatAttCd.setItemText(0, _translate("dialog", "모든좌석"))
        self.comboBox_srt_locSeatAttCd.setItemText(1, _translate("dialog", "1인석"))
        self.comboBox_srt_locSeatAttCd.setItemText(2, _translate("dialog", "창측좌석"))
        self.comboBox_srt_locSeatAttCd.setItemText(3, _translate("dialog", "내측좌석"))
        self.comboBox_srt_rqSeatAttCd.setItemText(0, _translate("dialog", "일반석"))
        self.comboBox_srt_rqSeatAttCd.setItemText(1, _translate("dialog", "휠체어"))
        self.comboBox_srt_rqSeatAttCd.setItemText(2, _translate("dialog", "전동휠체어"))
        self.groupBox_5.setTitle(_translate("dialog", "열차 선택"))
        self.label_3.setText(_translate("dialog", "⇀"))
        self.label_4.setText(_translate("dialog", "출발시각 "))
        self.dateTimeEdit_srt_time.setDisplayFormat(_translate("dialog", "yyyy. M. d. AP h:mm"))
        self.pushButton_srt_search.setText(_translate("dialog", "조회"))
        item = self.tableWidget_srt_schedule.horizontalHeaderItem(0)
        item.setText(_translate("dialog", "열차번호"))
        item = self.tableWidget_srt_schedule.horizontalHeaderItem(1)
        item.setText(_translate("dialog", "출발역"))
        item = self.tableWidget_srt_schedule.horizontalHeaderItem(2)
        item.setText(_translate("dialog", "도착역"))
        item = self.tableWidget_srt_schedule.horizontalHeaderItem(3)
        item.setText(_translate("dialog", "출발시간"))
        item = self.tableWidget_srt_schedule.horizontalHeaderItem(4)
        item.setText(_translate("dialog", "예매하기"))
        self.pushButton_srt_reservation.setText(_translate("dialog", "예매시작"))
        self.groupBox_2.setTitle(_translate("dialog", "예매 로그"))
        self.label_7.setText(_translate("dialog", "예매 시도 횟수"))
        item = self.tableWidget_srt_try_log.horizontalHeaderItem(0)
        item.setText(_translate("dialog", "시간"))
        item = self.tableWidget_srt_try_log.horizontalHeaderItem(1)
        item.setText(_translate("dialog", "결과"))
        item = self.tableWidget_srt_try_log.horizontalHeaderItem(2)
        item.setText(_translate("dialog", "사유"))
        item = self.tableWidget_srt_try_log.horizontalHeaderItem(3)
        item.setText(_translate("dialog", "예매정보"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_srt), _translate("dialog", "SRT"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_ktx), _translate("dialog", "KTX"))
        self.groupBox.setTitle(_translate("dialog", "에러 로그"))
        item = self.tableWidget_error_log.horizontalHeaderItem(0)
        item.setText(_translate("dialog", "시간"))
        item = self.tableWidget_error_log.horizontalHeaderItem(1)
        item.setText(_translate("dialog", "타입"))
        item = self.tableWidget_error_log.horizontalHeaderItem(2)
        item.setText(_translate("dialog", "상세 정보"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    dialog = QtWidgets.QDialog()
    ui = Ui_dialog()
    ui.setupUi(dialog)
    dialog.show()
    sys.exit(app.exec_())

 

자! 코드가 완성되었으니 테스트해보자~~

시작 화면

로그인을 하고, 원하는 열차를 조회해보자

열차 조회 결과

예매하고 싶은 열차를 선택 후, 예매시작을 누르면 잘 동작한다...!

예약 시도 중

빈자리를 예약하는데 성공하면 아래와 같이 팝업이 뜬다..!

예매 성공!

 

이번에 작업한 내용은 코드가 상당히 많다. 

깃헙에 업데이트했으니 깃헙에서 전체 코드가 다운 가능하다!

 

https://github.com/dhgwag/train_reservation

 

[참고 사이트]

 

[Python/PyQt] UI 생성 및 연결 | Python GUI 프로그램

[Python/PyQt] PyQt UI 생성 및 연결 | Python GUI 프로그램 원래 작성된 문서를 티스토리로 옮기는 문서입니다. 개요 PyQt란, Qt의 레이아웃에 Python의 코드를 연결하여 GUI 프로그램을 만들 수 있게 도와주

jiwift.tistory.com