상세 페이지 수정 중

This commit is contained in:
R5600U_PC 2024-05-19 20:30:58 +09:00
parent 10d7991516
commit b31e82cc59
9 changed files with 1170 additions and 219 deletions

View File

@ -2,56 +2,270 @@
max_businesses = 5
log_level = DEBUG
business_count = 0
encryption_key = UDHoVlNcjDeR7ABRyDVr349RAtEUBNMZH5w4cq8g2IM=
[USER]
user_id = leensoo1nt@gmail.com
password = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
encryption_key = ujAT1bDEIJJ5uEw5MQ6R3gstatzpaZS_QaeSnTmGd0s=
[BUSINESS_1]
사업자별칭 = sample_alias_1
사업자등록번호 = 123-45-67890
상호명 = sample_name_1
등록날짜 = 2023-01-01
응대전화번호 = 010-1234-5678
쿠팡_쿠팡id = gAAAAABmRvruHmgHV1k6kuaWXu_abhE5WcPZxMjW3QKK7jY9Ms3UT1nD0BgpH_ujpnThATcfc4QNhlOTcYpa7PB8psJIr1_BsnTQ4HGUI45VbBPnEoWGglU=
쿠팡_업체 코드 = gAAAAABmRvruW5eBP4UAE126L4DRScX9lgspb7ANxG-tdJOYNOg4gXo7F-4Xe-9LnIbjvxjITK0rqoCjJfAK8AaZRrzFohmXpX8MwM44XzMuyayC4WKsTu4=
쿠팡_access key = gAAAAABmRvruIlRrsIgwTSsR3fCYMM6G-hYerYMnFkSD050WM9WArprzDJvAjVjxmiLYh6xXDHUxu31wFhJjiFwdcjOcwSvYkx55pAJRN7Crk0Pw80e_Spw=
쿠팡_secret key = gAAAAABmRvru_QY05u0XIShzeLHiUWbdbRbW_5ruEPOl-7adaxjQZXOewnOaODi9wDdR2aLQ9dp0UNkIAVWZzq-BYc8ovEQ6I5keVA9mCzCxx8SWbIvst7M=
스마트스토어_업로드항 스마트스토어 계정 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
스마트스토어_애플리케이션 id = gAAAAABmRvruEqawY-NssQNcQwEeOcRiGsiV0_QABw0IUhn-su02wAcyQ2X-At2sRla6tBK0HSDVZyGdCrrEIhlvTq_EbFE-HeNi8zaKdbGoPmnMhV5i9OE=
스마트스토어_애플리케이션 시크릿 = gAAAAABmRvruf3WXP0dWq9b-ykEu_e2h7V2D9xcDfSyYtXb19u57STPmnabKSrUJeDnCaq23oBBM89vXnGPyIuWSTX5wajNnYLjYY0e_J5Gp-Jon5wv0ICU=
옥션지마켓_옥션id = gAAAAABmRvruDCrmyG3EyInh86KIHrZt5JQK0rF8jvt6a3EOMfQCsUxfk7pZkY6xF34DvQmBLmqCcgifH8oBpFqUixE1_OHhQ6RwMcLAnk8ympBbEctGD4g=
옥션지마켓_g마켓 id = gAAAAABmRvruJgJvYqzSfSg0YIAAb5h3HQOBUbheMqUYGiNU1fSxVgCCyODezPe-Ejgn4yLNOqmsxLkolyMWJNd5v0QCuqz_SbJPebff9I3tQaXC7pMqO6w=
11번가-일반_api key = gAAAAABmRvrurEqGJf086Qs6TJYxIQXuiOV5gytNZ5Z6u7pRjFY9JY2IEMzxG-cg1cGTAv1XF_ilgDCEJmZHYxrlSRfkUdMtrA_uk8u0zjXcnKuoI85S2aE=
11번가-글로벌_api key = gAAAAABmRvruI-bQL9A7rB1Z-JzqSQYaXm--wll9GMW-ke0cGLdD5iy_3VatzNGSy9JhOI2He_dF6srQ7EGbre-zfZReeaI1XLJEk-Ze6SL5EKcJ6j7IsLA=
롯데온_api key = gAAAAABmRvrumkOok8QyAX4caHgkJDiifOmEpYCGG6zsqysBunDZFzmTd6Zbk_6tWWlyqxdXIQbqCbDPwHSPpM4yF_y8f9QB8gxrTg6bbF3rBzAFChPH-iU=
인터파크_상품상태재고수정 인증키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
인터파크_상품상태재고수정 비밀키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
인터파크_상품재고조회 인증키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
인터파크_상품재고조회 비밀키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
인터파크_상품정보조회 인증 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
인터파크_상품정보조회 비밀키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
인터파크_상품수정 인증키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
인터파크_상품수정 비밀키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
인터파크_상품등록 인증키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
인터파크_상품등록 비밀키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
인터파크_반품배송지조회 인증키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
인터파크_반품배송지조회 비밀키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
인터파크_반품배송지등록 인증키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
인터파크_반품배송지등록 비밀키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
인터파크_상품qna등록 인증키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
인터파크_상품qna등록 비밀키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
인터파크_상품qna조회 인증키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
인터파크_상품qna조회 비밀키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
인터파크_인터파크 업체번호 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
인터파크_공급계약 일련번호 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
위메프_api key = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
옥션1.0_api key = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
옥션1.0_멤버 id = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
alias = 설정사업자없음
register_number = 000-00-00000
name = 설정사업자없음
date = 0000-00-00
call = 000-000-0000
사업자별칭 =
사업자등록번호 =
상호명 =
등록날짜 =
응대전화번호 =
etc1_title =
etc1_context =
etc2_title =
etc2_context =
etc3_title =
etc3_context =
etc4_title =
etc4_context =
etc5_title =
etc5_context =
쿠팡_쿠팡id =
쿠팡_업체 코드 =
쿠팡_access key =
쿠팡_secret key =
스마트스토어_업로드 할 스마트스토어 계정 id =
스마트스토어_업로드 할 스마트스토어 계정 pw =
스마트스토어_애플리케이션 id =
스마트스토어_애플리케이션 시크릿 =
esm_옥션id =
esm_g마켓 id =
11번가-국내_api key =
11번가-글로벌_api key =
롯데온_api key =
인터파크_상품상태재고수정 인증키 =
인터파크_상품상태재고수정 비밀키 =
인터파크_상품재고조회 인증키 =
인터파크_상품재고조회 비밀키 =
인터파크_상품정보조회 인증 =
인터파크_상품정보조회 비밀키 =
인터파크_상품수정 인증키 =
인터파크_상품수정 비밀키 =
인터파크_상품등록 인증키 =
인터파크_상품등록 비밀키 =
인터파크_반품배송지조회 인증키 =
인터파크_반품배송지조회 비밀키 =
인터파크_반품배송지등록 인증키 =
인터파크_반품배송지등록 비밀키 =
인터파크_상품qna등록 인증키 =
인터파크_상품qna등록 비밀키 =
인터파크_상품qna조회 인증키 =
인터파크_상품qna조회 비밀키 =
인터파크_인터파크 업체번호 =
인터파크_공급계약 일련번호 =
위메프_api key =
옥션1.0_api key =
옥션1.0_멤버 id =
[BUSINESS_2]
사업자별칭 =
사업자등록번호 =
상호명 =
등록날짜 =
응대전화번호 =
etc1_title =
etc1_context =
etc2_title =
etc2_context =
etc3_title =
etc3_context =
etc4_title =
etc4_context =
etc5_title =
etc5_context =
쿠팡_쿠팡id =
쿠팡_업체 코드 =
쿠팡_access key =
쿠팡_secret key =
스마트스토어_업로드 할 스마트스토어 계정 id =
스마트스토어_업로드 할 스마트스토어 계정 pw =
스마트스토어_애플리케이션 id =
스마트스토어_애플리케이션 시크릿 =
esm_옥션id =
esm_g마켓 id =
11번가-국내_api key =
11번가-글로벌_api key =
롯데온_api key =
인터파크_상품상태재고수정 인증키 =
인터파크_상품상태재고수정 비밀키 =
인터파크_상품재고조회 인증키 =
인터파크_상품재고조회 비밀키 =
인터파크_상품정보조회 인증 =
인터파크_상품정보조회 비밀키 =
인터파크_상품수정 인증키 =
인터파크_상품수정 비밀키 =
인터파크_상품등록 인증키 =
인터파크_상품등록 비밀키 =
인터파크_반품배송지조회 인증키 =
인터파크_반품배송지조회 비밀키 =
인터파크_반품배송지등록 인증키 =
인터파크_반품배송지등록 비밀키 =
인터파크_상품qna등록 인증키 =
인터파크_상품qna등록 비밀키 =
인터파크_상품qna조회 인증키 =
인터파크_상품qna조회 비밀키 =
인터파크_인터파크 업체번호 =
인터파크_공급계약 일련번호 =
위메프_api key =
옥션1.0_api key =
옥션1.0_멤버 id =
[BUSINESS_3]
사업자별칭 =
사업자등록번호 =
상호명 =
등록날짜 =
응대전화번호 =
etc1_title =
etc1_context =
etc2_title =
etc2_context =
etc3_title =
etc3_context =
etc4_title =
etc4_context =
etc5_title =
etc5_context =
쿠팡_쿠팡id =
쿠팡_업체 코드 =
쿠팡_access key =
쿠팡_secret key =
스마트스토어_업로드 할 스마트스토어 계정 id =
스마트스토어_업로드 할 스마트스토어 계정 pw =
스마트스토어_애플리케이션 id =
스마트스토어_애플리케이션 시크릿 =
esm_옥션id =
esm_g마켓 id =
11번가-국내_api key =
11번가-글로벌_api key =
롯데온_api key =
인터파크_상품상태재고수정 인증키 =
인터파크_상품상태재고수정 비밀키 =
인터파크_상품재고조회 인증키 =
인터파크_상품재고조회 비밀키 =
인터파크_상품정보조회 인증 =
인터파크_상품정보조회 비밀키 =
인터파크_상품수정 인증키 =
인터파크_상품수정 비밀키 =
인터파크_상품등록 인증키 =
인터파크_상품등록 비밀키 =
인터파크_반품배송지조회 인증키 =
인터파크_반품배송지조회 비밀키 =
인터파크_반품배송지등록 인증키 =
인터파크_반품배송지등록 비밀키 =
인터파크_상품qna등록 인증키 =
인터파크_상품qna등록 비밀키 =
인터파크_상품qna조회 인증키 =
인터파크_상품qna조회 비밀키 =
인터파크_인터파크 업체번호 =
인터파크_공급계약 일련번호 =
위메프_api key =
옥션1.0_api key =
옥션1.0_멤버 id =
[BUSINESS_4]
사업자별칭 =
사업자등록번호 =
상호명 =
등록날짜 =
응대전화번호 =
etc1_title =
etc1_context =
etc2_title =
etc2_context =
etc3_title =
etc3_context =
etc4_title =
etc4_context =
etc5_title =
etc5_context =
쿠팡_쿠팡id =
쿠팡_업체 코드 =
쿠팡_access key =
쿠팡_secret key =
스마트스토어_업로드 할 스마트스토어 계정 id =
스마트스토어_업로드 할 스마트스토어 계정 pw =
스마트스토어_애플리케이션 id =
스마트스토어_애플리케이션 시크릿 =
esm_옥션id =
esm_g마켓 id =
11번가-국내_api key =
11번가-글로벌_api key =
롯데온_api key =
인터파크_상품상태재고수정 인증키 =
인터파크_상품상태재고수정 비밀키 =
인터파크_상품재고조회 인증키 =
인터파크_상품재고조회 비밀키 =
인터파크_상품정보조회 인증 =
인터파크_상품정보조회 비밀키 =
인터파크_상품수정 인증키 =
인터파크_상품수정 비밀키 =
인터파크_상품등록 인증키 =
인터파크_상품등록 비밀키 =
인터파크_반품배송지조회 인증키 =
인터파크_반품배송지조회 비밀키 =
인터파크_반품배송지등록 인증키 =
인터파크_반품배송지등록 비밀키 =
인터파크_상품qna등록 인증키 =
인터파크_상품qna등록 비밀키 =
인터파크_상품qna조회 인증키 =
인터파크_상품qna조회 비밀키 =
인터파크_인터파크 업체번호 =
인터파크_공급계약 일련번호 =
위메프_api key =
옥션1.0_api key =
옥션1.0_멤버 id =
[BUSINESS_5]
사업자별칭 =
사업자등록번호 =
상호명 =
등록날짜 =
응대전화번호 =
etc1_title =
etc1_context =
etc2_title =
etc2_context =
etc3_title =
etc3_context =
etc4_title =
etc4_context =
etc5_title =
etc5_context =
쿠팡_쿠팡id =
쿠팡_업체 코드 =
쿠팡_access key =
쿠팡_secret key =
스마트스토어_업로드 할 스마트스토어 계정 id =
스마트스토어_업로드 할 스마트스토어 계정 pw =
스마트스토어_애플리케이션 id =
스마트스토어_애플리케이션 시크릿 =
esm_옥션id =
esm_g마켓 id =
11번가-국내_api key =
11번가-글로벌_api key =
롯데온_api key =
인터파크_상품상태재고수정 인증키 =
인터파크_상품상태재고수정 비밀키 =
인터파크_상품재고조회 인증키 =
인터파크_상품재고조회 비밀키 =
인터파크_상품정보조회 인증 =
인터파크_상품정보조회 비밀키 =
인터파크_상품수정 인증키 =
인터파크_상품수정 비밀키 =
인터파크_상품등록 인증키 =
인터파크_상품등록 비밀키 =
인터파크_반품배송지조회 인증키 =
인터파크_반품배송지조회 비밀키 =
인터파크_반품배송지등록 인증키 =
인터파크_반품배송지등록 비밀키 =
인터파크_상품qna등록 인증키 =
인터파크_상품qna등록 비밀키 =
인터파크_상품qna조회 인증키 =
인터파크_상품qna조회 비밀키 =
인터파크_인터파크 업체번호 =
인터파크_공급계약 일련번호 =
위메프_api key =
옥션1.0_api key =
옥션1.0_멤버 id =

View File

@ -13,6 +13,8 @@ def main():
logger = setup_logger(log_level)
app = QApplication(sys.argv)
app.setStyle('Fusion')
# app.setStyle('windows')
loop = QEventLoop(app)
asyncio.set_event_loop(loop)

42
main3.py Normal file
View File

@ -0,0 +1,42 @@
# coding:utf-8
import os
import sys
from PyQt5.QtCore import Qt, QTranslator
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import QApplication
from qfluentwidgets import FluentTranslator
from app.common.config import cfg
from app.view.main_window import MainWindow
# enable dpi scale
if cfg.get(cfg.dpiScale) == "Auto":
QApplication.setHighDpiScaleFactorRoundingPolicy(
Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)
QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
else:
os.environ["QT_ENABLE_HIGHDPI_SCALING"] = "0"
os.environ["QT_SCALE_FACTOR"] = str(cfg.get(cfg.dpiScale))
QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps)
# create application
app = QApplication(sys.argv)
app.setAttribute(Qt.AA_DontCreateNativeWidgetSiblings)
# internationalization
locale = cfg.get(cfg.language).value
translator = FluentTranslator(locale)
galleryTranslator = QTranslator()
galleryTranslator.load(locale, "gallery", ".", ":/gallery/i18n")
app.installTranslator(translator)
app.installTranslator(galleryTranslator)
# create main window
w = MainWindow()
w.show()
app.exec_()

View File

@ -54,3 +54,114 @@ UI 구성
29. 작업완료창의 확인 버튼을 누르면 창이 사라지고, 브라우저 실행 버튼을 누르면 playwright의 chrome이 headless=false 모드로 실행되면서 작업완료 창은 사라져.
30. 사용자가 브라우저 실행 버튼을 누르면서 실행된 playwright는 이제부터 사용자가 웹사이트 작업을 할꺼야. 그래서 기존에 사업자 정보를 불러왔던 객체와는 별도의 객체여야 해.
사업자 설정 버튼을 누르면 나오는 ui를 정의해야 해.
이 파일은 클래스 파일이고 내부에는 기본적은 클래스변수를 포함해 initIU메서드와 함께 여러 기능을 하는 메서드들이 포함되어야 해.
모든 사용자에게 입력받는 모든 데이터는 클래스 변수로 설정되고 메서드들은 그 값들을 이용할 꺼야.
그리고 이 클래스변수에 접근하는 메서드들도 포함해줘,
동작 정의
기본적으로 다른 main 프로그램에 import되어 입력버튼을 누르는 등의 동작에 연결되어 해당하는 위젯이 표시되어야 해.
그래서 처음 main 프로그램이 시작할때 이 클래스의 객체를 생성하고, 필요한 동작이 호출되면 UI를 show 시키는 방식으로 동작하는게 좋겠어.
이 부분은 더 좋은 방법이 있으면 추천해줘
UI 정의
1. 메인 레이아웃은 QFRAME 안에 QVLAYOUT이 설정되어있어. 그 안애는 상단에 10%의 면적을 차지하는 QHLAYOUT이 1개 있고 여기에는 저장,삭제, 취소 버튼이 있고, 설정마켓 버튼이 있어.
저장,삭제,취소 버튼은 해당 메서드에 연결되어 있고, 이 부분은 추후에 구현할 예정이니 그냥 PASS와 함께 해당버튼을 눌렀다는 PRINT문만 추가해줘.
설정마켓 버튼은 클릭하면 작은 위젯이 하나 생성되는데, 여기서는 1행1열의 전체선택 체크박스와 3X3의 각 마켓의 체크박스가 함께 있어. 그리고 확인 버튼과 취소 버튼이 있지.
기본설정은 모든 마켓이 체크되어있어. 그리고 체크박스의 상태에 따라 마켓정보가 있는 QTABWIDGET 표시된 마켓의 탭을 보여줄지 말지의 여부를 결정할 꺼야. 이 버튼은 각각의 사업자 마다 동작해.
그 아래에는 QTABWIDGET이 있고 90%의 면적을 차지해.
2. QTABWIDGET의 탭의 갯수는 클래스 변수에 설정된 MAX_BUSINESS_COUNT 값이야. 이 값은 클래스 객체를 생성할때 인자로 받는 값이야.
각 탭의 제목은 기본값은 '1사업자', '2사업자', 등이 될꺼고, 만약 해당탭 내부의 '사업자 별칭'에 값이 있다면 그 값으로 설정되어야 해.
탭이 선택되면 해당 탭은 색이 연두색으로 변해.
QTABWIDGET은 테두리가 설정되어있고, 내부에는 QVLAYOUT이 설정되어 있어. 그리고 2개의 QFRAME으로 상단에는 사업자 정보 (40%면적차지), 하단에는 마켓정보(60%면적차지)가 들어갈 꺼야.
그 중 사업자 정보 QFRAME의 내부는 qgridlayout이 있고, 내부 구조는 다음과 같아
1행 에는 2개 열이 있고 1열에는 '사업자 별칭' 라벨, 2열에는 해당값을 입력할 수 있는 QLineedit가 있어.
2행 에는 4개 열이 있고 각각 사업자 등록번호, 상호명, 등록날짜, 전화번호 의 Qlabel이 가운데 정렬로 있어.
3행 에는 4개의 열이 있고 각각 2열에 해당하는 값을 입력할 수 있도록 Qlineedit가 있어.
4행 에는 4개 열이 있고 각각 기타 정보1, 기타정보2, 기타정보3, 기타정보4 의 Qpushbutton이 있어.
기타정보의 각 버튼을 누르면 간단한 텍스트를 입력할 수 있는 다이알로그가 떠. 창에는 레이아웃이 3개 있고, 첫번째 QHLAYOUT에는 '제목' 텍스트의 QLABEL과 사용자가 편집할 수 있는 QLINEEDIT 3:7의 비율로 있어. 두번째 QVLAYOUT에는 '내용' 텍스트의 QLABEL과 QTEXTBROWSER가 있어. 세번째 QHLAYOUT에는 확인버튼과 취소버튼이 있어.
확인 버튼을 누르면 기타정보 버튼의 텍스트가 제목 으로 설정된 텍스트로 바껴.
3. 마켓정보 QFRAME에도 역시 QTABWIDGET이 있고, 여기에는 탭마다 해당 사업자의 각 마켓 정보가 들어갈 꺼야.
마켓정보를 담은 QTABWIDGET은 선택된 탭은 연두색으로 변해.
탭 이름은 마켓이름이고(쿠팡,스마트스토어,ESM,11번가-국내,11번가-글로벌,롯데온,인터파크,위메프,옥션1.0)
탭 내부에는 QGRIDLAYOUT으로 설정되어있어.
기본적으로 4열로 구성되어있고, 1열, 3열에는 값 이름, 2열 4열에는 각각 1열,3열에 해당하는 값을 입력할 수 있는 QLINEEDIT가 있어.
- '쿠팡' 1행 : 쿠팡ID, 업체코드
- '쿠팡' 2행 : Access Key','Secret Key'
- '스마트스토어' 1행 :'업로드 할 스마트스토어 계정 ID','업로드 할 스마트스토어 계정 PW',
- '스마트스토어' 2행 :'애플리케이션 ID','애플리케이션 시크릿'
- 'ESM' 1행 :'옥션ID','G마켓 ID'
- '11번가-국내' 1행 :'API KEY'
- '11번가-글로벌' 1행 :'API KEY'
- '롯데온' 1행 :'API KEY'
- '인터파크' 1행:'상품상태재고수정 인증키','상품상태재고수정 비밀키'
- '인터파크' 2행'상품재고조회 인증키','상품재고조회 비밀키'
- '인터파크' 3행'상품정보조회 인증','상품정보조회 비밀키'
- '인터파크' 4행'상품수정 인증키','상품수정 비밀키'
- '인터파크' 5행'상품등록 인증키','상품등록 비밀키'
- '인터파크' 6행'반품배송지조회 인증키','반품배송지조회 비밀키'
- '인터파크' 7행'반품배송지등록 인증키','반품배송지등록 비밀키'
- '인터파크' 8행'상품QnA등록 인증키','상품QnA등록 비밀키'
- '인터파크' 9행'상품QnA조회 인증키','상품QnA조회 비밀키'
- '인터파크' 10행'인터파크 업체번호','공급계약 일련번호'
- '위메프' 1행:'API KEY'
- '옥션1.0' 1행:'멤버 ID'
기타 정보 버튼 아래에 4개의 버튼을 추가로 만들어줘.
이 버튼들은 '사업자등록증', '통신판매업신고증', '사업자통장', '기타이미지' 의 텍스트를 가지고 있어.
이 버튼을 클릭하면 작은 위젯이 생성되고, 위젯에는 4:3 비율의 이미지를 표시할꺼야.
사업자등록증이나 통신판매업 신고증 같은 A4용지를 스캔한 이미지를 표시할 예정이야.
UI의 구성은 아래와 같아.
qvlayout을 메인레이아웃으로 하고 그 내부에 2개의 qhlayout이 있어. 첫번째는 10%의 면적을 차지하고 확인 버튼, 저장 버튼, 삭제버튼이 있어.
두번째 qhlayout은 나머지 90%의 면적을 차지하고 내부에는 이미지를 표시하는 위젯이 있어.
이 모든 정보를 저장하기 위해 실행폴더에 My_BUSINESS_Info 폴더를 만들고 해당폴더 아래에 각 사업자 별로 정보를 저장해야 해.
각 사업자 정보는 BUSINESS_INFO_1,BUSINESS_INFO_2,BUSINESS_INFO_3,BUSINESS_INFO_4,BUSINESS_INFO_5 폴더가 있고,
해당 사업자 폴더 아래에는 business_info.ini 파일, etc_info.ini파일, image폴더, pdf폴더, etc폴더가 있어.
business_info.ini파일에는 사업자 정보(사업자등록번호 등)과 각 마켓의 api정보를 담고 있어.
etc_info.ini파일에는 기타 정보에서 설정한 내용들이 들어있어.
image폴더에는 사업자등록증이나 통신판매업 신고증 같은 이미지파일들이 있고, pdf폴더에는 교육 수료증이나 판매허가증 같은 pdf 파일들이 있어.
etc폴더에는 위의 내용을 제외한 나머지 사업폴더들이 존재할꺼야.
이렇게 폴더구조를 만든 후 이 내용들을 구글드라이브와 동기화 시키는 옵션을 만들고, My_BUSINESS_Info 폴더가 업데이트 될때 마다 동기화를 시키면 좋겠어.

272
ui/business_set.py Normal file
View File

@ -0,0 +1,272 @@
from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QGridLayout, QLabel, QLineEdit,
QPushButton, QTabWidget, QCheckBox, QFrame, QDialog, QDialogButtonBox,
QFontDialog, QMenuBar, QAction, QMessageBox)
from PyQt5.QtCore import Qt
from PyQt5.Qsci import QsciScintilla, QsciLexerPython
from qfluentwidgets import CalendarPicker
class BusinessSettings(QDialog):
def __init__(self, max_business_count=3, parent=None):
super().__init__(parent)
self.max_business_count = max_business_count
self.business_info = [{} for _ in range(max_business_count)]
self.market_info = [{} for _ in range(max_business_count)]
self.other_info = [{} for _ in range(max_business_count)]
self.selected_markets = {market: True for market in ["쿠팡", "스마트스토어", "ESM", "11번가-국내", "11번가-글로벌", "롯데온", "인터파크", "위메프", "옥션1.0"]}
self.initUI()
def initUI(self):
self.setLayout(QVBoxLayout())
# 상단 버튼 레이아웃
top_layout = QHBoxLayout()
top_frame = QFrame(self)
top_frame.setLayout(top_layout)
top_frame.setFrameShape(QFrame.StyledPanel)
top_frame.setFixedHeight(int(self.height() * 0.1))
save_button = QPushButton("저장")
save_button.clicked.connect(lambda: print("저장 버튼 클릭됨"))
delete_button = QPushButton("삭제")
delete_button.clicked.connect(lambda: print("삭제 버튼 클릭됨"))
cancel_button = QPushButton("취소")
cancel_button.clicked.connect(lambda: print("취소 버튼 클릭됨"))
setup_market_button = QPushButton("설정마켓")
setup_market_button.clicked.connect(self.show_market_setup)
top_layout.addWidget(save_button)
top_layout.addWidget(delete_button)
top_layout.addWidget(cancel_button)
top_layout.addWidget(setup_market_button)
self.layout().addWidget(top_frame)
# QTabWidget 설정
self.tab_widget = QTabWidget()
self.tab_widget.setTabsClosable(False)
self.layout().addWidget(self.tab_widget)
for i in range(self.max_business_count):
tab = QWidget()
tab.setLayout(QVBoxLayout())
tab.layout().addLayout(self.create_business_info_layout(i))
tab.layout().addWidget(self.create_market_info_widget())
tab.layout().setStretch(0, 3)
tab.layout().setStretch(1, 2)
self.tab_widget.addTab(tab, f"{i + 1}사업자")
self.tab_widget.currentChanged.connect(self.update_tab_styles)
self.update_tab_styles()
def create_business_info_layout(self, index):
layout = QGridLayout()
layout.addWidget(QLabel("사업자 별칭"), 0, 0)
alias_input = QLineEdit()
alias_input.textChanged.connect(lambda text, idx=index: self.update_tab_title(text, idx))
layout.addWidget(alias_input, 0, 1)
labels = ["사업자 등록번호", "상호명", "등록날짜", "전화번호"]
for i, label in enumerate(labels):
layout.addWidget(QLabel(label, alignment=Qt.AlignCenter), 1, i)
self.bs_number_edit = QLineEdit()
self.bs_number_edit.setMinimumWidth(60)
layout.addWidget(self.bs_number_edit, 2, 0)
self.bs_name_edit = QLineEdit()
self.bs_name_edit.setMinimumWidth(60)
layout.addWidget(self.bs_name_edit, 2, 1)
self.datePicker = CalendarPicker(self)
self.datePicker.setMinimumWidth(60)
self.datePicker.dateChanged.connect(lambda t: print(t.toString()))
layout.addWidget(self.datePicker, 2, 2)
# set date
# self.picker.setDate(QDate(2023, 5, 30))
# customize date format
# self.picker.setDateFormat(Qt.TextDate)
# self.picker.setDateFormat('yyyy-M-d')
self.bs_call_edit = QLineEdit()
self.bs_call_edit.setMinimumWidth(60)
layout.addWidget(self.bs_call_edit, 2, 3)
other_info_labels = ["기타 정보1", "기타 정보2", "기타 정보3", "기타 정보4"]
for i, label in enumerate(other_info_labels):
button = QPushButton(label)
button.clicked.connect(lambda checked, lbl=label, idx=index, btn=button: self.show_other_info_dialog(lbl, idx, btn))
layout.addWidget(button, 3, i)
return layout
def create_market_info_widget(self):
layout = QTabWidget()
market_tabs = {
"쿠팡": [("쿠팡ID", ""), ("업체코드", ""), ("Access Key", ""), ("Secret Key", "")],
"스마트스토어": [("계정 ID", ""), ("계정 PW", ""), ("애플리케이션 ID", ""), ("애플리케이션 시크릿", "")],
"ESM": [("옥션ID", ""), ("G마켓 ID", "")],
"11번가-국내": [("API KEY", "")],
"11번가-글로벌": [("API KEY", "")],
"롯데온": [("API KEY", "")],
"인터파크": [("상품상태재고수정 인증키", ""), ("상품상태재고수정 비밀키", ""),
("상품재고조회 인증키", ""), ("상품재고조회 비밀키", ""),
("상품정보조회 인증", ""), ("상품정보조회 비밀키", ""),
("상품수정 인증키", ""), ("상품수정 비밀키", ""),
("상품등록 인증키", ""), ("상품등록 비밀키", ""),
("반품배송지조회 인증키", ""), ("반품배송지조회 비밀키", ""),
("반품배송지등록 인증키", ""), ("반품배송지등록 비밀키", ""),
("상품QnA등록 인증키", ""), ("상품QnA등록 비밀키", ""),
("상품QnA조회 인증키", ""), ("상품QnA조회 비밀키", ""),
("인터파크 업체번호", ""), ("공급계약 일련번호", "")],
"위메프": [("API KEY", "")],
"옥션1.0": [("멤버 ID", "")]
}
for market, fields in market_tabs.items():
tab = QWidget()
tab_layout = QGridLayout()
for i, (label_text, placeholder) in enumerate(fields):
tab_layout.addWidget(QLabel(label_text), i, 0)
tab_layout.addWidget(QLineEdit(placeholder), i, 1)
tab.setLayout(tab_layout)
if self.selected_markets[market]:
layout.addTab(tab, market)
return layout
def show_market_setup(self):
dialog = QDialog(self)
dialog.setWindowTitle("설정 마켓")
dialog.setLayout(QVBoxLayout())
layout = dialog.layout()
all_select_checkbox = QCheckBox("전체선택")
all_select_checkbox.setChecked(all(self.selected_markets.values()))
all_select_checkbox.stateChanged.connect(self.toggle_all_markets)
layout.addWidget(all_select_checkbox)
market_layout = QGridLayout()
markets = list(self.selected_markets.keys())
self.market_checkboxes = []
for i, market in enumerate(markets):
checkbox = QCheckBox(market)
checkbox.setChecked(self.selected_markets[market])
self.market_checkboxes.append(checkbox)
market_layout.addWidget(checkbox, i // 3, i % 3)
layout.addLayout(market_layout)
button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
button_box.accepted.connect(dialog.accept)
button_box.rejected.connect(dialog.reject)
layout.addWidget(button_box)
if dialog.exec() == QDialog.Accepted:
for i, checkbox in enumerate(self.market_checkboxes):
self.selected_markets[markets[i]] = checkbox.isChecked()
self.update_market_tabs()
def toggle_all_markets(self, state):
for checkbox in self.market_checkboxes:
checkbox.setChecked(state == Qt.Checked)
def update_market_tabs(self):
for i in range(self.tab_widget.count()):
tab = self.tab_widget.widget(i)
market_info_widget = tab.layout().itemAt(1).widget()
for j in range(market_info_widget.count()):
market_tab = market_info_widget.widget(j)
market_name = market_info_widget.tabText(j)
market_info_widget.setTabVisible(j, self.selected_markets[market_name])
def show_other_info_dialog(self, label, index, button):
dialog = QDialog(self)
dialog.setWindowTitle(label)
layout = QVBoxLayout(dialog)
# 메뉴 바 생성
menu_bar = QMenuBar()
layout.setMenuBar(menu_bar)
# 폰트 선택 메뉴 추가
font_menu = menu_bar.addMenu('Font')
select_font_action = QAction('Select Font', self)
font_menu.addAction(select_font_action)
title_layout = QHBoxLayout()
title_layout.addWidget(QLabel("제목"))
title_input = QLineEdit()
title_layout.addWidget(title_input, 3)
layout.addLayout(title_layout)
content_layout = QVBoxLayout()
content_layout.addWidget(QLabel("내용"))
content_editor = QsciScintilla()
content_lexer = QsciLexerPython()
content_editor.setLexer(content_lexer)
content_layout.addWidget(content_editor)
layout.addLayout(content_layout)
button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
button_box.accepted.connect(lambda: dialog.accept())
button_box.rejected.connect(lambda: dialog.reject())
layout.addWidget(button_box)
# 폰트 선택 메뉴 동작 연결
select_font_action.triggered.connect(lambda: self.select_font(content_editor))
# 기존 정보가 없으면 초기화
if label not in self.other_info[index]:
self.other_info[index][label] = {"title": "", "content": ""}
# 기존 정보가 있으면 로드
title_input.setText(self.other_info[index][label].get("title", ""))
content_editor.setText(self.other_info[index][label].get("content", ""))
if dialog.exec() == QDialog.Accepted:
new_title = title_input.text()
new_content = content_editor.text()
old_title = self.other_info[index][label].get("title", "")
old_content = self.other_info[index][label].get("content", "")
if new_title != old_title or new_content != old_content:
confirmation = QMessageBox.question(self, "변경 사항 확인", "내용이 변경되었습니다. 저장하시겠습니까?",
QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if confirmation == QMessageBox.Yes:
self.other_info[index][label] = {
"title": new_title,
"content": new_content
}
button.setText(new_title)
else:
self.other_info[index][label] = {
"title": new_title,
"content": new_content
}
button.setText(new_title)
# Print the other_info dictionary for debugging
print(self.other_info)
def select_font(self, content_editor):
font, ok = QFontDialog.getFont()
if ok:
content_editor.setFont(font)
def update_tab_title(self, text, index):
if text:
self.tab_widget.setTabText(index, text)
else:
self.tab_widget.setTabText(index, f"{index + 1}사업자")
def update_tab_styles(self):
for i in range(self.tab_widget.count()):
tab_bar = self.tab_widget.tabBar()
if i == self.tab_widget.currentIndex():
tab_bar.setTabTextColor(i, Qt.black)
tab_bar.setStyleSheet("QTabBar::tab:selected { background: lightgreen; }")
else:
tab_bar.setTabTextColor(i, Qt.black)
tab_bar.setStyleSheet("QTabBar::tab:!selected { background: transparent; }")

View File

@ -1,22 +1,46 @@
from PyQt5.QtWidgets import (QMainWindow, QAction, QVBoxLayout, QHBoxLayout, QWidget, QPushButton, QLabel, QProgressBar, QComboBox, QCheckBox, QTextBrowser, QPlainTextEdit, QDialog, QFrame, QLineEdit,QGridLayout)
from PyQt5.QtWidgets import (QMainWindow, QAction, QVBoxLayout, QHBoxLayout, QWidget, QPushButton, QLabel, QProgressBar, QComboBox, QCheckBox, QTextBrowser, QPlainTextEdit, QDialog, QFrame, QLineEdit, QGridLayout, QSpinBox)
from PyQt5.QtCore import Qt
from ui.percenty_settings import PercentySettingsDialog
from ui.business_settings import BusinessSettingsDialog
from ui.business_set import BusinessSettings
from ui.help_dialog import HelpDialog
from utils.playwright_helpers import PlaywrightHelper
from utils.config import ConfigManager
import asyncio, pyperclip
from ui.apikey_widget import ApiKeyWidget
from qfluentwidgets import PushButton, RoundMenu, DropDownPushButton, FluentIcon as FIF
class MainWindow(QMainWindow):
def __init__(self, config, logger):
super().__init__()
self.config = config
self.logger = logger
self.max_business_number = 5
self.current_api_keys = {}
self.playwright_helper = PlaywrightHelper()
self.api_widget = ApiKeyWidget()
self.business_infos = {}
self.menu = RoundMenu(parent=self)
# Initialize the class variable
self.current_slot = 1
# 액션 딕셔너리 생성
self.actions = {
'1번 슬롯': QAction(FIF.SETTING.icon(), '1번 슬롯', self),
'2번 슬롯': QAction(FIF.SETTING.icon(), '2번 슬롯', self),
'3번 슬롯': QAction(FIF.SETTING.icon(), '3번 슬롯', self),
'4번 슬롯': QAction(FIF.SETTING.icon(), '4번 슬롯', self),
'5번 슬롯': QAction(FIF.SETTING.icon(), '5번 슬롯', self)
}
# 액션에 메서드 연결 및 메뉴에 추가
for text, action in self.actions.items():
action.triggered.connect(lambda checked, text=text: self.save_business_action_triggered(text))
self.menu.addAction(action)
# 초기 스타일 시트 설정
self.update_menu_items()
self.setWindowTitle('Change-Percenty2')
self.setGeometry(100, 100, 450, 800)
@ -39,6 +63,9 @@ class MainWindow(QMainWindow):
container.setLayout(main_layout)
self.setCentralWidget(container)
def create_menu(self):
menubar = self.menuBar()
@ -116,12 +143,25 @@ class MainWindow(QMainWindow):
def create_top_layout(self, layout):
self.fetch_button = QPushButton('현재설정 가져오기')
# self.fetch_button = QPushButton('현재설정 가져오기')
self.fetch_button = PushButton('현재설정 가져오기', self)
self.fetch_button.setMinimumSize(150,50)
self.fetch_button.clicked.connect(lambda: asyncio.ensure_future(self.fetch_settings()))
layout.addWidget(self.fetch_button)
self.select_Business = QSpinBox()
self.select_Business.setSuffix("번째 사업자")
self.select_Business.setValue(1)
self.select_Business.setMaximum(self.max_business_number)
self.select_Business.setMinimum(1)
# self.select_Business.valueChanged.connect(self.updateSelect_Business)
layout.addWidget(self.select_Business)
self.save_button = QPushButton('현재설정 저장하기')
# self.save_button = DropDownPushButton(FIF.SETTING, '현재설정 저장하기',self)
# self.save_button.setMenu(self.menu)
# self.save_button.setMenu(self.menu)
self.save_button.setMinimumSize(150,50)
self.save_button.clicked.connect(lambda: asyncio.ensure_future(self.save_settings()))
layout.addWidget(self.save_button)
@ -303,9 +343,11 @@ class MainWindow(QMainWindow):
def market_info_cc_btn_clicked(self, button):
currentBtnMarket = button.text()
if self.current_api_keys:
print("get_market_infos 호출")
print(f"{currentBtnMarket} 호출")
print(f"self.current_api_keys 인자 : {self.current_api_keys}")
market_api_infos = self.get_market_infos(self.current_api_keys, currentBtnMarket)
print("call_UI")
print(f"리턴된 market_api_infos : {market_api_infos}")
self.api_widget.call_UI(market_api_infos)
else:
print(f"{currentBtnMarket}의 마켓정보 없음")
@ -317,17 +359,17 @@ class MainWindow(QMainWindow):
await self.playwright_helper.init_browser()
self.progress_bar.setValue(5)
user_id = self.config.get('USER', 'user_id')
password = self.config.decrypt(self.config.get('USER', 'password'))
user_id = self.config.get('Percenty_Setting', 'user_id')
password = self.config.decrypt(self.config.get('Percenty_Setting', 'password'))
web_api_keys = await self.playwright_helper.login_and_fetch_api_keys('https://percenty.co.kr', user_id, password, self.status_label, self.progress_bar)
self.current_api_keys = web_api_keys
print(f"가져온 apikeys\n{web_api_keys}")
business_info = self.search_apikeys_for_business(web_api_keys)
selected_business_info = self.search_apikeys_for_business(web_api_keys)
# 가져온 API 키를 UI에 업데이트하는 로직 추가
self.update_market_info(web_api_keys, business_info)
self.update_market_info(web_api_keys, selected_business_info)
self.progress_bar.setValue(100)
self.status_label.setText('현재 상태: 설정 가져오기 완료')
await self.playwright_helper.close_browser()
@ -345,15 +387,16 @@ class MainWindow(QMainWindow):
# max_business = int(self.config.get('DEFAULT', 'max_businesses'))
all = self.config.get_all_businesses()
print(f"저장된 사업자 수 : [{len(all)}] 개")
print(f"all : {all}")
progress_step = 15 / len(all)
print(f"progress_step : {progress_step}")
try:
all = self.config.get_all_businesses()
print(f"저장된 사업자 수 : [{len(all)}] 개")
print(f"all : {all}")
progress_step = 15 / len(all)
print(f"progress_step : {progress_step}")
# 저장된 모든 사업자 정보 가져오기
for business_section in all:
print(f"키검증 business_section : {business_section}")
@ -377,24 +420,87 @@ class MainWindow(QMainWindow):
return business_info
def get_market_infos(self, current_api_keys, market_name):
# 현재 current_api_keys는 이미 전체 마켓 데이터를 포함하는 사전입니다.
if market_name in current_api_keys:
market_details = current_api_keys[market_name]
api_keys = {key: value for key, value in market_details.items() if 'key' in key.lower() or '' in key}
if market_name == '쿠팡':
api_keys = {
'쿠팡ID': market_details.get('쿠팡ID'),
'업체 코드': market_details.get('업체 코드'),
'Access Key': market_details.get('Access Key'),
'Secret Key': market_details.get('Secret Key'),
}
elif market_name == '스마트스토어':
api_keys = {
'업로드 할 스마트스토어 계정': market_details.get('업로드항 스마트스토어 계정'),
'애플리케이션 ID': market_details.get('애플리케이션 ID'),
'애플리케이션 시크릿': market_details.get('애플리케이션 시크릿'),
}
elif market_name == 'ESM':
api_keys = {
'옥션ID': market_details.get('옥션ID'),
'G마켓 ID': market_details.get('G마켓 ID'),
}
elif market_name == '11번가-국내':
api_keys = {
'API KEY': market_details.get('API KEY'),
}
elif market_name == '11번가-글로벌':
api_keys = {
'API KEY': market_details.get('API KEY'),
}
elif market_name == '롯데온':
api_keys = {
'API KEY': market_details.get('API KEY'),
}
elif market_name == '인터파크':
api_keys = {
'상품상태재고수정 인증키': market_details.get('상품상태재고수정 인증키'),
'상품상태재고수정 비밀키': market_details.get('상품상태재고수정 비밀키'),
'상품재고조회 인증키': market_details.get('상품재고조회 인증키'),
'상품재고조회 비밀키': market_details.get('상품재고조회 비밀키'),
'상품정보조회 인증': market_details.get('상품정보조회 인증'),
'상품정보조회 비밀키': market_details.get('상품정보조회 비밀키'),
'상품수정 인증키': market_details.get('상품수정 인증키'),
'상품수정 비밀키': market_details.get('상품수정 비밀키'),
'상품등록 인증키': market_details.get('상품등록 인증키'),
'상품등록 비밀키': market_details.get('상품등록 비밀키'),
'반품배송지조회 인증키': market_details.get('반품배송지조회 인증키'),
'반품배송지조회 비밀키': market_details.get('반품배송지조회 비밀키'),
'반품배송지등록 인증키': market_details.get('반품배송지등록 인증키'),
'반품배송지등록 비밀키': market_details.get('반품배송지등록 비밀키'),
'상품QnA등록 인증키': market_details.get('상품QnA등록 인증키'),
'상품QnA등록 비밀키': market_details.get('상품QnA등록 비밀키'),
'상품QnA조회 인증키': market_details.get('상품QnA조회 인증키'),
'상품QnA조회 비밀키': market_details.get('상품QnA조회 비밀키'),
'인터파크 업체번호': market_details.get('인터파크 업체번호'),
'공급계약 일련번호': market_details.get('공급계약 일련번호'),
}
elif market_name == '위메프':
api_keys = {
'API KEY': market_details.get('API KEY'),
}
elif market_name == '옥션1.0':
api_keys = {
'API KEY': market_details.get('API KEY'),
'멤버 ID': market_details.get('멤버 ID'),
}
else:
api_keys = {key: value for key, value in market_details.items() if 'key' in key.lower() or '' in key}
return api_keys
else:
return None
def update_market_info(self, api_keys, business_info):
print(f"update_market_info : {api_keys}\n\n{business_info}")
def update_market_info(self, web_api_keys, selected_business_info):
print(f"update_market_info : {web_api_keys}\n\n{selected_business_info}")
# 사업자 정보 업데이트
self.business_info_label_context.setText(business_info['사업자별칭'])
self.business_register_number_label_context.setText(business_info['사업자등록번호'])
self.business_name_label_context.setText(business_info['상호명'])
self.business_date_label_context.setText(business_info['등록날짜'])
self.business_call_label_context.setText(business_info['응대전화번호'])
self.business_info_label_context.setText(selected_business_info['사업자별칭'])
self.business_register_number_label_context.setText(selected_business_info['사업자등록번호'])
self.business_name_label_context.setText(selected_business_info['상호명'])
self.business_date_label_context.setText(selected_business_info['등록날짜'])
self.business_call_label_context.setText(selected_business_info['응대전화번호'])
# 마켓 정보 업데이트
market_buttons = [
@ -410,10 +516,10 @@ class MainWindow(QMainWindow):
]
for button, market, label in market_buttons:
market_info = api_keys.get(market, None)
market_info = web_api_keys.get(market, None)
if market_info:
button.setStyleSheet("background-color: lightgreen;")
label.setText(business_info['사업자별칭'])
label.setText(selected_business_info['사업자별칭'])
else:
button.setStyleSheet("background-color: darkgray;")
label.setText("NoMatch")
@ -434,33 +540,6 @@ class MainWindow(QMainWindow):
self.config.set_business_info(1, business_info)
# 예시 API 키 설정
api_keys = {
'쿠팡': {
'쿠팡ID': 'example_coupang_id',
'업체 코드': 'example_company_code',
'Access Key': 'example_access_key',
'Secret Key': 'example_secret_key'
},
'스마트스토어': {
'애플리케이션 ID': 'example_application_id',
'애플리케이션 시크릿': 'example_application_secret'
},
'ESM': {
'옥션ID': 'example_auction_id',
'G마켓 ID': 'example_gmarket_id'
},
'11번가-일반': {
'API KEY': 'example_11st_api_key'
},
'11번가-글로벌': {
'API KEY': 'example_11st_global_api_key'
},
'롯데온': {
'API KEY': 'example_lotteon_api_key'
},
}
self.config.set_api_keys(1, api_keys)
self.progress_bar.setValue(100)
@ -478,8 +557,8 @@ class MainWindow(QMainWindow):
# 선택된 사업자와 마켓에 따라 API 키 변경 작업 수행
await self.playwright_helper.init_browser()
user_id = self.config.get('USER', 'user_id')
password = self.config.decrypt(self.config.get('USER', 'password'))
user_id = self.config.get('Percenty_Setting', 'user_id')
password = self.config.decrypt(self.config.get('Percenty_Setting', 'password'))
api_keys = {} # 여기에 새로운 API 키를 설정하는 로직 추가
await self.playwright_helper.update_api_keys('https://percenty.co.kr', user_id, password, api_keys, self.status_label, self.progress_bar)
@ -491,6 +570,56 @@ class MainWindow(QMainWindow):
# 작업 완료 창 띄우기
self.show_completion_dialog()
def save_business_action_triggered(self, action_name):
if action_name == '1번 슬롯':
print("1번자리")
self.change_slot(int(action_name.split('')[0]))
elif action_name == '2번 슬롯':
print("2번자리")
self.change_slot(int(action_name.split('')[0]))
elif action_name == '3번 슬롯':
print("3번자리")
self.change_slot(int(action_name.split('')[0]))
elif action_name == '4번 슬롯':
print("4번자리")
self.change_slot(int(action_name.split('')[0]))
elif action_name == '5번 슬롯':
print("5번자리")
self.change_slot(int(action_name.split('')[0]))
def update_menu_items(self):
# Update text of menu items based on the current slot
for text, action in self.actions.items():
if text.startswith(f'{self.current_slot}'):
action.setText(f'{self.current_slot}번 슬롯 (활성화)')
action.setProperty("highlighted", True)
else:
action.setText(text.split(' ')[0] + ' 슬롯')
action.setProperty("highlighted", False)
# Apply QSS 스타일 시트
self.menu.setStyleSheet("""
QMenu::item {
background-color: white;
color: black;
}
QMenu::item:selected {
background-color: lightgray;
}
QMenu::item[highlighted="true"] {
color: red;
}
""")
def change_slot(self, new_slot):
self.current_slot = new_slot
self.update_menu_items()
def show_completion_dialog(self):
dialog = QDialog(self)
dialog.setWindowTitle('작업 완료')
@ -512,8 +641,8 @@ class MainWindow(QMainWindow):
async def run_browser(self):
await self.playwright_helper.init_browser(headless=False)
user_id = self.config.get('USER', 'user_id')
password = self.config.decrypt(self.config.get('USER', 'password'))
user_id = self.config.get('Percenty_Setting', 'user_id')
password = self.config.decrypt(self.config.get('Percenty_Setting', 'password'))
await self.playwright_helper.login_and_fetch_api_keys('https://percenty.co.kr', user_id, password)
def show_help(self):
@ -525,5 +654,8 @@ class MainWindow(QMainWindow):
dialog.exec_()
def show_business_settings(self):
dialog = BusinessSettingsDialog(self.config)
# dialog = BusinessSettingsDialog(self.config)
max_business_count = 5
dialog = BusinessSettings(max_business_count)
dialog.exec_()

View File

@ -3,20 +3,21 @@ from cryptography.fernet import Fernet, InvalidToken
import os
class ConfigManager:
def __init__(self, config_file='config.ini'):
def __init__(self, config_file='config.ini', max_businesses=5):
self.config_file = config_file
self.config = configparser.ConfigParser()
self.valid_markets = ['쿠팡', '스마트스토어','옥션지마켓', '11번가-일반','11번가-글로벌', '롯데온','인터파크', '위메프', '옥션1.0'] # 여기에 원하는 마켓 이름을 추가하세요
self.max_businesses = max_businesses
self.valid_markets = ['쿠팡', '스마트스토어', 'ESM', '11번가-국내', '11번가-글로벌', '롯데온', '인터파크', '위메프', '옥션1.0']
if not os.path.exists(config_file):
self._create_default_config()
self.config.read(config_file, encoding='cp949')
self.config.read(config_file, encoding='utf-8')
if 'DEFAULT' not in self.config or 'encryption_key' not in self.config['DEFAULT']:
self.key = Fernet.generate_key()
self.config['DEFAULT']['encryption_key'] = self.key.decode()
with open(self.config_file, 'w') as configfile:
with open(self.config_file, 'w', encoding='utf-8') as configfile:
self.config.write(configfile)
else:
self.key = self.config['DEFAULT']['encryption_key'].encode()
@ -25,12 +26,97 @@ class ConfigManager:
def _create_default_config(self):
self.config['DEFAULT'] = {
'max_businesses': '5',
'max_businesses': str(self.max_businesses),
'log_level': 'DEBUG',
'business_count': '0',
'encryption_key': Fernet.generate_key().decode()
}
with open(self.config_file, 'w') as configfile:
for i in range(1, self.max_businesses + 1):
section = f'BUSINESS_{i}'
self.config[section] = {
'사업자별칭': '',
'사업자등록번호': '',
'상호명': '',
'등록날짜': '',
'응대전화번호': '',
'etc1_title': '',
'etc1_context': '',
'etc2_title': '',
'etc2_context': '',
'etc3_title': '',
'etc3_context': '',
'etc4_title': '',
'etc4_context': '',
'etc5_title': '',
'etc5_context': ''
}
for market in self.valid_markets:
if market == '쿠팡':
self.config[section].update({
'쿠팡_쿠팡ID': '',
'쿠팡_업체 코드': '',
'쿠팡_Access Key': '',
'쿠팡_Secret Key': ''
})
elif market == '스마트스토어':
self.config[section].update({
'스마트스토어_업로드 할 스마트스토어 계정 ID': '',
'스마트스토어_업로드 할 스마트스토어 계정 PW': '',
'스마트스토어_애플리케이션 ID': '',
'스마트스토어_애플리케이션 시크릿': ''
})
elif market == 'ESM':
self.config[section].update({
'ESM_옥션ID': '',
'ESM_G마켓 ID': ''
})
elif market == '11번가-국내':
self.config[section].update({
'11번가-국내_API KEY': ''
})
elif market == '11번가-글로벌':
self.config[section].update({
'11번가-글로벌_API KEY': ''
})
elif market == '롯데온':
self.config[section].update({
'롯데온_API KEY': ''
})
elif market == '인터파크':
self.config[section].update({
'인터파크_상품상태재고수정 인증키': '',
'인터파크_상품상태재고수정 비밀키': '',
'인터파크_상품재고조회 인증키': '',
'인터파크_상품재고조회 비밀키': '',
'인터파크_상품정보조회 인증': '',
'인터파크_상품정보조회 비밀키': '',
'인터파크_상품수정 인증키': '',
'인터파크_상품수정 비밀키': '',
'인터파크_상품등록 인증키': '',
'인터파크_상품등록 비밀키': '',
'인터파크_반품배송지조회 인증키': '',
'인터파크_반품배송지조회 비밀키': '',
'인터파크_반품배송지등록 인증키': '',
'인터파크_반품배송지등록 비밀키': '',
'인터파크_상품QnA등록 인증키': '',
'인터파크_상품QnA등록 비밀키': '',
'인터파크_상품QnA조회 인증키': '',
'인터파크_상품QnA조회 비밀키': '',
'인터파크_인터파크 업체번호': '',
'인터파크_공급계약 일련번호': ''
})
elif market == '위메프':
self.config[section].update({
'위메프_API KEY': ''
})
elif market == '옥션1.0':
self.config[section].update({
'옥션1.0_API KEY': '',
'옥션1.0_멤버 ID': ''
})
with open(self.config_file, 'w', encoding='utf-8') as configfile:
self.config.write(configfile)
def get(self, section, option, fallback=None):
@ -40,36 +126,28 @@ class ConfigManager:
if not self.config.has_section(section):
self.config.add_section(section)
self.config.set(section, option, value)
with open(self.config_file, 'w') as configfile:
with open(self.config_file, 'w', encoding='utf-8') as configfile:
self.config.write(configfile)
def encrypt(self, data):
return self.cipher_suite.encrypt(data.encode()).decode()
def decrypt(self, encrypted_data):
print(f"encrypted_data : {encrypted_data} ")
try:
print("decrypt Try")
result = self.cipher_suite.decrypt(encrypted_data.encode()).decode()
print(f"result : {result}")
return result
return self.cipher_suite.decrypt(encrypted_data.encode()).decode()
except InvalidToken:
raise ValueError("Invalid encryption key or corrupted data.")
def get_business_info(self, business_section):
if not self.config.has_section(business_section):
print(f"{business_section} : 해당 섹션이 없음")
return None
print(f"business_section : {business_section}")
print(f"self.config.get(business_section, '사업자별칭', fallback='설정사업자없음') \n {self.config.get(business_section, '사업자별칭', fallback='설정사업자없음')}")
business_info = {
'사업자별칭': self.config.get(business_section, '사업자별칭', fallback='설정사업자없음'),
'사업자등록번호': self.config.get(business_section, '사업자등록번호', fallback='000-00-00000'),
'상호명': self.config.get(business_section, '상호명', fallback='설정사업자없음'),
'등록날짜': self.config.get(business_section, '등록날짜', fallback='0000-00-00'),
'응대전화번호': self.config.get(business_section, '응대전화번호', fallback='000-000-0000')
'사업자별칭': self.config.get(business_section, 'alias', fallback='설정사업자없음'),
'사업자등록번호': self.config.get(business_section, 'register_number', fallback='000-00-00000'),
'상호명': self.config.get(business_section, 'name', fallback='설정사업자없음'),
'등록날짜': self.config.get(business_section, 'date', fallback='0000-00-00'),
'응대전화번호': self.config.get(business_section, 'call', fallback='000-000-0000')
}
return business_info
@ -89,102 +167,27 @@ class ConfigManager:
return businesses
def get_api_keys(self, business_section):
print("get_api_keys")
print(f"business_section : {business_section}")
if not self.config.has_section(business_section):
print("business_section이 존재하지 않음")
return {}
api_keys = {}
for key in self.config.options(business_section):
print(f"key : {key}")
market_name = key.split('_', 1)[0]
print(f"market_name : {market_name}")
if market_name in self.valid_markets and '_' in key:
market, key_name = key.split('_', 1)
print(f"market : {market}")
print(f"key_name : {key_name}")
if market not in api_keys:
api_keys[market] = {}
print("market not in api_keys, 마켓생성")
encrypted_value = self.config.get(business_section, key)
print(f"encrypted_value : {encrypted_value}")
if encrypted_value:
try:
decrypted_value = self.decrypt(encrypted_value)
print(f"decrypted_value : {decrypted_value}")
api_keys[market][key_name] = decrypted_value
except Exception as e:
print(f"Decryption failed for key {key}: {e}")
api_keys[market][key_name] = ''
else:
api_keys[market][key_name] = ''
print(f"Empty value for key {key}, setting as empty string")
print(f"최종 api_keys: {api_keys}")
return api_keys
def get_api_keys_2(self, business_id):
section = f'API_KEYS_{business_id}'
if not self.config.has_section(section):
return None
return {
'쿠팡': {
'쿠팡ID': self.get(section, 'coupang_coupangid', ''),
'업체 코드': self.get(section, 'coupang_업체_코드', ''),
'Access Key': self.get(section, 'coupang_access_key', ''),
'Secret Key': self.get(section, 'coupang_secret_key', '')
},
'스마트스토어': {
'업로드항 스마트스토어 계정': self.get(section, 'ss_업로드항_스마트스토어_계정', ''),
'애플리케이션 ID': self.get(section, 'ss_application_id', ''),
'애플리케이션 시크릿': self.get(section, 'ss_application_secret', '')
},
'옥션지마켓': {
'옥션ID': self.get(section, 'esm_auction_id', ''),
'G마켓 ID': self.get(section, 'esm_gmarket_id', '')
},
'11번가-일반': {
'API KEY': self.get(section, 'est_api_key', '')
},
'11번가-글로벌': {
'API KEY': self.get(section, 'est_global_api_key', '')
},
'롯데온': {
'API KEY': self.get(section, 'lotteon_api_key', '')
},
'인터파크': {
'상품상태재고수정 인증키': self.get(section, 'ip_product_status_inventory_update_auth_key', ''),
'상품상태재고수정 비밀키': self.get(section, 'ip_product_status_inventory_update_secret_key', ''),
'상품재고조회 인증키': self.get(section, 'ip_product_inventory_check_auth_key', ''),
'상품재고조회 비밀키': self.get(section, 'ip_product_inventory_check_secret_key', ''),
'상품정보조회 인증': self.get(section, 'ip_product_info_check_auth_key', ''),
'상품정보조회 비밀키': self.get(section, 'ip_product_info_check_secret_key', ''),
'상품수정 인증키': self.get(section, 'ip_product_update_auth_key', ''),
'상품수정 비밀키': self.get(section, 'ip_product_update_secret_key', ''),
'상품등록 인증키': self.get(section, 'ip_product_register_auth_key', ''),
'상품등록 비밀키': self.get(section, 'ip_product_register_secret_key', ''),
'반품배송지조회 인증키': self.get(section, 'ip_return_address_check_auth_key', ''),
'반품배송지조회 비밀키': self.get(section, 'ip_return_address_check_secret_key', ''),
'반품배송지등록 인증키': self.get(section, 'ip_return_address_register_auth_key', ''),
'반품배송지등록 비밀키': self.get(section, 'ip_return_address_register_secret_key', ''),
'상품QnA등록 인증키': self.get(section, 'ip_product_qna_register_auth_key', ''),
'상품QnA등록 비밀키': self.get(section, 'ip_product_qna_register_secret_key', ''),
'상품QnA조회 인증키': self.get(section, 'ip_product_qna_check_auth_key', ''),
'상품QnA조회 비밀키': self.get(section, 'ip_product_qna_check_secret_key', ''),
'인터파크 업체번호': self.get(section, 'ip_interpark_company_number', ''),
'공급계약 일련번호': self.get(section, 'ip_supply_contract_serial_number', '')
},
'위메프': {
'API KEY': self.get(section, 'wmp_api_key', '')
},
'옥션1.0': {
'API KEY': self.get(section, 'at_api_key', ''),
'멤버 ID': self.get(section, 'at_member_id', '')
}
}
def set_api_keys(self, business_id, api_keys):
business_section = f'BUSINESS_{business_id}'
if not self.config.has_section(business_section):
@ -195,18 +198,17 @@ class ConfigManager:
encrypted_value = self.encrypt(key_value)
self.config.set(business_section, f'{market}_{key_name}', encrypted_value)
with open(self.config_file, 'w') as configfile:
with open(self.config_file, 'w', encoding='utf-8') as configfile:
self.config.write(configfile)
def reset_settings(self):
if os.path.exists(self.config_file):
os.remove(self.config_file)
self._create_default_config()
self.config.read(self.config_file)
self.config.read(self.config_file, encoding='utf-8')
def get_user_info(self):
user_id = self.get('USER', 'user_id', fallback='')
encrypted_password = self.get('USER', 'password', fallback='')
user_id = self.get('Percenty_Setting', 'user_id', fallback='')
encrypted_password = self.get('Percenty_Setting', 'password', fallback='')
password = self.decrypt(encrypted_password) if encrypted_password else ''
return user_id, password

View File

@ -37,7 +37,7 @@ class PlaywrightHelper:
# 마켓 설정상 팝업 다이얼로그가 있는 경우 닫기 (있는 경우)
try:
# await page.click(".ant-modal-footer [type='button']")
await page.click("div.ant-modal-footer > button[type=\"button\"].ant-btn.css-1li46mu.ant-btn-primary")
await page.click("div.ant-modal-footer > button[type=\"button\"].ant-btn.css-1li46mu.ant-btn-primary",2)
# .ant-modal-content
# .ant-modal-footer [type='button']
@ -64,7 +64,7 @@ class PlaywrightHelper:
'Secret Key': "div#rc-tabs-0-panel-cp div:nth-child(4) > input",
},
'스마트스토어': {
'업로드 스마트스토어 계정' : "div#rc-tabs-0-panel-ss div:nth-child(1) > input",
'업로드 스마트스토어 계정' : "div#rc-tabs-0-panel-ss div:nth-child(1) > input",
'애플리케이션 ID': "div#rc-tabs-0-panel-ss div:nth-child(3) > input",
'애플리케이션 시크릿': "div#rc-tabs-0-panel-ss div:nth-child(3) > input",
},
@ -72,7 +72,7 @@ class PlaywrightHelper:
'옥션ID': "div#rc-tabs-0-panel-esm div:nth-child(1) > input",
'G마켓 ID': "div#rc-tabs-0-panel-esm div:nth-child(2) > input",
},
'11번가-일반': {
'11번가-국내': {
'API KEY': "div#rc-tabs-0-panel-est input",
},
'11번가-글로벌': {
@ -124,8 +124,8 @@ class PlaywrightHelper:
print(f"api_keys['ESM'] \n {api_keys['ESM']}")
progress_bar.setValue(45)
status_label.setText('현재 상태: ESM 가져오기 완료')
api_keys['11번가-일반'] = await fetch_market_api_keys("div#rc-tabs-0-tab-est", api_key_xpaths['11번가-일반'])
print(f"api_keys['11번가-일반'] \n {api_keys['11번가-일반']}")
api_keys['11번가-국내'] = await fetch_market_api_keys("div#rc-tabs-0-tab-est", api_key_xpaths['11번가-국내'])
print(f"api_keys['11번가-국내'] \n {api_keys['11번가-국내']}")
progress_bar.setValue(50)
status_label.setText('현재 상태: 11번가 국내 가져오기 완료')
api_keys['11번가-글로벌'] = await fetch_market_api_keys("div#rc-tabs-0-tab-est_global", api_key_xpaths['11번가-글로벌'])
@ -194,7 +194,7 @@ class PlaywrightHelper:
progress_bar.setValue(45)
status_label.setText('현재 상태: ESM 업데이트 완료')
await update_market_api_keys("div#rc-tabs-0-tab-est", api_keys['11번가-일반'])
await update_market_api_keys("div#rc-tabs-0-tab-est", api_keys['11번가-국내'])
progress_bar.setValue(50)
status_label.setText('현재 상태: 11번가 국내 업데이트 완료')

176
utils/test.py Normal file
View File

@ -0,0 +1,176 @@
from PyQt4 import QtGui, QtCore
# from load_CSS import load_CSS
# from widgets import UniversalPlotWidget
import sys
import time
def exit_application():
"""Exit program event handler"""
sys.exit(1)
class VerticalTabBar(QtGui.QTabBar):
def __init__(self, width, height, parent=None):
super(VerticalTabBar, self).__init__(parent)
self.width = width
self.height = height
def tabSizeHint(self, index):
return QtCore.QSize(self.width, self.height)
def paintEvent(self, event):
painter = QtGui.QStylePainter(self)
tab_options = QtGui.QStyleOptionTab()
for tab in range(self.count()):
self.initStyleOption(tab_options, tab)
painter.drawControl(QtGui.QStyle.CE_TabBarTabShape, tab_options)
painter.save()
size = tab_options.rect.size()
size.transpose()
rectangle = QtCore.QRect(QtCore.QPoint(), size)
rectangle.moveCenter(tab_options.rect.center())
tab_options.rect = rectangle
center = self.tabRect(tab).center()
painter.translate(center)
painter.rotate(90)
painter.translate(-center)
painter.drawControl(QtGui.QStyle.CE_TabBarTabLabel, tab_options);
painter.restore()
class TabWidget(QtGui.QTabWidget):
def __init__(self, *args, **kwargs):
QtGui.QTabWidget.__init__(self, *args, **kwargs)
self.setTabBar(VerticalTabBar(kwargs.pop('width'), kwargs.pop('height')))
self.setTabPosition(QtGui.QTabWidget.West)
self.setTabShape(QtGui.QTabWidget.Rounded)
class AdminTabWidget(QtGui.QWidget):
def __init__(self, parent=None):
super(AdminTabWidget, self).__init__(parent)
self.setWindowModality(QtCore.Qt.ApplicationModal)
self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
self.admin_page_locked_init()
self.admin_page_unlocked_init()
self.admin_page_layout = QtGui.QGridLayout()
self.admin_page_switch = QtGui.QStackedWidget()
self.admin_page_switch.addWidget(self.admin_locked_tab)
self.admin_page_switch.addWidget(self.admin_unlocked_tab)
self.admin_page_switch.setCurrentIndex(0)
self.admin_page_layout.addWidget(self.admin_page_switch,0,0)
def admin_page_locked_init(self):
self.admin_locked_tab = QtGui.QWidget()
self.admin_locked_tab.setFixedSize(550,225)
self.admin_locked_layout = QtGui.QGridLayout()
self.username_label = QtGui.QLabel('Username: ')
self.username_field = QtGui.QLineEdit()
self.username_field.returnPressed.connect(self.verify_credentials)
self.space_label = QtGui.QLabel(' ')
self.space_label.setFixedHeight(25)
self.password_label = QtGui.QLabel('Password: ')
self.password_field = QtGui.QLineEdit()
self.password_field.returnPressed.connect(self.verify_credentials)
self.password_field.setEchoMode(QtGui.QLineEdit.Password)
self.verify_button = QtGui.QPushButton('Ok')
self.verify_button.clicked.connect(self.verify_credentials)
self.cancel_button = QtGui.QPushButton('Cancel')
self.cancel_button.clicked.connect(self.unauthorized)
self.status_label = QtGui.QLabel('')
self.status_label.setAlignment(QtCore.Qt.AlignCenter)
self.button_layout = QtGui.QGridLayout()
self.button_layout.addWidget(self.verify_button,0,0,1,1)
self.button_layout.addWidget(self.cancel_button,0,1,1,1)
self.admin_locked_layout.addWidget(self.username_label,0,0,1,1)
self.admin_locked_layout.addWidget(self.username_field,0,1,1,1)
self.admin_locked_layout.addWidget(self.space_label,1,0,1,3)
self.admin_locked_layout.addWidget(self.password_label,2,0,1,1)
self.admin_locked_layout.addWidget(self.password_field,2,1,1,1)
self.admin_locked_layout.addWidget(self.status_label,3,0,1,3)
self.admin_locked_layout.addLayout(self.button_layout,4,0,1,3)
self.admin_locked_tab.setLayout(self.admin_locked_layout)
def verify_credentials(self):
print('button pressed')
# Grab username/password from input fields
self.username = str(self.username_field.text())
self.password = str(self.password_field.text())
self.status_label.setText('Verifying')
self.status_label.setStyleSheet('QLabel {color: rgb(117,255,161)}')
self.spin(.001)
print('verified')
def spin(self, seconds):
"""Pause for set amount of seconds, replaces time.sleep so program doesnt stall"""
time_end = time.time() + seconds
while time.time() < time_end:
QtGui.QApplication.processEvents()
def unauthorized(self):
print('unauthorized')
self.status_label.setText('Invalid username and/or password')
self.status_label.setStyleSheet('QLabel {color: rgb(255,65,106)}')
def admin_page_unlocked_init(self):
self.admin_unlocked_tab = QtGui.QWidget()
admin_unlocked_layout = QtGui.QGridLayout()
admin_unlocked_button = QtGui.QPushButton('unlocked')
admin_unlocked_layout.addWidget(admin_unlocked_button)
self.admin_unlocked_tab.setLayout(admin_unlocked_layout)
def get_admin_page_layout(self):
return self.admin_page_layout
if __name__ == '__main__':
# Create main application window
app = QtGui.QApplication(sys.argv)
# app.setStyleSheet(load_CSS(1))
app.setStyle(QtGui.QStyleFactory.create("Cleanlooks"))
font = QtGui.QFont('Ubuntu', 20)
font.setWeight(70)
app.setFont(font)
screen_height = QtGui.QApplication.desktop().screenGeometry().height()
main_window_tab = TabWidget(width=300, height=screen_height/8)
main_window_tab.setWindowTitle("Tab Layout")
main_window_tab.setWindowFlags(QtCore.Qt.FramelessWindowHint)
main_window_tab.showMaximized()
tab1 = QtGui.QWidget()
tab2 = QtGui.QWidget()
tab3 = QtGui.QWidget()
tab4 = QtGui.QWidget()
tab5 = QtGui.QWidget()
tab6 = QtGui.QWidget()
tab7 = QtGui.QWidget()
admin_tab = QtGui.QWidget()
admin_tab_widget = AdminTabWidget()
admin_tab.setLayout(admin_tab_widget.get_admin_page_layout())
main_window_tab.addTab(admin_tab, "Admin")
main_window_tab.addTab(tab1, "tab1")
main_window_tab.addTab(tab2, "tab2")
main_window_tab.addTab(tab3, "tab3")
main_window_tab.addTab(tab4, "tab4")
main_window_tab.addTab(tab5, "tab5")
main_window_tab.addTab(tab6, "tab6")
main_window_tab.addTab(tab7, "tab7")
main_window_tab.show()
QtGui.QShortcut(QtGui.QKeySequence('Ctrl+Q'), main_window_tab, exit_application)
sys.exit(app.exec_())