이번 프로젝트의 개발 내용으로 마지막이 될 글이다:)
텔레그램과 이메일 등 환경설정을 넣을 수 있는 UI를 만들어보자.
Qt Designer에서 아래와 같이 환경설정 tab을 하나 더 만들고 UI를 구성하자.
환경설정 관련된 main.py 코드는 아래와 같다 (뒤쪽 예매파트는 생략)
class UiMainClass(QDialog):
def __init__(self):
self.max_error_log = 20
self.max_try_log = 100
self.srt = SRT(self.error_callback, self.srt_try_callback)
self.srt_stations = self.srt.get_stations()
self.srt_thread = None
self.srt_radiobuttons = []
self.srt_schedules = []
self.srt_reservation_list = []
self.srt_reservation_idx = 0
self.ktx = KTX(self.error_callback, self.ktx_try_callback)
self.ktx_stations = self.ktx.get_stations()
self.ktx_thread = None
self.ktx_radiobuttons = []
self.ktx_schedules = []
self.ktx_reservation_list = []
self.ktx_reservation_idx = 0
self.db = load_db()
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_version.setText(version)
self.main_ui.label_srt_logged_in.hide()
self.main_ui.label_ktx_logged_in.hide()
### SRT ###
# db에 데이터가 있는 경우 불러오기
if 'srt_login_type' in self.db.keys():
if self.db['srt_login_type'] == 0 or self.db['srt_login_type'] == 1 or self.db['srt_login_type'] == 2:
self.main_ui.comboBox_srt_login_type.setCurrentIndex(self.db['srt_login_type'])
if 'srt_id' in self.db.keys():
self.main_ui.lineEdit_srt_id.setText(self.db['srt_id'])
if 'srt_pwd' in self.db.keys():
self.main_ui.lineEdit_srt_pwd.setText(self.db['srt_pwd'])
if 'srt_save_login_info' in self.db.keys() and self.db['srt_save_login_info']:
self.main_ui.checkBox_srt_save_login.setChecked(True)
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)
### KTX ###
# db에 데이터가 있는 경우 불러오기
if 'ktx_login_type' in self.db.keys():
if self.db['ktx_login_type'] == 0 or self.db['ktx_login_type'] == 1 or self.db['ktx_login_type'] == 2:
self.main_ui.comboBox_ktx_login_type.setCurrentIndex(self.db['ktx_login_type'])
if 'ktx_id' in self.db.keys():
self.main_ui.lineEdit_ktx_id.setText(self.db['ktx_id'])
if 'ktx_pwd' in self.db.keys():
self.main_ui.lineEdit_ktx_pwd.setText(self.db['ktx_pwd'])
if 'ktx_save_login_info' in self.db.keys() and self.db['ktx_save_login_info']:
self.main_ui.checkBox_ktx_save_login.setChecked(True)
self.main_ui.comboBox_ktx_adult.setCurrentIndex(1)
self.main_ui.comboBox_ktx_dpt_stn.addItems(self.ktx_stations.keys())
self.main_ui.comboBox_ktx_arv_stn.addItems(self.ktx_stations.keys())
self.main_ui.comboBox_ktx_arv_stn.setCurrentIndex(1)
self.main_ui.dateTimeEdit_ktx_time.setDateTime(datetime.datetime.now())
self.main_ui.pushButton_ktx_reservation.setStyleSheet("QPushButton{background-color : lightblue;}")
# 로그인 타입 변경
self.main_ui.comboBox_ktx_login_type.currentIndexChanged.connect(self.comboBox_ktx_login_type_changed)
# 로그인
self.main_ui.pushButton_ktx_login.clicked.connect(self.pushButton_ktx_login_clicked)
# 열차 조회
self.main_ui.pushButton_ktx_search.clicked.connect(self.pushButton_ktx_search_clicked)
# 열차 예매
self.main_ui.pushButton_ktx_reservation.clicked.connect(self.pushButton_ktx_reservation_clicked)
### Settings
if 'max_error_log' in self.db.keys():
try:
self.db['max_error_log'] = int(self.db['max_error_log'])
self.max_error_log = self.db['max_error_log']
except:
self.error_callback("DB 로드 실패", f"max_error_log - {self.db['max_error_log']}")
if 'max_try_log' in self.db.keys():
try:
self.db['max_try_log'] = int(self.db['max_try_log'])
self.max_try_log = self.db['max_try_log']
except:
self.error_callback("DB 로드 실패", f"max_try_log - {self.db['max_try_log']}")
self.main_ui.lineEdit_max_error_log.setText(str(self.max_error_log))
self.main_ui.lineEdit_max_try_log.setText(str(self.max_try_log))
self.main_ui.pushButton_settings_save.clicked.connect(self.pushButton_settings_save_clicked)
### Telegram
if 'telegram_enable' in self.db.keys() and self.db['telegram_enable']:
self.main_ui.checkBox_telegram_enable.setChecked(True)
if 'telegram_token' in self.db.keys():
self.main_ui.lineEdit_telegram_token.setText(self.db['telegram_token'])
if 'telegram_chatid' in self.db.keys():
self.main_ui.lineEdit_telegram_chatid.setText(self.db['telegram_chatid'])
self.main_ui.pushButton_telegram_test.clicked.connect(self.pushButton_telegram_test_clicked)
self.main_ui.pushButton_telegram_save.clicked.connect(self.pushButton_telegram_save_clicked)
### Email
if 'email_enable' in self.db.keys() and self.db['email_enable']:
self.main_ui.checkBox_email_enable.setChecked(True)
if 'email_sender' in self.db.keys():
self.main_ui.lineEdit_email_sender.setText(self.db['email_sender'])
if 'email_passwd' in self.db.keys():
self.main_ui.lineEdit_email_passwd.setText(self.db['email_passwd'])
if 'email_receiver' in self.db.keys():
self.main_ui.lineEdit_email_receiver.setText(self.db['email_receiver'])
self.main_ui.pushButton_email_test.clicked.connect(self.pushButton_email_test_clicked)
self.main_ui.pushButton_email_save.clicked.connect(self.pushButton_email_save_clicked)
def pushButton_settings_save_clicked(self):
try:
max_error_log_tmp = int(self.main_ui.lineEdit_max_error_log.text())
self.main_ui.lineEdit_max_error_log.setText(str(max_error_log_tmp))
self.db['max_error_log'] = max_error_log_tmp
except:
self.error_callback("DB 저장 실패", f"최대 에러 로그 - {self.main_ui.lineEdit_max_error_log.text()}")
return False
try:
max_try_log_tmp = int(self.main_ui.lineEdit_max_try_log.text())
self.main_ui.lineEdit_max_try_log.setText(str(max_try_log_tmp))
self.db['max_try_log'] = max_try_log_tmp
except:
self.error_callback("DB 저장 실패", f"최대 예매 로그 - {self.main_ui.lineEdit_max_try_log.text()}")
return False
save_db(self.db)
QMessageBox.about(self, '저장 완료', '저장 완료')
def pushButton_telegram_test_clicked(self):
token = self.main_ui.lineEdit_telegram_token.text()
chatid = self.main_ui.lineEdit_telegram_chatid.text()
telegram = Telegram(token, chatid, self.error_callback, self.telegram_try_callback)
if telegram.send_message("기차 예매 프로그램 테스트 메세지입니다"):
QMessageBox.about(self, '테스트 성공', '텔레그램 발송 성공')
else:
QMessageBox.about(self, '테스트 실패', '텔레그램 발송 실패')
def pushButton_telegram_save_clicked(self):
self.db['telegram_enable'] = self.main_ui.checkBox_telegram_enable.isChecked()
self.db['telegram_token'] = self.main_ui.lineEdit_telegram_token.text()
self.db['telegram_chatid'] = self.main_ui.lineEdit_telegram_chatid.text()
save_db(self.db)
QMessageBox.about(self, '저장 완료', '저장 완료')
def telegram_try_callback(self, msg):
self.main_ui.tableWidget_telegram_try.insertRow(0)
self.main_ui.tableWidget_telegram_try.setItem(0, 0, QTableWidgetItem(get_nowtime()))
self.main_ui.tableWidget_telegram_try.setItem(0, 1, QTableWidgetItem(msg))
self.main_ui.tableWidget_telegram_try.resizeColumnToContents(0)
self.main_ui.tableWidget_telegram_try.resizeRowsToContents()
def pushButton_email_test_clicked(self):
sender = self.main_ui.lineEdit_email_sender.text() + "@gmail.com"
passwd = self.main_ui.lineEdit_email_passwd.text()
receiver = self.main_ui.lineEdit_email_receiver.text()
email_ = Email(sender, passwd, receiver, self.error_callback, self.email_try_callback)
if email_.send_email("기차 예매 프로그램 테스트 이메일입니다"):
QMessageBox.about(self, '테스트 성공', '이메일 발송 성공')
else:
QMessageBox.about(self, '테스트 실패', '이메일 발송 실패')
def pushButton_email_save_clicked(self):
self.db['email_enable'] = self.main_ui.checkBox_email_enable.isChecked()
self.db['email_sender'] = self.main_ui.lineEdit_email_sender.text()
self.db['email_passwd'] = self.main_ui.lineEdit_email_passwd.text()
self.db['email_receiver'] = self.main_ui.lineEdit_email_receiver.text()
save_db(self.db)
QMessageBox.about(self, '저장 완료', '저장 완료')
def email_try_callback(self, msg):
self.main_ui.tableWidget_email_try.insertRow(0)
self.main_ui.tableWidget_email_try.setItem(0, 0, QTableWidgetItem(get_nowtime()))
self.main_ui.tableWidget_email_try.setItem(0, 1, QTableWidgetItem(msg))
self.main_ui.tableWidget_email_try.resizeColumnToContents(0)
self.main_ui.tableWidget_email_try.resizeRowsToContents()
def send_success_message(self, msg):
if self.main_ui.checkBox_telegram_enable.isChecked(): # 텔레그램 발송
token = self.main_ui.lineEdit_telegram_token.text()
chatid = self.main_ui.lineEdit_telegram_chatid.text()
telegram_ = Telegram(token, chatid, self.error_callback, self.telegram_try_callback)
telegram_.send_message(msg)
if self.main_ui.checkBox_email_enable.isChecked(): # 이메일 발송
sender = self.main_ui.lineEdit_email_sender.text() + "@gmail.com"
passwd = self.main_ui.lineEdit_email_passwd.text()
receiver = self.main_ui.lineEdit_email_receiver.text()
email_ = Email(sender, passwd, receiver, self.error_callback, self.email_try_callback)
email_.send_email(msg)
풀 코드는 깃허브에 있으니 참고하면 된다..!
v3.0.0을 이렇게 릴리즈함으로써 프로젝트를 마무리한다!
추후 ktx, srt 측 코드가 업데이트되면 수정이 있겠지만, 얼마나 빨리 가능한지는 모른당:)
https://github.com/dhgwag/train_reservation/releases/tag/v3.0.0
Release Train Reservation 3.0.0 · dhgwag/train_reservation
메세지 발송 기능 구현 2024.01.17 Update Mac 파일은 다운받을 시 OS에서 위험파일로 간주하여 손상된 파일로 인식합니다. Mac 유저들은 clone하셔서 python 파일로 실행하시기 바랍니다ㅜ_ㅠ
github.com
'프로젝트 > SRT&KTX 매진표 예매' 카테고리의 다른 글
SRT&KTX 기차표 매크로 예매 - (13) 예매시 이메일 보내기(smtplib, email) (1) | 2024.01.17 |
---|---|
SRT&KTX 기차표 매크로 예매 - (12) 예매시 텔레그램 알림 보내기(python-telegram-bot) (0) | 2024.01.17 |
SRT&KTX 기차표 매크로 예매 - (11) KTX 승차권 예매 (1) | 2024.01.16 |
SRT&KTX 기차표 매크로 예매 - (10) KTX 승차권 조회 (0) | 2024.01.15 |
SRT&KTX 기차표 매크로 예매 - (9) KTX 역 리스트 조회 (0) | 2024.01.15 |