Hướng dẫn cài đặt và code ứng dụng với PyQt6 qua VSCode
Chào các bạn, mình là LearnixEdu .
Nếu bạn đang học Python và muốn bước chân vào thế giới phát triển ứng dụng desktop thực thụ — nơi bạn có thể tự tay dựng nên một phần mềm có cửa sổ, menu, nút bấm chạy mượt trên Windows, macOS và Linux — thì PyQt6 chính là bộ công cụ bạn cần biết. Hôm nay, mình sẽ hướng dẫn các bạn thiết lập môi trường Python + VSCode + PyQt6 từ con số 0 và viết hai ứng dụng ví dụ đầu tiên. Toàn bộ quá trình chỉ khoảng 45 phút nếu bạn đi từng bước theo hướng dẫn.
Phần 1: PyQt6 là gì và tại sao nên chọn?
PyQt6 là bộ binding Python của framework Qt 6 — một trong những thư viện giao diện desktop mạnh nhất hiện nay, đứng sau các phần mềm nổi tiếng như VLC Media Player, Krita, Telegram Desktop hay cả bộ IDE của JetBrains. Điểm đặc biệt của PyQt6 là bạn viết code bằng Python (đơn giản, dễ đọc) nhưng phần render giao diện lại chạy trên core C++ đã tối ưu cực kỳ kỹ — tức là bạn có cả tốc độ của C++ và sự tiện lợi của Python trong cùng một dự án.
📌 Bạn nên chọn PyQt6 khi:
Cần xây dựng ứng dụng có cửa sổ, menu, bảng dữ liệu, biểu đồ — những thứ web app khó làm mượt.
Muốn kết hợp với OpenCV, NumPy, Pandas để làm công cụ phân tích / xử lý dữ liệu cục bộ.
Cần triển khai cùng một ứng dụng trên cả 3 hệ điều hành chỉ với một codebase duy nhất.
Muốn sản phẩm trông "native" — giống ứng dụng thật chứ không phải web đóng khung.
Trước khi bắt đầu, mình cần nhắc các bạn một điều kiện cần: máy tính chạy Windows 10+, macOS 11+ hoặc Linux phổ thông; khoảng 1.5 GB trống trên ổ đĩa; và kết nối Internet ổn định để tải Python cùng các thư viện đi kèm.
Phần 2: Cài đặt Python 3.10+ đúng cách
PyQt6 yêu cầu Python phiên bản 3.9 trở lên . Trong thực tế, mình khuyến nghị các bạn dùng Python 3.10 hoặc 3.11 vì đây là hai phiên bản có hệ sinh thái thư viện ổn định và tương thích tốt nhất với PyQt6 hiện tại.
Các bước thực hiện:
Truy cập python.org/downloads và tải bản installer phù hợp với hệ điều hành.
Cực kỳ quan trọng nếu dùng Windows: ở màn hình đầu tiên của installer, phải tick vào ô "Add python.exe to PATH" trước khi bấm Install.
Chạy tiếp installer với các tùy chọn mặc định cho đến khi hoàn tất.
Mở Terminal (macOS / Linux) hoặc PowerShell (Windows) để kiểm tra Python đã cài đúng chưa.
💻 TERMINAL
$ python --version Python 3.11.7 $ pip --version pip 24.0 from .../site-packages/pip (python 3.11)
Phần 3: Thiết lập VSCode cho Python
VSCode là code editor miễn phí của Microsoft — nhẹ, nhanh, và có hệ sinh thái extension cực kỳ phong phú. Đây là lựa chọn được gần như toàn bộ cộng đồng Python khuyên dùng cho người mới. Tải VSCode tại code.visualstudio.com và cài với các lựa chọn mặc định.
Sau khi mở VSCode lần đầu, các bạn cần cài thêm 3 extension để có trải nghiệm code Python trọn vẹn. Mở panel Extensions bằng tổ hợp phím Ctrl + Shift + X (hoặc Cmd + Shift + X trên macOS), rồi tìm và cài:
Python (Microsoft) — extension bắt buộc phải có, cung cấp IntelliSense, debug, run file, và tự động nhận diện môi trường ảo.
Pylance — bổ sung khả năng kiểm tra kiểu dữ liệu tĩnh và gợi ý code thông minh hơn hẳn engine mặc định. Thường được cài kèm tự động khi bạn cài extension Python.
Black Formatter — tự động format code theo chuẩn PEP 8 mỗi khi bạn lưu file. Code luôn sạch đẹp mà không cần căn chỉnh thủ công.
Sau khi cài xong cả 3 extension, mở Command Palette bằng Ctrl + Shift + P , gõ Python: Select Interpreter và chọn đúng phiên bản Python bạn vừa cài. VSCode sẽ ghi nhớ lựa chọn này cho từng project riêng biệt.
Phần 4: Tạo project và môi trường ảo
Một trong những quy tắc quan trọng nhất khi làm việc với Python là: luôn dùng virtual environment (venv) cho mỗi project . Môi trường ảo giúp thư viện của project này không xung đột với project khác — ví dụ, project A cần PyQt6 bản 6.5, project B cần bản 6.7, bạn vẫn có thể giữ cả hai trên cùng một máy mà không đau đầu.
💻 TẠO PROJECT VÀ KÍCH HOẠT VENV
# 1. Tạo thư mục project và di chuyển vào $ mkdir pyqt6-demo $ cd pyqt6-demo # 2. Tạo virtual environment tên là venv $ python -m venv venv # 3a. Kích hoạt venv trên Windows (PowerShell) $ .\venv\Scripts\Activate.ps1 # 3b. Kích hoạt venv trên macOS / Linux $ source venv/bin/activate # Khi thành công, đầu dòng lệnh sẽ có (venv) (venv) $
Sau đó mở thư mục pyqt6-demo bằng VSCode qua menu File → Open Folder . VSCode thường sẽ tự động nhận diện venv và hỏi bạn có muốn dùng nó làm interpreter không — hãy bấm Yes .
Phần 5: Cài đặt thư viện PyQt6
Đảm bảo venv đang được kích hoạt (kiểm tra xem đầu dòng lệnh có chữ "(venv)" không), rồi chạy một lệnh pip duy nhất để cài PyQt6 cùng tất cả dependency đi kèm:
💻 CÀI PYQT6
(venv) $ pip install PyQt6 # pip sẽ tải khoảng 60-80 MB wheel bao gồm: # - PyQt6 core # - PyQt6-Qt6 (Qt runtime binaries) # - PyQt6-sip (binding layer) # Kiểm tra cài đặt thành công (venv) $ python -c "from PyQt6.QtCore import QT_VERSION_STR; print(QT_VERSION_STR)" 6.6.1
Nếu số phiên bản Qt được in ra mà không có lỗi đỏ nào, nghĩa là bạn đã sẵn sàng viết ứng dụng đầu tiên.
Phần 6: Ứng dụng "Hello PyQt6" đầu tiên
Trong VSCode, tạo file mới tên main.py ngay trong thư mục pyqt6-demo . Đây là template nhỏ nhất có thể của một ứng dụng PyQt6 — chỉ khoảng 15 dòng là có cửa sổ chạy được:
🐍 MAIN.PY
import sys from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout from PyQt6.QtCore import Qt class HelloWindow(QWidget): def __init__(self): super().__init__() self.setWindowTitle("Ứng dụng PyQt6 đầu tiên") self.resize(420, 220) label = QLabel("Xin chào từ PyQt6") label.setAlignment(Qt.AlignmentFlag.AlignCenter) label.setStyleSheet("font-size: 20px; font-weight: 600;") layout = QVBoxLayout() layout.addWidget(label) self.setLayout(layout) if __name__ == "__main__": app = QApplication(sys.argv) window = HelloWindow() window.show() sys.exit(app.exec())
Chạy file bằng một trong hai cách: bấm nút ▶ Run ở góc phải trên VSCode, hoặc gõ python main.py trong terminal (đảm bảo venv vẫn đang active). Một cửa sổ với tiêu đề "Ứng dụng PyQt6 đầu tiên" sẽ hiện ra, ở giữa là dòng chữ "Xin chào từ PyQt6".
🎉 Chúc mừng — bạn vừa chạy ứng dụng desktop Python đầu tiên!
Giải thích nhanh các thành phần: QApplication quản lý vòng đời của toàn bộ ứng dụng (mỗi chương trình PyQt6 chỉ có đúng một instance). QWidget là khối giao diện gốc. QLabel là widget hiển thị văn bản. QVBoxLayout xếp các widget con từ trên xuống. Và app.exec() khởi động event loop — chương trình sẽ chạy trong vòng lặp này để chờ sự kiện chuột / phím từ người dùng.
Phần 7: Ứng dụng đếm số — làm quen với Signal & Slot
Cơ chế Signal & Slot chính là linh hồn của Qt và cũng là khái niệm quan trọng nhất bạn cần nắm khi học PyQt6. Nguyên tắc rất đơn giản: khi một sự kiện xảy ra (ví dụ người dùng bấm nút), widget phát ra một signal . Bạn kết nối signal đó với một slot — chính là một hàm Python bình thường — và hàm đó sẽ được gọi mỗi khi signal phát ra.
Hãy viết lại file main.py thành một ứng dụng đếm số có ba nút: tăng, giảm, và reset:
🐍 MAIN.PY — COUNTER APP
import sys from PyQt6.QtWidgets import ( QApplication, QWidget, QLabel, QPushButton, QVBoxLayout, QHBoxLayout ) from PyQt6.QtCore import Qt class Counter(QWidget): def __init__(self): super().__init__() self.count = 0 self.setWindowTitle("Counter - PyQt6") self.resize(360, 200) # Khởi tạo widget self.label = QLabel("0") self.label.setAlignment(Qt.AlignmentFlag.AlignCenter) self.label.setStyleSheet("font-size: 48px; font-weight: 800;") btn_minus = QPushButton("-") btn_plus = QPushButton("+") btn_reset = QPushButton("Reset") # Kết nối signal 'clicked' với slot tương ứng btn_plus.clicked.connect(self.increase) btn_minus.clicked.connect(self.decrease) btn_reset.clicked.connect(self.reset) # Layout: hàng nút ngang, nằm dưới label row = QHBoxLayout() row.addWidget(btn_minus) row.addWidget(btn_reset) row.addWidget(btn_plus) col = QVBoxLayout() col.addWidget(self.label) col.addLayout(row) self.setLayout(col) def increase(self): self.count += 1 self.label.setText(str(self.count)) def decrease(self): self.count -= 1 self.label.setText(str(self.count)) def reset(self): self.count = 0 self.label.setText("0") if __name__ == "__main__": app = QApplication(sys.argv) win = Counter() win.show() sys.exit(app.exec())
Chạy lại file, bạn sẽ thấy một cửa sổ với số 0 to ở giữa và ba nút bên dưới. Mỗi lần bấm + hoặc - , số sẽ thay đổi tương ứng. Bấm Reset để đưa về 0.
🔑 Điểm mấu chốt ở đây là ba dòng sau:
btn_plus.clicked.connect(self.increase) btn_minus.clicked.connect(self.decrease) btn_reset.clicked.connect(self.reset)
Ở đây clicked là signal có sẵn của QPushButton , còn self.increase là slot bạn tự viết. Cú pháp signal.connect(slot) là mẫu bạn sẽ dùng đi dùng lại suốt quá trình code PyQt6.
Phần 8: Kho "Bỏ Túi" cho dân PyQt6 mới vào nghề
Để bạn không bị "khựng" khi mới bắt đầu, mình đóng gói sẵn một số widget và lệnh mà người mới thường cần tra cứu:
🧩 Widget hay dùng: QLineEdit — ô nhập một dòng văn bản (giống input).
QTextEdit — ô nhập nhiều dòng (giống textarea).
QComboBox — dropdown để chọn.
QCheckBox và QRadioButton — tick chọn.
QTableWidget — bảng dữ liệu có hàng và cột.
🎨 Styling cơ bản: Dùng widget.setStyleSheet("...") — cú pháp giống CSS.
Ví dụ: "background: #1e3a8a; color: white; border-radius: 8px;"
Style ở app gốc app.setStyleSheet(...) sẽ áp cho toàn ứng dụng.
⚡ Dialog có sẵn: QMessageBox.information(...) — hộp thông báo.
QFileDialog.getOpenFileName(...) — chọn file để mở.
QInputDialog.getText(...) — hỏi người dùng nhập chuỗi.
Bạn vừa có một nền tảng PyQt6 hoàn chỉnh: môi trường Python sạch, project cấu hình đúng trong VSCode, và hai ứng dụng ví dụ minh hoạ hai khái niệm cốt lõi là Widget & Layout và Signal & Slot . Từ đây bạn có thể đi tiếp với Qt Designer, kết nối SQLite, hoặc đóng gói app thành file .exe bằng PyInstaller. Chúc bạn code vui!
LearnixEdu
Hành trình tự học công nghệ