สร้าง Windows Cleaner App มูลค่าหลักล้าน ด้วย AI ใน 1 วัน 🧹✨

เคยรู้สึกไหมว่า… พื้นที่ในคอมหายไปไหนหมด?

ผมเจอปัญหานี้บ่อยมาก เปิด Windows มา C: drive เหลือ 10GB แล้วก็งงว่า “อะไรกินพื้นที่ไปหมดวะ?”

เคยใช้ CCleaner, WinDirStat แต่รู้สึกว่า… เราน่าจะทำเองได้นะ?

และนี่คือจุดเริ่มต้นของ PCleaner 🎬


💡 ไอเดียเริ่มต้น

ต้องการโปรแกรมที่:

  • วิเคราะห์ว่าอะไรกินพื้นที่ดิสก์
  • ลบ cache browser ได้
  • ลบ temp files ได้
  • ไม่ลบอะไรพัง (สำคัญมาก!)
  • หน้าตาดูดี ใช้งานง่าย

Tech stack ที่เลือก: Python + PyQt6

ทำไมถึงเลือก Python? ก็เพราะ… เขียนเร็ว debug ง่าย แล้วก็ build เป็น .exe ได้ด้วย PyInstaller


🤖 Vibe Coding กับ Claude

คราวนี้ไม่ได้เขียนคนเดียว แต่ใช้ Claude (AI) มาช่วย pair programming

วิธีทำงาน:

  1. บอก Claude ว่าอยากได้อะไร
  2. Claude วางแผน (สร้าง plan file)
  3. เริ่ม implement ทีละ phase
  4. เจอ bug → debug ด้วยกัน
  5. วนซ้ำจนเสร็จ

มันเหมือนมี senior developer นั่งข้างๆ ที่ไม่มีวัน tired และ จำทุกอย่างได้หมด 😂


🏗️ สิ่งที่สร้าง

Core Features

FeatureDescription
Disk Analyzerสแกนดูว่าอะไรกิน space บ้าง แบบ tree view
System Cleanerลบ browser cache, temp files, recycle bin
Duplicate Finderหาไฟล์ซ้ำด้วย hash comparison
Large File Finderหาไฟล์ใหญ่ที่อาจไม่ได้ใช้แล้ว

Browser Support

รองรับ 6 browsers:

  • Chrome ✅
  • Firefox ✅
  • Edge ✅
  • Brave ✅
  • Opera ✅
  • Vivaldi ✅

Safety Features

อันนี้สำคัญมาก ไม่อยากให้มันลบอะไรพัง:

PROTECTED_PATHS = [
    "C:\\Windows",
    "C:\\Program Files",
    "C:\\Program Files (x86)",
    # ... drive roots
]

และใช้ send2trash library เป็น default — ลบแล้วไปอยู่ถังขยะก่อน ไม่หายถาวร


🐛 ปัญหาที่เจอ (และแก้ยังไง)

ปัญหาที่ 1: App ค้างตอนติ๊กถูก Browser

อาการ: อยู่ใน Cleaner tab หลัง scan เสร็จ พอติ๊กถูกที่ browser checkbox → Not Responding 💀

สาเหตุ:

  • ใช้ ItemIsAutoTristate flag ใน QTreeWidget
  • ทุกครั้งที่ติ๊ก มันจะ fire itemChanged signal หลายครั้ง
  • แต่ละครั้งเรียก psutil.process_iter() ไปเช็คว่า browser รันอยู่ไหม
  • process_iter() มัน ช้ามาก (ต้อง iterate ทุก process ในระบบ)

วิธีแก้:

# 1. Debounce timer - รอ 300ms ก่อนเช็ค
self._warning_check_timer = QTimer()
self._warning_check_timer.setSingleShot(True)
self._warning_check_timer.setInterval(300)

# 2. Process cache - cache ผลลัพธ์ไว้ 2 วินาที
self._process_cache: Optional[set] = None
self._process_cache_time: float = 0
self._process_cache_ttl: float = 2.0

ผลลัพธ์: จากค้าง 5-10 วินาที → ตอบสนองทันที ✨


ปัญหาที่ 2: Design ดูโบราณ

อาการ: UI มันดู… Windows XP? 😅

วิธีแก้: หา design inspiration มาให้ Claude ดู แล้วให้มันเขียน theme ใหม่

เปลี่ยนจาก default Qt style เป็น modern design:

  • สี Olive Green (#7C8C4E) เป็น primary
  • สี Gold (#D4A520) เป็น accent
  • ปุ่มทรงยาว pill-shaped (border-radius: 20px)
  • Card style แบบ rounded corners
# Before: ปุ่มเหลี่ยมๆ
QPushButton { border-radius: 4px; }

# After: ปุ่มโค้งมน สวยงาม
QPushButton { border-radius: 20px; padding: 12px 24px; }

ปัญหาที่ 3: SyntaxWarning ตอนรัน

อาการ:

SyntaxWarning: invalid escape sequence '\ '

สาเหตุ: docstring มี \\?\ (Windows long path prefix) แต่ไม่ได้ใช้ raw string

วิธีแก้: เปลี่ยน """ เป็น r"""

# Before
def to_long_path(path: str) -> str:
    """
    Path with \\?\ prefix if needed
    """

# After
def to_long_path(path: str) -> str:
    r"""
    Path with \\?\ prefix if needed
    """

เรื่องเล็กๆ แต่ถ้าไม่รู้ก็งงได้ 🤷


📦 Build & Distribution

สร้าง Standalone EXE

ใช้ PyInstaller สร้าง .exe ไฟล์เดียว:

pyinstaller PCleaner.spec --noconfirm

ได้ไฟล์ PCleaner.exe ขนาด ~40 MB

  • รันได้เลย ไม่ต้อง install Python
  • ส่งให้เพื่อนได้เลย

สร้าง Installer (Optional)

ใช้ Inno Setup สร้าง installer สวยๆ:

  • มี Start Menu shortcut
  • มี Desktop shortcut
  • มี Uninstaller
  • ดูโปรกว่า 😎

🎨 Icon

ใช้ AI generate icon มา แล้วแปลงเป็น .ico ด้วย Python:

from PIL import Image

img = Image.open('icon.png')
sizes = [(16,16), (32,32), (48,48), (64,64), (128,128), (256,256)]
img.save('icon.ico', format='ICO', sizes=sizes)

ง่ายมาก!


📊 สรุป Project Structure

PCleaner/
├── main.py                 # Entry point
├── app/
│   ├── core/
│   │   ├── scanner.py      # Disk scanning (parallel)
│   │   ├── cleaner.py      # System cleaning
│   │   ├── duplicate_finder.py
│   │   ├── large_file_finder.py
│   │   ├── safe_delete.py  # Safe deletion
│   │   └── browser_paths.py
│   ├── ui/
│   │   ├── main_window.py
│   │   ├── disk_analyzer_tab.py
│   │   ├── cleaner_tab.py
│   │   ├── duplicate_tab.py
│   │   ├── large_files_tab.py
│   │   ├── settings_tab.py
│   │   └── themes.py
│   └── config/
│       ├── settings.py
│       └── constants.py
├── assets/
│   └── icon.ico
├── PCleaner.spec           # PyInstaller config
├── installer.iss           # Inno Setup script
└── build.bat               # One-click build

🤔 สิ่งที่ได้เรียนรู้

1. AI เป็น Multiplier ไม่ใช่ Replacement

Claude ช่วยเขียน code ได้เร็วมาก แต่ยังต้อง:

  • บอกทิศทางที่ชัดเจน
  • ตรวจสอบ output
  • Debug เมื่อมีปัญหา
  • ตัดสินใจ design decisions

2. Premature Optimization is Evil

ตอนแรก focus ที่ทำให้มัน work ก่อน
แล้วค่อยมา optimize เมื่อเจอปัญหาจริง (เช่น UI freeze)

3. Cache Everything Expensive

psutil.process_iter() ช้า → cache มัน
Disk scan ช้า → ใช้ threading
UI update ช้า → ใช้ debounce

4. Safety First

สำหรับโปรแกรมที่ลบไฟล์ ต้องระวังมาก:

  • Protected paths list
  • send2trash เป็น default
  • Confirmation dialog
  • Audit logging

🚀 Next Steps?

ถ้ามีเวลา อาจจะเพิ่ม:

  • [ ] Scheduled cleaning (ทำความสะอาดอัตโนมัติ)
  • [ ] More detailed reports
  • [ ] Startup manager
  • [ ] Registry cleaner (อันนี้ต้องระวังมาก)

💬 Final Thoughts

ใช้เวลาประมาณ 1 วัน จาก idea → working app → distributable .exe

ถ้าเขียนคนเดียวไม่มี AI ช่วย คงใช้เวลา 1-2 สัปดาห์

นี่คือพลังของ Vibe Coding — บอกสิ่งที่ต้องการ แล้วให้ AI ช่วย implement

แต่สุดท้าย ยังต้องเข้าใจว่ามันทำงานยังไง เพื่อที่จะ debug และ improve ได้

Happy Coding! 🎉


ถ้าสนใจ source code หรืออยากลองใช้ บอกได้นะครับ

Scroll to Top