개요
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
처럼 숨김 파일로 지정하여 사용자가 쉽게 접근하지 못하도록 함.