اريد طريقه اطبع الفاتوره في ملف وتكون جميله بنفس التخطيط بالواجهه
import sys
import traceback
import os
import sqlite3
fromPyQt6.QtWidgetsimport(QApplication,QWidget,QVBoxLayout,QTableWidget,QTableWidgetItem,QLabel,QLineEdit,QPushButton,QMessageBox,QSizePolicy,QSplitter,QHBoxLayout,QFrame)fromPyQt6.QtCoreimportQtfromPyQt6.QtGuiimportQPixmap,QPainterclassFieldsWidget(QWidget):def __init__(self):
super().__init__()# تعيين لون الخلفية يميل إلى البياض
self.setStyleSheet("background-color: #FFFFFF;")# لون خلفية مائل إلى البياض# إعداد التخطيط العام
main_layout =QVBoxLayout(self)
self.setLayout(main_layout)# تقسيم النافذة إلى قسمين باستخدام QSplitter
splitter =QSplitter(Qt.Orientation.Horizontal)# ---- القسم الأول: الفاتورة ----
right_layout =QVBoxLayout()# إعداد الرأس باستخدام QVBoxLayout
self.header_frame =QFrame()# حفظ إطار الرأس في خاصية الكائن self
self.header_frame.setStyleSheet("border: 2px solid #4CAF50; border-radius: 10px; padding: 10px;")
header_layout =QVBoxLayout(self.header_frame)# الشعار واسم الشركة في صف واحد
company_info_layout =QHBoxLayout()
self.logo_label =QLabel("الشعار")
self.logo_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.logo_label.setFixedSize(80,80)# حجم مربع مخصص للشعار
self.company_info_label =QLabel("اسم الشركة: شركة مثال\nالعنوان: شارع 123، المدينة\nاسم العميل: العميل الافتراضي")
self.company_info_label.setAlignment(Qt.AlignmentFlag.AlignLeft)
self.company_info_label.setStyleSheet("font-size: 12px;")# إضافة الشعار ومعلومات الشركة إلى التخطيط الأفقي
company_info_layout.addWidget(self.logo_label)
company_info_layout.addWidget(self.company_info_label)# عنوان الفاتورة
self.invoice_title_label =QLabel("فاتورة مبيعات مبسطة")
self.invoice_title_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.invoice_title_label.setStyleSheet("font-size: 16px; font-weight: bold;")# إضافة العناصر إلى header_layout
header_layout.addLayout(company_info_layout)
header_layout.addWidget(self.invoice_title_label)# إضافة الإطار إلى التخطيط العام
right_layout.addWidget(self.header_frame)# إضافة header_frame إلى التخطيط العام# إعداد جدول التفاصيل
self.table_details =QTableWidget()
self.table_details.setColumnCount(12)
self.table_details.setHorizontalHeaderLabels(["ID","رقم الفاتورة","رقم الصنف","اسم الصنف","السعر","الكمية","الإجمالي الفرعي","خصم الصنف","نسبة الخصم","الإجمالي بعد الخصم","قيمة الضريبة","الإجمالي بعد الضريبة"])
self.table_details.setColumnHidden(0,True)# إخفاء عمود المعرف
self.table_details.setColumnHidden(1,True)# إخفاء عمود رقم الفاتورة
self.table_details.setLayoutDirection(Qt.LayoutDirection.RightToLeft)# تغيير الاتجاه إلى اليمين لليسار
self.table_details.setSizePolicy(QSizePolicy.Policy.Expanding,QSizePolicy.Policy.Expanding)
right_layout.addWidget(self.table_details)# إعداد تخطيط الحقول السفلية
bottom_frame =QFrame()
bottom_frame.setStyleSheet("border: 2px solid #4CAF50; border-radius: 10px; padding: 10px;")
bottom_layout =QHBoxLayout(bottom_frame)# إعداد مستطيل الإجماليات
totals_widget =QWidget()
totals_layout =QVBoxLayout(totals_widget)
self.total_label =QLabel("الإجمالي: 0")
self.discount_label =QLabel("الخصم: 0")
self.vat_label =QLabel("قيمة الضريبة: 0")
self.total_after_vat_label =QLabel("الإجمالي بعد الضريبة: 0")# إضافة الحقول إلى التخطيط العمودي
totals_layout.addWidget(self.total_label)
totals_layout.addWidget(self.discount_label)
totals_layout.addWidget(self.vat_label)
totals_layout.addWidget(self.total_after_vat_label)# ضبط ارتفاع مستطيل الإجماليات
totals_widget.setFixedHeight(170)# تقليل الارتفاع إلى 100 بكسل# إضافة مستطيل الإجماليات إلى التخطيط السفلي
bottom_layout.addWidget(totals_widget)# إعداد تخطيط المدفوعات
payments_widget =QWidget()
payments_layout =QVBoxLayout(payments_widget)
self.cash_paid_label =QLabel("المدفوع نقداً: 0")
self.bank_paid_label =QLabel("المدفوع بنك: 0")# إضافة حقول المدفوعات
payments_layout.addWidget(self.cash_paid_label)
payments_layout.addWidget(self.bank_paid_label)# ضبط ارتفاع مستطيل المدفوعات
payments_widget.setFixedHeight(100)# تقليل الارتفاع إلى 100 بكسل# إضافة مستطيل المدفوعات إلى التخطيط السفلي
bottom_layout.addWidget(payments_widget)# إعداد تخطيط الباركود
barcode_widget =QWidget()
barcode_layout =QVBoxLayout(barcode_widget)# حقل للباركود
self.barcode_label =QLabel()# لا نضع نص هنا
self.barcode_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.barcode_label.setFixedSize(150,100)# تصغير حجم الباركود إلى 150x100 بكسل# إضافة الباركود إلى التخطيط
barcode_layout.addWidget(self.barcode_label)# ضبط ارتفاع مستطيل الباركود
barcode_widget.setFixedHeight(120)# تقليل الارتفاع إلى 120 بكسل# إضافة مستطيل الباركود إلى التخطيط السفلي
bottom_layout.addWidget(barcode_widget)# إضافة الإطار إلى التخطيط العام
right_layout.addWidget(bottom_frame)# إضافة القسم الأيمن إلى QSplitter
right_widget =QWidget()
right_widget.setLayout(right_layout)
splitter.addWidget(right_widget)# ---- القسم الثاني: البحث والفواتير ----
left_layout =QVBoxLayout()# حقل البحث
self.search_input =QLineEdit(self)
self.search_input.setPlaceholderText("ابحث عن رقم الفاتورة...")
self.search_input.textChanged.connect(self.filter_invoices)
left_layout.addWidget(self.search_input)# إعداد جدول الفواتير
self.table_invoices =QTableWidget()
self.table_invoices.setColumnCount(13)
self.table_invoices.setHorizontalHeaderLabels(["ID","رقم الفاتورة","نوع الفاتورة","نوع الدفع","رقم الحساب","التاريخ","الإجمالي","الخصم","الإجمالي بعد الخصم","قيمة الضريبة","الإجمالي بعد الضريبة","المدفوع نقدا","المدفوع بنك"])
self.table_invoices.setColumnHidden(0,True)# إخفاء عمود المعرف
self.table_invoices.setSizePolicy(QSizePolicy.Policy.Expanding,QSizePolicy.Policy.Expanding)
left_layout.addWidget(self.table_invoices)# إضافة القسم الأيسر إلى QSplitter
left_widget =QWidget()
left_widget.setLayout(left_layout)
splitter.addWidget(left_widget)# إضافة QSplitter إلى التخطيط الرئيسي
main_layout.addWidget(splitter)# إضافة المتغيرات الجديدة
self.selected_invoice_number =None
self.load_data()
self.table_invoices.cellClicked.connect(self.load_invoice_details)
self.setWindowTitle("معاينة الفاتورة")
self.setGeometry(300,300,1000,600)# تعديل حجم النافذةdef filter_invoices(self):
search_text = self.search_input.text().lower()
filtered_invoices =[invoice for invoice in self.invoices_data if search_text in invoice[1].lower()]
self.populate_invoices_table(filtered_invoices)def populate_invoices_table(self, invoices):
self.table_invoices.setRowCount(0)for invoice in invoices:
row_position = self.table_invoices.rowCount()
self.table_invoices.insertRow(row_position)for column, data in enumerate(invoice):
self.table_invoices.setItem(row_position, column,QTableWidgetItem(str(data)))def load_data(self):
base_dir = os.path.dirname(os.path.abspath(__file__))# المجلد الحالي
db_path = os.path.join(base_dir,'..','data','database.db')# المسار إلى قاعدة البياناتifnot os.path.exists(db_path):QMessageBox.critical(self,"خطأ","قاعدة البيانات غير موجودة.")return
conn = sqlite3.connect(db_path)
cursor = conn.cursor()# جلب جميع الفواتير
cursor.execute("SELECT * FROM invoices")
self.invoices_data = cursor.fetchall()
self.populate_invoices_table(self.invoices_data)
conn.close()def load_invoice_details(self, row, column):
invoice_number = self.table_invoices.item(row,1).text()# الحصول على رقم الفاتورة من العمود الثاني
self.load_invoice_details_from_db(invoice_number)def load_invoice_details_from_db(self, invoice_number):
base_dir = os.path.dirname(os.path.abspath(__file__))# المجلد الحالي
db_path = os.path.join(base_dir,'..','data','database.db')# المسار إلى قاعدة البياناتifnot os.path.exists(db_path):QMessageBox.critical(self,"خطأ","قاعدة البيانات غير موجودة.")return
conn = sqlite3.connect(db_path)
cursor = conn.cursor()# جلب تفاصيل الفاتورة من جدول invoice_details
cursor.execute("SELECT * FROM invoice_details WHERE invoice_number=?",(invoice_number,))
details_data = cursor.fetchall()# عرض تفاصيل الفاتورة في الجدول
self.populate_invoice_details_table(details_data)# جلب المعلومات من جدول الفواتير الأساسي (للحصول على القيم الإجمالية والمدفوعات)
cursor.execute("""
SELECT total, total_discount, discount_percentage, total_after_discount, vat_value, total_after_vat, paid_cash, paid_bank
FROM invoices
WHERE invoice_number=?
""",(invoice_number,))
invoice_data = cursor.fetchone()if invoice_data:# تحديث الحقول الإجمالية والمدفوعات
self.total_label.setText(f"الإجمالي: {invoice_data[0]}")
self.discount_label.setText(f"الخصم: {invoice_data[1]}")
self.vat_label.setText(f"قيمة الضريبة: {invoice_data[4]}")
self.total_after_vat_label.setText(f"الإجمالي بعد الضريبة: {invoice_data[5]}")
self.cash_paid_label.setText(f"المدفوع نقداً: {invoice_data[6]}")
self.bank_paid_label.setText(f"المدفوع بنك: {invoice_data[7]}")else:# إذا لم يتم العثور على الفاتورة، نقوم بإعادة ضبط الحقول
self.total_label.setText("الإجمالي: 0")
self.discount_label.setText("الخصم: 0")
self.vat_label.setText("قيمة الضريبة: 0")
self.total_after_vat_label.setText("الإجمالي بعد الضريبة: 0")
self.cash_paid_label.setText("المدفوع نقداً: 0")
self.bank_paid_label.setText("المدفوع بنك: 0")# إعداد الباركود
barcode_image_path = os.path.join(base_dir,'barcodes', f"{invoice_number}.png")if os.path.exists(barcode_image_path):
pixmap =QPixmap(barcode_image_path)
self.barcode_label.setPixmap(pixmap)
self.barcode_label.setScaledContents(True)else:
self.barcode_label.setText("لا توجد صورة باركود")
conn.close()def populate_invoice_details_table(self, details):
self.table_details.setRowCount(0)for detail in details:
row_position = self.table_details.rowCount()
self.table_details.insertRow(row_position)for column, data in enumerate(detail):
self.table_details.setItem(row_position, column,QTableWidgetItem(str(data)))def exception_hook(type, value, tb):print("Unhandled Exception:")print(f"Type: {type.__name__}")print(f"Value: {value}")print("Traceback:")
traceback.print_tb(tb)if __name__ =="__main__":
sys.excepthook = exception_hook
app =QApplication(sys.argv)
window =FieldsWidget()
window.show()
sys.exit(app.exec())
السؤال
صابر مغترب
اريد طريقه اطبع الفاتوره في ملف وتكون جميله بنفس التخطيط بالواجهه
3 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.