Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Cách dùng lớp PyQt QFileDialog để tạo hộp thoại chọn file
Trong lập trình giao diện người dùng với PyQt, việc cho phép người dùng tương tác với hệ thống file để mở hoặc lưu file là một tính năng rất phổ biến. Lớp QFileDialog
trong PyQt hỗ trợ tạo các hộp thoại chọn file hoặc thư mục một cách nhanh chóng và tiện lợi. Trong bài viết này, bạn sẽ tìm hiểu cách sử dụng lớp QFileDialog
để tạo hộp thoại chọn file, giúp người dùng có thể dễ dàng duyệt hệ thống file và chọn các file hoặc thư mục theo nhu cầu.
Giới thiệu về PyQt QFileDialog
Lớp QFileDialog
cho phép bạn tạo một widget hộp thoại file, cho phép người dùng duyệt hệ thống file và chọn một hoặc nhiều file hoặc một thư mục.
Để tạo đối tượng hộp thoại file, bạn khởi tạo một phiên bản mới của QFileDialog
như sau:
dialog = QFileDialog(self)
QFileDialog
có phương thức setFileMode()
để đặt chế độ lựa chọn file. Người dùng có thể chọn một file đã tồn tại:
Bài viết này được đăng tại [free tuts .net]
dialog.setFileMode(QFileDialog.FileMode.ExistingFiles)
hoặc một file chưa tồn tại:
dialog.setFileMode(QFileDialog.FileMode.AnyFile)
Tùy chọn này thường hữu ích trong trường hợp hộp thoại "Lưu dưới dạng" (Save As). Bạn có thể xem enum QFileDialog.FileMode
để biết các chế độ file đầy đủ.
Lọc kiểu file
Để chỉ định loại file mà người dùng có thể chọn, bạn sử dụng phương thức setNameFilter()
. Ví dụ, bộ lọc sau chỉ cho phép người dùng chọn các file PNG và JPEG:
dialog.setNameFilter("Hình ảnh (*.png *.jpg)")
Nếu muốn sử dụng nhiều bộ lọc, bạn phân tách bằng hai dấu chấm phẩy:
"Images (*.png *.jpg);;Vector (*.svg)"
Cài đặt chế độ xem cho hộp thoại file
Hộp thoại file có hai chế độ xem: dạng danh sách và dạng chi tiết.
- Dạng danh sách hiển thị các tên file và thư mục.
- Dạng chi tiết hiển thị thêm thông tin như kích thước file và ngày sửa đổi.
Để đặt chế độ xem, bạn sử dụng phương thức setViewMode()
:
dialog.setViewMode(QFileDialog.Detail)
Sau khi hoàn tất cấu hình, bạn có thể hiển thị hộp thoại bằng cách sử dụng phương thức exec()
và thu thập danh sách file được chọn:
if dialog.exec_(): fileNames = dialog.selectedFiles()
Đặt thư mục bắt đầu:
Để đặt thư mục mặc định khi mở hộp thoại file , bạn có thể sử dụng phương thức setDirectory()
. Ví dụ:
dialog.setDirectory('C:/images/')
Ví dụ PyQt QFileDialog
Chương trình sau sử dụng hộp thoại file để người dùng có thể chọn các file hình ảnh:
import sys from PyQt6.QtWidgets import QApplication, QWidget, QFileDialog, QGridLayout, QPushButton, QLabel, QListWidget from pathlib import Path class MainWindow(QWidget): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle('PyQt File Dialog') self.setGeometry(100, 100, 300, 150) layout = QGridLayout() self.setLayout(layout) # Nút chọn file file_browser_btn = QPushButton('Browse') file_browser_btn.clicked.connect(self.open_file_dialog) self.file_list = QListWidget(self) layout.addWidget(QLabel('Files:'), 0, 0) layout.addWidget(self.file_list, 1, 0) layout.addWidget(file_browser_btn, 2 ,0) self.show() def open_file_dialog(self): dialog = QFileDialog(self) dialog.setDirectory(r'C:\images') dialog.setFileMode(QFileDialog.FileMode.ExistingFiles) dialog.setNameFilter("Hình ảnh (*.png *.jpg)") dialog.setViewMode(QFileDialog.ViewMode.List) if dialog.exec(): filenames = dialog.selectedFiles() if filenames: self.file_list.addItems([str(Path(filename)) for filename in filenames]) if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() sys.exit(app.exec())
Chọn một file bằng phương thức getOpenFileName()
Một cách khác để mở hộp thoại file là sử dụng phương thức tĩnh getOpenFileName()
của lớp QFileDialog
. Ví dụ:
import sys from PyQt6.QtWidgets import QApplication, QFileDialog, QWidget, QGridLayout, QLineEdit, QPushButton, QLabel from pathlib import Path class MainWindow(QWidget): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle('PyQt File Dialog') self.setGeometry(100, 100, 400, 100) layout = QGridLayout() self.setLayout(layout) file_browse = QPushButton('Browse') file_browse.clicked.connect(self.open_file_dialog) self.filename_edit = QLineEdit() layout.addWidget(QLabel('File:'), 0, 0) layout.addWidget(self.filename_edit, 0, 1) layout.addWidget(file_browse, 0 ,2) self.show() def open_file_dialog(self): filename, _ = QFileDialog.getOpenFileName( self, "Chọn file", r"C:\images\", "Hình ảnh (*.png *.jpg)" ) if filename: path = Path(filename) self.filename_edit.setText(str(path)) if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() sys.exit(app.exec())
Chọn nhiều file với phương thức getOpenFileNames()
Để cho phép người dùng chọn nhiều file, bạn sử dụng phương thức getOpenFileNames()
. Ví dụ:
import sys from PyQt6.QtWidgets import QApplication, QFileDialog, QWidget, QGridLayout, QListWidget, QPushButton, QLabel from pathlib import Path class MainWindow(QWidget): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle('PyQt File Dialog') self.setGeometry(100, 100, 400, 100) layout = QGridLayout() self.setLayout(layout) file_browse = QPushButton('Browse') file_browse.clicked.connect(self.open_file_dialog) self.file_list = QListWidget(self) layout.addWidget(QLabel('Selected Files:'), 0, 0) layout.addWidget(self.file_list, 1, 0) layout.addWidget(file_browse, 2, 0) self.show() def open_file_dialog(self): filenames, _ = QFileDialog.getOpenFileNames( self, "Chọn file", r"C:\images\", "Hình ảnh (*.png *.jpg)" ) if filenames: self.file_list.addItems([str(Path(filename)) for filename in filenames]) if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() sys.exit(app.exec())
Chọn thư mục
Bạn có thể mở hộp thoại chọn thư mục bằng phương thức getExistingDirectory()
:
import sys from PyQt6.QtWidgets import QApplication, QFileDialog, QWidget, QGridLayout, QLineEdit, QPushButton, QLabel from pathlib import Path class MainWindow(QWidget): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle('PyQt File Dialog') self.setGeometry(100, 100, 400, 100) layout = QGridLayout() self.setLayout(layout) dir_btn = QPushButton('Browse') dir_btn.clicked.connect(self.open_dir_dialog) self.dir_name_edit = QLineEdit() layout.addWidget(QLabel('Directory:'), 1, 0) layout.addWidget(self.dir_name_edit, 1, 1) layout.addWidget(dir_btn, 1, 2) self.show() def open_dir_dialog(self): dir_name = QFileDialog.getExistingDirectory(self, "Chọn thư mục") if dir_name: path = Path(dir_name) self.dir_name_edit.setText(str(path)) if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() sys.exit(app.exec())
Kết bài
Hộp thoại file là một thành phần quan trọng giúp người dùng tương tác với hệ thống file một cách dễ dàng và trực quan. Bằng cách sử dụng lớp QFileDialog
, bạn có thể nhanh chóng tạo các widget hộp thoại để chọn file hoặc thư mục. Với các phương thức tĩnh như getOpenFileName()
, getOpenFileNames()
, và getExistingDirectory()
, lập trình viên có thể linh hoạt trong việc yêu cầu người dùng chọn một file, nhiều file, hoặc thư mục một cách hiệu quả. Việc này giúp cải thiện trải nghiệm người dùng và làm cho ứng dụng trở nên chuyên nghiệp hơn.