عنصر QProgressBar يُستخدم لعرض مستوى تقدم عملية معينة بشكل مرئي، سواء كانت هذه العملية رفع ملف، تحميل بيانات، أو أي عملية طويلة نسبيًا. يمكن إظهار التقدم كنسبة مئوية أو شريط تعبئة.
إنشاء QProgressBar
لإضافة QProgressBar في نافذة PyQt نحتاج إلى:
-
استيراد المكتبات اللازمة.
-
إنشاء عنصر QProgressBar.
-
ضبط القيم الدنيا والعليا.
-
تحديث قيمة التقدم أثناء تنفيذ العملية.
مثال عملي
import sys
import time
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QProgressBar
from PyQt5.QtCore import Qt, QThread, pyqtSignal
# خيط منفصل لتنفيذ العملية بدون تجميد الواجهة
class Worker(QThread):
progress_changed = pyqtSignal(int)
def run(self):
for i in range(101):
time.sleep(0.05) # محاكاة عملية تستغرق وقت
self.progress_changed.emit(i)
class ProgressBarExample(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("مثال QProgressBar")
self.setGeometry(200, 200, 300, 150)
layout = QVBoxLayout()
# إنشاء شريط التقدم
self.progress_bar = QProgressBar()
self.progress_bar.setMinimum(0) # الحد الأدنى
self.progress_bar.setMaximum(100) # الحد الأقصى
self.progress_bar.setAlignment(Qt.AlignCenter) # محاذاة النص في الوسط
layout.addWidget(self.progress_bar)
# زر البدء
self.btn_start = QPushButton("ابدأ العملية")
self.btn_start.clicked.connect(self.start_progress)
layout.addWidget(self.btn_start)
self.setLayout(layout)
def start_progress(self):
self.worker = Worker()
self.worker.progress_changed.connect(self.update_progress)
self.worker.start()
def update_progress(self, value):
self.progress_bar.setValue(value)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = ProgressBarExample()
window.show()
sys.exit(app.exec_())
الشرح
-
QProgressBar: العنصر الذي يعرض نسبة التقدم.
-
setMinimum()
وsetMaximum()
: لتحديد نطاق القيم (عادةً من 0 إلى 100). -
QThread: استخدمناه لتشغيل العملية في خيط منفصل حتى لا تتجمد الواجهة.
-
pyqtSignal: لإرسال القيم الجديدة إلى شريط التقدم.
-
setValue(value)
: لتحديث التقدم الحالي.
أفكار للتطوير
-
إضافة زر لإلغاء العملية.
-
تغيير شكل شريط التقدم إلى دائري (باستخدام مكتبات إضافية أو رسم مخصص).
-
عرض الوقت المتبقي حتى انتهاء العملية.
📌 التمرين
أنشئ برنامجًا باستخدام PyQt5 يحتوي على:
-
جدول
QTableWidget
لإدخال بيانات (الاسم، العمر، الوظيفة). -
زرين:
-
زر إضافة صف (يضيف صفًا فارغًا).
-
زر حذف الصف المحدد.
-
-
زر حفظ البيانات إلى ملف Excel.
-
عند فتح الملف في Excel، تظهر البيانات بنفس الترتيب الموجود في الجدول.
💻 الحل
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QTableWidget, QTableWidgetItem, QPushButton, QHBoxLayout, QMessageBox
import pandas as pd
class ExcelTableApp(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("حفظ البيانات إلى Excel - PyQt5")
self.setGeometry(200, 200, 500, 400)
# التخطيط الرئيسي
layout = QVBoxLayout()
# إنشاء الجدول
self.table = QTableWidget()
self.table.setColumnCount(3)
self.table.setHorizontalHeaderLabels(["الاسم", "العمر", "الوظيفة"])
layout.addWidget(self.table)
# أزرار التحكم
button_layout = QHBoxLayout()
btn_add = QPushButton("➕ إضافة صف")
btn_add.clicked.connect(self.add_row)
button_layout.addWidget(btn_add)
btn_delete = QPushButton("🗑 حذف الصف المحدد")
btn_delete.clicked.connect(self.delete_row)
button_layout.addWidget(btn_delete)
btn_save = QPushButton("💾 حفظ إلى Excel")
btn_save.clicked.connect(self.save_to_excel)
button_layout.addWidget(btn_save)
layout.addLayout(button_layout)
self.setLayout(layout)
def add_row(self):
"""إضافة صف جديد"""
row_position = self.table.rowCount()
self.table.insertRow(row_position)
def delete_row(self):
"""حذف الصف المحدد"""
selected_row = self.table.currentRow()
if selected_row != -1:
self.table.removeRow(selected_row)
else:
QMessageBox.warning(self, "تحذير", "الرجاء تحديد صف للحذف.")
def save_to_excel(self):
"""حفظ البيانات من الجدول إلى ملف Excel"""
rows = self.table.rowCount()
cols = self.table.columnCount()
data = []
for row in range(rows):
row_data = []
for col in range(cols):
item = self.table.item(row, col)
row_data.append(item.text() if item else "")
data.append(row_data)
# إنشاء DataFrame وحفظه
df = pd.DataFrame(data, columns=["الاسم", "العمر", "الوظيفة"])
df.to_excel("data.xlsx", index=False)
QMessageBox.information(self, "تم الحفظ", "تم حفظ البيانات في ملف data.xlsx بنجاح.")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = ExcelTableApp()
window.show()
sys.exit(app.exec_())
📂 ملاحظات
-
يتم حفظ البيانات في ملف
data.xlsx
بنفس مجلد البرنامج. -
يمكن فتح الملف مباشرة في Excel أو LibreOffice.
-
يمكنك تعديل أسماء الأعمدة أو إضافة المزيد منها حسب الحاجة.