-
المساهمات
14 -
تاريخ الانضمام
-
تاريخ آخر زيارة
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو صابر مغترب
-
السلام عليكم احبتي هل ممكن كود يعرض واجهه وفيه اختيار للتطبيق المحدد ويحوله لملف تنفيذي كي يعمل عند الاخرين الذي ليس لديهم مثبت بايثون
-
احبتي الكرام السلام عليكم ورحمه الله عندي الداله واعتقد بانها لا تتعامل صحيحا اريد تتعامل صحيح مع الالوف مثلا 102500 هنا اريد مائة الف والفين وخمسمائه ريال او تعطونا الطريقه الصحيحه// import sys from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QLineEdit, QPushButton, QTextEdit, QMessageBox class TafqitApp(QWidget): def __init__(self): super().__init__() # إعداد الواجهة self.initUI() def initUI(self): layout = QVBoxLayout() # حقل إدخال الرقم self.input_label = QLabel("أدخل المبلغ:") self.input_field = QLineEdit() # زر التحويل self.convert_button = QPushButton("تحويل إلى حروف") self.convert_button.clicked.connect(self.convert_to_words) # حقل عرض النص المحول self.result_label = QLabel("الناتج بالحروف:") self.result_field = QTextEdit() self.result_field.setReadOnly(True) # إضافة العناصر إلى الواجهة layout.addWidget(self.input_label) layout.addWidget(self.input_field) layout.addWidget(self.convert_button) layout.addWidget(self.result_label) layout.addWidget(self.result_field) self.setLayout(layout) self.setWindowTitle("تحويل الأرقام إلى حروف") # دالة لتحويل الرقم إلى نص def tafqit(self, number): def tafqitThreeDigits(n): units = ["", "واحد", "اثنان", "ثلاثة", "أربعة", "خمسة", "ستة", "سبعة", "ثمانية", "تسعة"] teens = ["عشرة", "أحد عشر", "اثنا عشر", "ثلاثة عشر", "أربعة عشر", "خمسة عشر", "ستة عشر", "سبعة عشر", "ثمانية عشر", "تسعة عشر"] tens = ["", "عشرة", "عشرون", "ثلاثون", "أربعون", "خمسون", "ستون", "سبعون", "ثمانون", "تسعون"] hundreds = ["", "مائة", "مائتان", "ثلاثمائة", "أربعمائة", "خمسمائة", "ستمائة", "سبعمائة", "ثمانمائة", "تسعمائة"] result = "" hundred = n // 100 n %= 100 ten = n // 10 unit = n % 10 if hundred > 0: result += hundreds[hundred] + " " if 10 <= n < 20: result += teens[n - 10] + " " else: if unit > 0: result += units[unit] + " " # الوحدة أولاً if ten > 0: result += "و " + tens[ten] + " " if unit > 0 else tens[ten] + " " return result.strip() if number == 0: return "صفر" # تقسيم الرقم إلى الريال والهللات whole_part = int(number) fractional_part = round((number - whole_part) * 100) millions = whole_part // 1000000 whole_part %= 1000000 thousands = whole_part // 1000 whole_part %= 1000 result = "" if millions > 0: result += tafqitThreeDigits(millions) + " مليون " if thousands > 0: # إضافة "ألف" بدون "واحد" إذا كان العدد أكثر من 1000 result += tafqitThreeDigits(thousands) + " ألف " if thousands > 1 else "ألف " if whole_part > 0: result += "و " + tafqitThreeDigits(whole_part) if result else tafqitThreeDigits(whole_part) result += " ريال" # إضافة "ريال" بعد الرقم الأساسي # إضافة الهللات إذا كانت موجودة if fractional_part > 0: result += " و " + tafqitThreeDigits(fractional_part) + " هللة" return result.strip() # دالة لتحويل الرقم في الحقل إلى نص وعرضه def convert_to_words(self): try: number = float(self.input_field.text()) result = self.tafqit(number) self.result_field.setText(result) except ValueError: self.result_field.setText("الرجاء إدخال رقم صالح") if __name__ == '__main__': app = QApplication(sys.argv) window = TafqitApp() window.show() sys.exit(app.exec())
-
بارك الله فيك استاذي مشكوررر اعطيتني شي جميل جدا ولكن كوني متعلم جديد واستعين بعد الله بكم وبالبحث هنا وهناك واللذكاء الصناعي الا اني اجد الابداع فيك فحبيت اغير الوضع ونبدا بشكل افضل للواجهه حيث تبدو جذابه الان بحاجه اضافه الي اسفل الفاتوره الاجماليات والتي تتبع جدول الفاتوره import sys import traceback import os import sqlite3 from PyQt6.QtWidgets import ( QApplication, QWidget, QVBoxLayout, QPushButton, QLabel, QFrame, QHBoxLayout, QLineEdit, QMessageBox, QCompleter, QTableWidget, QTableWidgetItem ) from PyQt6.QtGui import QPixmap from PyQt6.QtCore import Qt class FieldsWidget(QWidget): def __init__(self): super().__init__() self.setStyleSheet("background-color: #FFFFFF;") main_layout = QVBoxLayout(self) self.setLayout(main_layout) # Search field for invoice number self.search_field = QLineEdit(self) self.search_field.setPlaceholderText("ابحث عن رقم الفاتورة...") main_layout.addWidget(self.search_field) # Load invoice numbers for auto-complete invoice_numbers = self.get_invoice_numbers() if invoice_numbers: completer = QCompleter(invoice_numbers) self.search_field.setCompleter(completer) # Connect the textChanged signal to update invoice details self.search_field.textChanged.connect(self.update_invoice_details) # Header setup self.header_frame = self.create_header() main_layout.addWidget(self.header_frame) # Invoice details setup self.invoice_details_frame = self.create_invoice_details() main_layout.addWidget(self.invoice_details_frame) # Table setup for displaying invoice items self.table_details = QTableWidget() self.table_details.setColumnCount(8) # Set the number of columns self.table_details.setHorizontalHeaderLabels([ "ID", "رقم الفاتورة", "رقم الصنف", "اسم الصنف", "السعر", "الكمية", "المجموع الفرعي", "الإجمالي بعد الضريبة" ]) main_layout.addWidget(self.table_details) self.setWindowTitle("معاينة الفاتورة") self.setGeometry(300, 300, 800, 600) def create_header(self): # Create header frame header_frame = QFrame() header_frame.setStyleSheet("border: 2px solid #4CAF50; border-radius: 10px; padding: 10px;") header_layout = QVBoxLayout(header_frame) # Company info layout company_info_layout = QHBoxLayout() company_data = self.get_company_data() if company_data: company_name, company_activity, company_address, tax_number, logo_path = company_data self.logo_label = QLabel(self) self.logo_pixmap = QPixmap(logo_path) if not self.logo_pixmap.isNull(): self.logo_label.setPixmap(self.logo_pixmap.scaled(80, 80, Qt.AspectRatioMode.KeepAspectRatio)) self.company_info_label = QLabel( f"اسم الشركة: {company_name}\n" f"النشاط: {company_activity}\n" f"العنوان: {company_address}\n" f"الرقم الضريبي: {tax_number}" ) else: self.logo_label = QLabel("شعار غير متوفر") self.company_info_label = QLabel("بيانات الشركة غير متوفرة") 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.addLayout(company_info_layout) header_layout.addWidget(self.invoice_title_label) return header_frame def create_invoice_details(self): # Create invoice details frame invoice_details_frame = QFrame() invoice_details_frame.setStyleSheet("border: 2px solid #4CAF50; border-radius: 10px; padding: 10px;") invoice_details_layout = QHBoxLayout(invoice_details_frame) # Invoice info self.invoice_info_frame = QFrame() self.invoice_info_frame.setStyleSheet("border: 1px solid #000000; padding: 5px;") invoice_info_layout = QVBoxLayout(self.invoice_info_frame) self.invoice_number_label = QLabel("رقم الفاتورة: ") self.invoice_date_label = QLabel("تاريخ الفاتورة: ") self.payment_type_label = QLabel("نوع الدفع: ") invoice_info_layout.addWidget(self.invoice_number_label) invoice_info_layout.addWidget(self.invoice_date_label) invoice_info_layout.addWidget(self.payment_type_label) self.invoice_info_frame.setLayout(invoice_info_layout) # Client info self.client_info_frame = QFrame() self.client_info_frame.setStyleSheet("border: 1px solid #000000; padding: 5px;") client_info_layout = QVBoxLayout(self.client_info_frame) self.account_number_label = QLabel("رقم الحساب: 98765") self.client_name_label = QLabel("اسم العميل: أحمد محمد") self.client_address_label = QLabel("عنوان العميل: الرياض") client_info_layout.addWidget(self.account_number_label) client_info_layout.addWidget(self.client_name_label) client_info_layout.addWidget(self.client_address_label) self.client_info_frame.setLayout(client_info_layout) # Add frames to layout invoice_details_layout.addWidget(self.invoice_info_frame) invoice_details_layout.addWidget(self.client_info_frame) return invoice_details_frame def update_invoice_details(self): """تحديث تفاصيل الفاتورة عند تغيير نص البحث""" invoice_number = self.search_field.text() self.invoice_number_label.setText(f"رقم الفاتورة: {invoice_number}") # تحديث رقم الفاتورة في الواجهة if invoice_number: self.load_invoice_details(invoice_number) def load_invoice_details(self, invoice_number): """تحميل تفاصيل الفاتورة استنادًا إلى رقم الفاتورة المحدد""" data_dir = os.path.dirname(os.path.abspath(__file__)) db_file = os.path.join(data_dir, '..', 'data', 'database.db') try: conn = sqlite3.connect(db_file) cursor = conn.cursor() cursor.execute('SELECT payment_type, date FROM invoices WHERE invoice_number = ?', (invoice_number,)) result = cursor.fetchone() if result: payment_type, date = result self.payment_type_label.setText(f"نوع الدفع: {payment_type}") self.invoice_date_label.setText(f"تاريخ الفاتورة: {date}") # تحديث تاريخ الفاتورة else: self.payment_type_label.setText("نوع الدفع: غير متوفر") self.invoice_date_label.setText("تاريخ الفاتورة: غير متوفر") # تحديث حالة عدم توفر التاريخ # Load invoice items from `invoice_details` table self.load_invoice_items(invoice_number) except sqlite3.Error as e: print(f"خطأ في تحميل تفاصيل الفاتورة: {e}") finally: conn.close() def load_invoice_items(self, invoice_number): """تحميل تفاصيل الأصناف المرتبطة بالفاتورة من جدول invoice_details""" data_dir = os.path.dirname(os.path.abspath(__file__)) db_file = os.path.join(data_dir, '..', 'data', 'database.db') try: conn = sqlite3.connect(db_file) cursor = conn.cursor() # Query to fetch items related to the invoice cursor.execute('SELECT id, invoice_number, item_number, item_name, price, quantity, subtotal, sub_total_after_vat FROM invoice_details WHERE invoice_number = ?', (invoice_number,)) items = cursor.fetchall() # Clear the table before adding new rows self.table_details.setRowCount(0) # Populate the table with fetched items for row_num, row_data in enumerate(items): self.table_details.insertRow(row_num) for col_num, data in enumerate(row_data): self.table_details.setItem(row_num, col_num, QTableWidgetItem(str(data))) except sqlite3.Error as e: print(f"خطأ في تحميل تفاصيل الأصناف: {e}") finally: conn.close() def get_invoice_numbers(self): """استرجاع أرقام الفواتير من قاعدة البيانات""" data_dir = os.path.dirname(os.path.abspath(__file__)) db_file = os.path.join(data_dir, '..', 'data', 'database.db') # Print path for debugging print(f"Database file path: {db_file}") # Ensure the data directory exists if not os.path.exists(data_dir): os.makedirs(data_dir) try: conn = sqlite3.connect(db_file) cursor = conn.cursor() # استرجاع أرقام الفواتير cursor.execute('SELECT invoice_number FROM invoices') result = cursor.fetchall() # إعادة قائمة بأرقام الفواتير return [str(row[0]) for row in result] if result else [] except sqlite3.Error as e: print(f"خطأ في استرجاع أرقام الفواتير: {e}") return [] finally: conn.close() def get_company_data(self): """استرجاع بيانات الشركة من قاعدة البيانات""" data_dir = os.path.dirname(os.path.abspath(__file__)) db_file = os.path.join(data_dir, '..', 'data', 'database.db') conn = sqlite3.connect(db_file) cursor = conn.cursor() try: # استرجاع جميع الأعمدة المطلوبة cursor.execute('SELECT company_name, company_activity, company_address, tax_number, logo_path FROM company_data WHERE id = 1') result = cursor.fetchone() if result: return result else: print("لم يتم العثور على بيانات الشركة") return None except sqlite3.Error as e: print(f"خطأ في استرجاع البيانات: {e}") return None finally: conn.close() if __name__ == "__main__": app = QApplication(sys.argv) window = FieldsWidget() window.show() sys.exit(app.exec()) وللتوضيه دي اعمده جدول الفاتوره التي اريده ان تستخرج منها الخاص بالاجمياليات وتكون بداخل مستطيل اسفل الفاتوره invoices ( id INTEGER PRIMARY KEY AUTOINCREMENT, -- رقم تسلسلي فريد (العمود الرئيسي) invoice_number TEXT NOT NULL, -- رقم الفاتورة (لا يمكن أن يكون فارغاً) payment_type TEXT, -- نوع الدفع account_number TEXT, -- رقم الحساب date TEXT, -- تاريخ الفاتورة total REAL, -- المجموع الكلي total_discount REAL, -- إجمالي الخصم discount_percentage REAL, -- نسبة الخصم total_after_discount REAL, -- الإجمالي بعد الخصم vat_value REAL, -- قيمة الضريبة total_after_vat REAL, -- الإجمالي بعد الضريبة
-
كيف اصدر الفاتوره بنفس التنسيق الذي بالواجهه
-
اريد طريقه اطبع الفاتوره في ملف وتكون جميله بنفس التخطيط بالواجهه import sys import traceback import os import sqlite3 from PyQt6.QtWidgets import ( QApplication, QWidget, QVBoxLayout, QTableWidget, QTableWidgetItem, QLabel, QLineEdit, QPushButton, QMessageBox, QSizePolicy, QSplitter, QHBoxLayout, QFrame ) from PyQt6.QtCore import Qt from PyQt6.QtGui import QPixmap, QPainter class FieldsWidget(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') # المسار إلى قاعدة البيانات if not 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') # المسار إلى قاعدة البيانات if not 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 اجابة
-
- 1
-
ممكن استاذي تعطني التعديل مع كامل المثال
-
اريد عندما ادخل اي قيمه في اعمدة اسهم الورثه يتحدث المجموع تلقائيا والذي يجمع اسهم الورثه import sys import traceback from PyQt6.QtWidgets import QApplication, QMainWindow, QTableWidget, QVBoxLayout, QWidget, QTableWidgetItem, QLineEdit, QPushButton, QHBoxLayout from PyQt6.QtCore import Qt from PyQt6.QtGui import QColor class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle('التطبيق') self.setGeometry(100, 30, 1250, 700) # إنشاء حقل الإدخال وزر الإدخال self.input_field = QLineEdit(self) self.input_field.setPlaceholderText('أدخل عدد الورثة') self.input_button = QPushButton('إضافة الورثة', self) self.input_button.clicked.connect(self.add_inheritors) input_layout = QHBoxLayout() input_layout.addWidget(self.input_field) input_layout.addWidget(self.input_button) # إنشاء الجدول self.table = QTableWidget(self) self.table.setColumnCount(5) # عدد الأعمدة الافتراضي self.table.setHorizontalHeaderLabels([ 'اسم الورث', 'اسم موضع التركه', 'سعر الموضع', 'الاتصال', 'ملاحظه' ]) self.table.setLayoutDirection(Qt.LayoutDirection.RightToLeft) table_layout = QVBoxLayout() table_layout.addLayout(input_layout) table_layout.addWidget(self.table) # إنشاء واجهة مركزية وتعيين التخطيط لها centralWidget = QWidget() centralWidget.setLayout(table_layout) self.setCentralWidget(centralWidget) # إضافة صف جديد وتحريك المؤشر إلى الخلية الأولى self.add_new_row() self.table.setCurrentCell(0, 0) self.table.edit(self.table.currentIndex()) # بدء التحرير مباشرة # إعادة تعريف keyPressEvent للتحكم في سلوك الضغط على الأزرار self.table.keyPressEvent = self.table_keyPressEvent def add_new_row(self): current_row_count = self.table.rowCount() self.table.setRowCount(current_row_count + 1) for col in range(self.table.columnCount()): item = QTableWidgetItem() self.align_text_center(item) if col >= 5: # الأعمدة الجديدة الخاصة بالورثة item.setBackground(QColor('yellow')) # لون الخلفية item.setText('0.00') # القيمة الافتراضية self.table.setItem(current_row_count, col, item) def align_text_center(self, item): if item is not None: item.setTextAlignment(Qt.AlignmentFlag.AlignCenter) def table_keyPressEvent(self, event): if event.key() == Qt.Key.Key_Return or event.key() == Qt.Key.Key_Enter: self.add_new_row() self.table.setCurrentCell(self.table.rowCount() - 1, 0) else: QTableWidget.keyPressEvent(self.table, event) def add_inheritors(self): try: num_inheritors = int(self.input_field.text()) current_columns = self.table.columnCount() default_columns = 5 # التحقق من وجود أعمدة الورثة واستبدالها if current_columns > default_columns: self.table.setColumnCount(default_columns) current_columns = default_columns self.table.setColumnCount(current_columns + num_inheritors + 2) # اضافة 2 اعمده for i in range(num_inheritors): column_header = QTableWidgetItem(f'سهم الوراث {i + 1}') self.align_text_center(column_header) self.table.setHorizontalHeaderItem(current_columns + i, column_header) for row in range(self.table.rowCount()): item = QTableWidgetItem('0.00') item.setBackground(QColor('yellow')) # لون الخلفية self.align_text_center(item) self.table.setItem(row, current_columns + i, item) # إضافة أعمدة الجمع والتفقيط ونصيب الورث column_headers = ['المجموع للاسهم', 'التفقيط'] for idx, header in enumerate(column_headers): column_item = QTableWidgetItem(header) self.align_text_center(column_item) self.table.setHorizontalHeaderItem(current_columns + num_inheritors + idx, column_item) for row in range(self.table.rowCount()): item = QTableWidgetItem('0.00') item.setBackground(QColor('yellow')) # لون الخلفية self.align_text_center(item) self.table.setItem(row, current_columns + num_inheritors + idx, item) self.input_field.clear() except ValueError: self.input_field.setText('الرجاء إدخال عدد صحيح') 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 # تعيين الدالة exception_hook كـ excepthook app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec())
- 2 اجابة
-
- 1
-
استاذي استخرج لي = RESTART: C:/Users/وضاح/Desktop/استخراج_النصوص/73.py Gree OE Sos hoabe Gr!) 54) W095) A eas i aoe Coa OLS pase Leedy Lok Le ssit, gs ERE pe Ssh ebeiS alas a) Galas Gaia) fo lag ROWS: Aboas Ash agh dole rs les} DEES YUE sseae tte Klslaw| ph ja Aah CN 6 Due 6G) d6 jue: vel | id cyl) LASS ud eis Aes Seo. sf - pedo 236 sk
- 4 اجابة
-
- 1
-
استاذي الفاضل الله يبارك فيك ساجرب الشفره واوفيك بالنتيجه حفظك الله ورعاك
- 4 اجابة
-
- 1
-
السلام عليك احبتي اريد كود في بيثون لاستخراج النص المكتوب بخط اليد من الصوره ويعرض النتايج في عنصر نص او طباعته
- 4 اجابة
-
- 2
-
استاذي الفاضل معذرتا كون انني لم يسبق لي معرفة بهذا اللغة ولكن توضيح عندي قاعده بيانات بالاكسس وعامل جدول WebCode فيه الشفرة الاتي <style> *{box-sizing:border-box;font-size:18px} .card{margin:10px auto;padding:10px;width:100%;} .card th{height:40px;} table{width:100%;border:1px gray solid;border-collapse:collapse;overflow-y:hidden;} th,td{padding: 4px 8px;border:1px #ccc solid;height:40px} td span{padding:0 8px;background:orange;color:white;font-size:14px;} table { background-color:#E8F8F0; color:black; text-align: center;} th{background:#146356; color:white;} </style> عندي نموذج بالاكسس فية WebBrowser2 لعرض البيانات من جدول بالاكسس مثلا عندي العنوان اسم الصنف رقم الصنف في الاعلي تظهر بس عندما تحريك عجلة الموس او مفاتيح الكيبورد اعلا واسفل يختفي عناوي الجدول بالمستغرض ان شاء الله اكون اوصلت لك الشرح بطريقه افضل تحياتي استاذي استاذ ي الفاضل اعتقد انك فهمتني والمعذره كوني مبتدي معاكم لم اوضح بشكل افضل فشرحت لاستاذنا Mustafa Suleiman ما اريده ياليت توضح لي كيف العمل لذالك اليك المثال العنوانين براس الصفحه اريدها ثابته حفظك الله استاذي عنوان الجدول.rar عنوان الجدول.accdb
-
السلام عليكم احبتي عندما احرك عجله الموس الضغط على أسهم الكيبورد علا وأسفل يختفي عناوين الصفحة كيف العمل كي يظل العنوان ثابت
- 6 اجابة
-
- 1