Profile picture

[Python / GUI] PySide6: 프로그램 만료일자 기능 구현

JaehyoJJAng2024년 08월 23일

개요

image
PySide6를 사용하여 프로그램에 만료일자 기능 을 구현하는 방법을 기록해보려고 한다.


만료일자 기능이 필요한 이유

  • 시험판 제공: 일정 기간 동안만 사용 가능한 체험판을 제공하여 사용자에게 프로그램 경험 기회를 제공
  • 라이센스 관리: 소프트웨어 사용 기한을 제한하여 라이센스 갱신을 유도할 수 있음.

구현 단계

만료일자 기능을 구현하기 위해 다음과 같은 단계를 따른다.

  • 1. 설치 날짜 저장: 프로그램을 처음 실행할 때 현재 날짜를 저장하도록 함.
    • 이 부분은 파일 시스템 또는 데이터베이스를 사용하도록 함 (이번 실습에서는 text 파일 시스템을 활용)
  • 2. 남은 기간 계산: 실행할 때마다 현재 날짜와 설치 날짜를 비교하여 남은 기간 계산
  • 3. 만료 여부 확인: 남은 기간이 만료되었는지 확인하고, 만료 시 프로그램 종료
  • 4. 남은 기간 표시: 사용자에게 프로그램 만료일까지 남은 기간 표시

코드 구현

아래는 위의 기능을 모두 포함한 전체 코드이다.

from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout
from PySide6.QtCore import Qt, QThread, Signal
from layout_ui import Ui_Form
from datetime import datetime, timedelta
import os
import json
import sys


__CONFIG_FILE: str = ".config.json"

def get_installation_date() -> datetime:
    if not os.path.exists(__CONFIG_FILE):
        # 처음 실행 시 현재 날짜를 저장
        install_date = datetime.now()
        with open(__CONFIG_FILE, "w") as fp:
            json.dump({"install_date": install_date.isoformat()}, fp)
    else:
        # 저장된 날짜 불러오기
        with open(__CONFIG_FILE, "r") as fp:
            data = json.load(fp)
            install_date = datetime.fromisoformat(data["install_date"])
    return install_date

def get_days_left(install_date: datetime, total_days: int = 13) -> dict[str, str | int]:
    current_date = datetime.now()
    delta = current_date - install_date
    days_plus = (install_date + timedelta(days=total_days)).strftime("%Y-%m-%d")
    days_left = total_days - delta.days
    return {"days_left": days_left, "days_plus": days_plus}

class APP(QWidget, Ui_Form):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        # 만료 라벨 지우기
        self.ValidateLog.clear()

        # 설치 날짜 갈져오기
        install_date: datetime = get_installation_date()

        # 남은 일수 계산
        days_info: dict[str, int | str] = get_days_left(install_date=install_date)

        # 만료 여부 확인
        if days_info["days_left"] <= 0:
            self.systemLog.addItem(f"🟠 (만료됨) 프로그램 사용 기간이 만료되었습니다.")
            sys.exit()
        self.initUI(days_left=days_info["days_left"], days_plus=days_info["days_plus"])

    def initUI(self, days_left: int, days_plus: str) -> None:
        # 남은 일수 표시
        self.ValidateLog.setText(f"만료일: {days_plus} ({days_left}일 남았습니다.)")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = APP()
    window.show()
    sys.exit(app.exec())

코드 설명

1. 설치 날짜 저장 및 불러오기

get_installation_date() 함수는 프로그램이 처음 실행될 때 현재 날짜를 .config.json 파일에 저장한다.

이후 실행 시에는 해당 파일에서 설치 날짜를 불러온다.

def get_installation_date() -> datetime:
    if not os.path.exists(__CONFIG_FILE):
        # 처음 실행 시 현재 날짜를 저장
        install_date = datetime.now()
        with open(__CONFIG_FILE, "w") as fp:
            json.dump({"install_date": install_date.isoformat()}, fp)
    else:
        # 저장된 날짜 불러오기
        with open(__CONFIG_FILE, "r") as fp:
            data = json.load(fp)
            install_date = datetime.fromisoformat(data["install_date"])
    return install_date

2. 남은 기간 계산

get_days_left() 함수는 설치 날짜와 현재 날짜의 차이를 계산하여 프로그램 만료일까지 남은 일수를 반환한다.

def get_days_left(install_date: datetime, total_days: int = 13) -> dict[str, str | int]:
    current_date = datetime.now()
    delta = current_date - install_date
    days_plus = (install_date + timedelta(days=total_days)).strftime("%Y-%m-%d")
    days_left = total_days - delta.days
    return {"days_left": days_left, "days_plus": days_plus}

3. 사용자에게 남은 기간 표시

initUi() 메소드에서는 남은 일수를 QLabel을 통해 사용자에게 보여준다.

def initUI(self, days_left: int, days_plus: str) -> None:
    # 남은 일수 표시
    self.ValidateLog.setText(f"만료일: {days_plus} ({days_left}일 남았습니다.)")

추가 고려사항

데이터 보안 강화

  • 파일 암호화: config.json 파일을 암호화하여 사용자가 임의로 수정하지 못하도록 함.
  • 숨김 파일 사용: 파일명을 .config처럼 숨김 파일로 지정하여 사용자가 쉽게 접근하지 못하도록 함.

Loading script...