A desktop game store and admin management system built in Python with CustomTkinter, featuring separate customer and administrator applications over a shared file-based data layer.
| Field | Value |
|---|---|
| Project | ScarZero Game Store |
| Author | Sifat Jaman |
| Course | CSE101 — Introduction to Python Programming |
| Institution | North South University |
| Type | Solo project |
| Language | Python 3.14+ |
| GUI Framework | CustomTkinter 5.2.2 |
| Size | 39 Python files, ~3,500 lines of code |
| Repository | sifat-jaman-13/GameStore-Python |
ScarZero Game Store is a two-application desktop system: a customer storefront where users register, browse a game catalogue, manage a cart and wallet, and build a library of purchases; and an admin console where an administrator manages the catalogue, users, and incoming requests.
Both applications share one data layer — pipe-separated text files in GameStoreApp/data/ — so changes made in the admin console are visible in the storefront on the next read.
The project demonstrates modular package design, separation of GUI from data access, input validation, and file-based persistence without an external database.
Seven sections, presented as tabs:
| Tab | Capability |
|---|---|
| Home | Welcome view with a curated list of highlighted titles |
| Store | Browse the catalogue, free-text search, filter by category |
| Library | View games already purchased |
| Cart | Add and remove games before checkout |
| Wallet | View balance and submit top-up requests for admin approval |
| Profile | View account details and submit change requests for approval |
| Messages | Support conversation with the administrator |
Plus registration and login with input validation.
Seven sections, presented as tabs:
| Tab | Capability |
|---|---|
| Dashboard | Overview cards for games, users, and support activity |
| Games | Add, edit, and delete games; manage categories |
| Users | View accounts and change status (active / disabled / banned) |
| Wallet Requests | Approve or reject customer top-up requests |
| Profile Requests | Approve or reject customer profile changes |
| Messages | Read and reply to customer support messages |
| Settings | Change the stored admin username and password |
Admin login is limited to 5 attempts; the counter persists across view changes.
| Requirement | Minimum |
|---|---|
| OS | Windows 10+, Linux (Ubuntu 20.04+), macOS 10.13+ |
| Python | 3.14 or higher |
| RAM | 512 MB |
| Disk | ~100 MB including the virtual environment |
customtkinter~=5.2.2
That is the project's only third-party dependency. Everything else is Python's standard library. On Linux, tkinter must also be present at the system level — see Troubleshooting.
python --versiongit clone https://github.com/sifat-jaman-13/GameStore-Python.git
cd GameStore-Python
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txtgit clone https://github.com/sifat-jaman-13/GameStore-Python.git
cd GameStore-Python
chmod +x setup_linux.sh
./setup_linux.sh
source .venv/bin/activateOr manually:
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txtFor a detailed Linux walkthrough, see LINUX_SETUP.md.
Activate the virtual environment first, then launch either application.
python run_admin.pypython GameStoreApp/main.pyBoth entry points insert the correct directories onto sys.path, so they can be run from the project root.
On first launch, init_db() creates any missing data files in GameStoreApp/data/.
Username: Sifat
Password: 1313
Defined in GameStoreApp/config.py and overridable from the console's Settings tab, which writes to data/admin.txt.
data/users.txt ships with 18 demo accounts. The primary one is:
Username: sifat13
Password: 1313
The remaining 17 use the password 1234. All demo contact details are placeholders.
⚠️ Security note: credentials are stored in plain text, which is acceptable for a coursework demonstration but not for production. A real deployment needs salted password hashing (for examplebcryptorargon2).
GameStore-Python/
├── run_admin.py # Admin console entry point
├── requirements.txt # Python dependencies
├── setup_linux.sh # Linux/macOS setup script
├── LINUX_SETUP.md # Detailed Linux guide
├── TEST_REPORT.md # Cross-platform test report
├── LICENSE # Proprietary license
├── ScarZero_Game_Store_Project_Summary.docx
└── GameStoreApp/
├── main.py # Customer storefront entry point
├── config.py # Titles, window size, admin defaults
├── auth/
│ ├── login.py # Customer login
│ ├── register.py # Customer registration
│ ├── admin_login.py # Admin login with attempt limiting
│ └── validation.py # Input validation helpers
├── admin/
│ ├── admin_dashboard.py # Admin shell and tab container
│ ├── manage_games.py # Game and category management
│ ├── manage_users.py # User account management
│ ├── wallet_requests.py # Wallet top-up approvals
│ ├── profile_requests.py # Profile change approvals
│ ├── admin_messages.py # Support message management
│ └── admin_settings.py # Admin credential changes
├── user/
│ ├── dashboard.py # Customer shell and tab container
│ ├── store.py # Catalogue browsing, search, filter
│ ├── cart.py # Shopping cart
│ ├── library.py # Purchased games
│ ├── wallet.py # Balance and top-up requests
│ ├── profile.py # Profile view and change requests
│ └── messages.py # Support conversation
├── core/
│ ├── file_handler.py # Read/write pipe-separated tables
│ ├── constants.py # File paths and separator
│ ├── catalog.py # Catalogue queries
│ ├── session.py # Logged-in user state
│ ├── admin_credentials.py # Admin credential storage
│ ├── message_utils.py # Message threading helpers
│ └── utils.py # Shared utilities
├── ui/
│ ├── theme.py # Colour and font theme
│ ├── styles.py # Styling helpers
│ └── components.py # Reusable widgets
├── data/ # Pipe-separated data files
└── assets/ # Application assets
The codebase is organised into five packages with one responsibility each:
auth/— entry gates. Validates input and hands a session to the dashboards.admin/anduser/— the two GUI trees. Each has a shell module that owns a tab container, plus one module per tab.core/— all data access. GUI modules never open files directly; they callfile_handler.read_table()andwrite_table(), which keeps the storage format in one place.ui/— theming and reusable widgets, so visual changes happen in one location.
Session holds the logged-in user, and controllers are passed down to child frames so navigation and shared state stay explicit rather than global.
Data lives in pipe-separated (|) text files under GameStoreApp/data/. init_db() creates any that are missing on startup.
| File | Contents |
|---|---|
games.txt |
62 games — id, title, genre, price, stock, developer, publisher, studio, year |
categories.txt |
35 category names |
users.txt |
18 demo accounts — username, password, email, phone, display name, status, balance |
admin.txt · cart.txt · purchases.txt · messages.txt · message_sessions.txt · message_status.txt · profile_requests.txt · wallet_requests.txt
These hold per-run state rather than project content, so they are excluded from version control and regenerated automatically.
Note: plain text is used deliberately, to keep the storage layer readable for coursework. A production system would use SQLite or PostgreSQL.
python is not recognised
Ensure Python is on your PATH. On Linux and macOS use python3.
Virtual environment will not activate
Use .venv\Scripts\activate on Windows and source .venv/bin/activate on Linux/macOS. Your prompt should show (.venv).
ModuleNotFoundError: No module named 'customtkinter'
The virtual environment is not active, or dependencies were not installed. Activate it, then run pip install --upgrade -r requirements.txt.
GUI fails to start on Linux (no module named _tkinter)
Install Tk at the system level:
sudo apt-get install python3-tk python3-dev # Debian / Ubuntu
sudo dnf install python3-tkinter # Fedora
sudo pacman -S tk # ArchPermission denied running setup_linux.sh
chmod +x setup_linux.shData files not found or not saving
GameStoreApp/data/ must be writable. The files are created automatically on first launch.
- Passwords are stored in plain text, not hashed.
- No database — concurrent writes from both applications running at once can overwrite each other.
- Store search is a single free-text match plus a category filter; there is no filtering by price range or developer.
- There is no review or rating system.
- The admin Dashboard tab shows summary counts only, not historical analytics or reports.
- Data files are read in full on each access, which would not scale past a few thousand rows.
- No automated test suite; verification was manual and is recorded in TEST_REPORT.md.
- Hash passwords with
bcryptorargon2 - Migrate the storage layer to SQLite behind the existing
file_handlerinterface - Add price-range and developer filters to the store
- Add a review and rating system
- Expand the admin dashboard into real sales reporting
- Add a
pytestsuite coveringcore/ - Package as a standalone executable with PyInstaller
- Package design — a multi-package application with clear responsibility boundaries
- GUI development — event-driven interfaces with CustomTkinter
- Separation of concerns — GUI code isolated from the data-access layer
- File I/O — designing and parsing a delimited storage format
- State management — sessions and controller passing across views
- Input validation — guarding every user-supplied field
- Cross-platform development — one codebase on Windows, Linux, and macOS
Sifat Jaman — @sifat-jaman-13 North South University, Department of Electrical and Computer Engineering
Movie-Project-Java — the same store architecture rebuilt in Java 17 with JavaFX, for CSE215.
Proprietary — all rights reserved.
This project is the intellectual property of Sifat Jaman.
- ✅ Permitted: viewing and forking for study and educational reference
- ❌ Not permitted: commercial use, redistribution, modification, or reuse in other projects without written permission
To request permission, contact @sifat-jaman-13. See LICENSE for the full terms.