اذهب إلى المحتوى

Mustafa Suleiman

الأعضاء
  • المساهمات

    9912
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    300

كل منشورات العضو Mustafa Suleiman

  1. إليك بعض المواقع التي توفر قوالب مجانية للواجهة الأمامية لتستخدمها مع Django: Start Bootstrap يقدم مجموعة من القوالب المجانية والسمات للواجهة الأمامية، وتستطيع تحميل القوالب وتخصيصها وفقًا لاحتياجاتك. HTML5UP يقدم HTML5UP مجموعة من القوالب المجانية والأنيقة للواجهة الأمامية، وبإمكانك تنزيل القوالب واستخدامها في تطبيقك مع Django.
  2. من الأفضل تجنب استخدام jQuery حاليًا فهى لم تعد تستخدم بكثرة، تعلمها بالطبع لتستطيع التعديل على الأكواد الموجودة في الموقع الذي تعمل عليه أو فهم كود jQuery عند البحث على الإنترنت مثلا. وإليك بعض الأسباب لتجنب استخدام jQuery: 1- jQuery كبيرة الحجم، مما يؤدي إلى تأخير في تحميلها وتنفيذها على الصفحات الويب. 2- المتصفحات الحديثة توفر العديد من الميزات والوظائف المدمجة في JavaScript النقية، فمع تطور معيار DOM وظهور APIs جديدة مثل querySelector و addEventListener، أصبح بإمكان المطورين الوصول إلى العناصر والتلاعب بها بسهولة باستخدام جافاسكريبت النقية دون الحاجة إلى jQuery. أيضًا بسبب أن تطور ميزات ECMAScript: ECMAScript (المعيار الرسمي لجافاسكريبت) يتطور بشكل مستمر، ويقدم ميزات جديدة وقوية مثل الوعود (Promises) والسمات (Arrow Functions) وغيرها. وبفضل هذه الميزات، أصبح بإمكان المطورين تنفيذ العديد من المهام بشكل أسهل وأنظف دون الحاجة إلى استخدام jQuery. 3- عند استخدام jQuery، يكون من الصعب تخصيص سلوكها وتصميمها بالكامل وفقًا لاحتياجات المشروع، بينما يمكنك القيام بذلك بشكل أفضل باستخدام JavaScript النقية. 4- توجد العديد من المكتبات الحديثة مثل React وVue.js وAngular التي توفر تجربة تطوير أقوى وفعالة، وتدعم أداءً وصيانةً وإدارة حالة التطبيق بشكل أفضل من jQuery. وبإمكانك أيضًا استخدام جافاسكريبت النقية لتنفيذ ما تريده كالتالي: // HTML <button id="moveButton">انقر هنا</button> <div id="myDiv" style="height: 2000px; overflow: auto;"> <p>محتوى العنصر</p> </div> // JavaScript document.getElementById("moveButton").addEventListener("click", function() { const myDiv = document.getElementById("myDiv"); const scrollOptions = { top: 500, behavior: "smooth" }; myDiv.scrollTo(scrollOptions); }); بتعريف زر يحمل معرف "moveButton" وعنصر div يحمل معرف "myDiv" بنفس الطريقة كما في المثال السابق. وعند النقر على الزر، تم إضافة مستمع الأحداث "click" باستخدام addEventListener والذي يقوم بتنفيذ وظيفة معينة عند حدوث الحدث. داخل وظيفة المستمع، نقوم بالحصول على عنصر الـ div باستخدام document.getElementById ونخزنه في متغير myDiv. ثم نعرف كائن scrollOptions يحتوي على الخصائص التي تحدد التمرير الرأسي المطلوب، حيث قمت بتعيين الخاصية top إلى 500، وهذا يعني أن العنصر سيرتفع بمقدار 500 بكسل. أيضًا عليك تعيين الخاصية behavior إلى "smooth"، مما يجعل الحركة تكون سلسة بدلاً من قفزة فجائية. أخيرًا، نستخدم myDiv.scrollTo(scrollOptions) لتنفيذ التمرير الرأسي للعنصر div وفقًا للخصائص التي تم تعريفها في scrollOptions.
  3. هناك كم هائل من الوظائف التي بإمكان تلك الروبوتات القيام بها ومنها: إنشاء وحذف وتحرير القنوات، وتعيين الأذونات اللازمة للأعضاء. تتبع نشاط المستخدمين ومنحهم مستويات وأدوار مخصصة بناءً على تفاعلهم في الخادم. تشغيل الموسيقى في قنوات الصوت من مصادر مثل YouTube أو Spotify، ويمكنها التحكم في مستوى الصوت وتشغيل قوائم التشغيل. إرسال إشعارات وتذكيرات للأعضاء في الخادم، مثل تذكير بالأحداث المهمة أو مواعيد الاجتماعات. تقديم ألعاب تفاعلية للأعضاء، مثل ألعاب الكلمات المتقاطعة أو ألعاب الأدوار البسيطة. البحث عن معلومات عبر الإنترنت وتقديمها للأعضاء، مثل الأخبار أو توقعات الطقس أو معلومات عامة. الترحيب بالأعضاء الجدد في الخادم وتوديع الأعضاء الذين يغادرون. مراقبة النشاط في الخادم والكشف عن المخالفات والسلوك غير الملائم، وتنفيذ تدابير الأمان المطلوبة مثل حظر الأعضاء المخالفين. تنظيم مسابقات وألعاب تفاعلية للأعضاء، مثل ألعاب الألغاز أو ألعاب الأدوار المتقدمة. توفير الدعم الفني والإجابة على الأسئلة الشائعة للأعضاء، وتقديم التوجيه والمساعدة في استخدام الخادم. الاتصال بمنصات أخرى مثل Twitter أو Reddit وتقديم تحديثات مباشرة للأعضاء. توفير أوامر خاصة بتخصيص واجهة الخادم، مثل تغيير الألوان والخلفيات وإضافة الرموز التعبيرية المخصصة. بالنسبة لأشهر البوتات في Discord، فهناك العديد من البوتات المشهورة ومنها: Dyno: بوت متعدد الاستخدامات يوفر ميزات إدارة الخادم ونظام المستويات والموسيقى والأدوار. MEE6: يوفر نظام المستويات والأدوار والموسيقى والترحيب والإشعارات والمسابقات. Tatsumaki: يقدم نظام المستويات والأدوار والألعاب والإحصائيات والترحيب والتوديع. Dank Memer: للترفيه يقدم ألعاب الكلمات والميمات والنكات والصور المضحكة. Rythm: لتشغيل الموسيقى من مصادر مثل YouTube وSpotify وSoundCloud.
  4. بالطبع لا فما تقصده هو استخدام الكلمة المحجوزة const لتعريف الثوابت، وقد تم توضيح ذلك بالتفصيل هنا: وبخصوص الكود الخاص بك، فهو غير صحيح حيث أنك قمت باستخدام خاصية name الموجودة في الكائن window وقمت بتغيير قيمتها. وعليك بقراءة التالي قبل استكمال الشرح لتفهم ما أقصده: وفي الكود لديك"name" قمت أنت بتعريفها ضمن النطاق العالمي global ضمن كائن "window"، بتعيين قيمة السلسلة النصية "bader" للمتغير "name"، ثم طباعة نوع المتغير باستخدام "console.log(typeof name);" وسيتم طباعة "string" في الإخراج لأن قيمة المتغير هي سلسلة نصية. ثم، قمت أنت بتعيين قيمة رقمية 5 للمتغير "name"، وبعد ذلك طباعة نوع المتغير مرة أخرى باستخدام "console.log(typeof name);" وستظهر "string" أيضًا، ولكن لماذا لم تصبح رقم number؟ السبب أنه تم تغيير القيمة النصية فقط من "bader" إلى "5" أي أنه لم يتم تحويل القيمة، وتلك المشاكل الغريبة ستحدث لو لم تقم باستخدام أحد الكلمات الخاصة بتعريف المتغيرات وهم var و let و const. أي يجب أن يكون الكود لديك كالتالي: const userName = 'bader'; console.log(typeof name); userName = 5; console.log(typeof name); وستجد أنه يظهر لك خطأ caught TypeError: Assignment to constant variable. والذي يعني أنك لا تستطيع تغيير قيمة متغير ثابت.
  5. أرجو منك طرح السؤال أسفل فيديو الدورة الخاص بالسؤال وسيتم الإجابة عليه، وطرح الأسئلة العامة هنا في قسم أسئلة البرمجة.
  6. هناك عدة أسباب لذلك: لم تقم بتمكين Apple Pay في إعدادات تطبيقك. لم تضف الأذونات المناسبة لـ Apple Pay إلى ملف Info.plist الخاص بتطبيقك. لم تقم بتنفيذ رمز Apple Pay بشكل صحيح في تطبيقك. عليك أولاً التحقق من تمكين Apple Pay في إعدادات تطبيقك، عن طريق فتح مشروع Xcode الخاص بتطبيقك والانتقال إلى ملف Info.plist، وفي ملف Info.plist، ابحث عن المفتاح ApplePay وتأكد من أنه مضبوط على YES. وإذا تم تمكين Apple Pay في إعدادات تطبيقك، ولكن لا تزال تواجه رسالة الخطأ "invalid ability provided"، فيجب عليك التحقق من أنك قد أضفت الأذونات المناسبة لـ Apple Pay إلى ملف Info.plist، وتستطيع فعل ذلك عن طريق إضافة الأذونات التالية إلى ملف Info.plist: <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> <key>NSApplePayPaymentAuthorization</key> <array> <string>com.apple.developer.in-app-payments</string> </array> وبمجرد أن تقوم بإضافة الأذونات المناسبة لـ Apple Pay إلى ملف Info.plist. وأيضًا تأكد من استخدام أحدث إصدار من React Native، وأحدث إصدار من Apple Pay SDK. وهل قمت بإضافة الـ Merchant ID والشهادات المطلوبة؟ وبالنسبة للشهادات إليك طريقة إنشائها: وأنصحك بالبحث عن How to implement Apple Pay in React Native Apps وستجد شرح واضح لكيفية فعل ذلك عن طريق مكتبة react-native-payments.
  7. أنت لم تذكر ما هي تلك المشاريع؟ هل هي مشاريع كبيرة ومشابهة للمشاريع التي يتم تنفيذها بشكل حقيقي وليس مجرد نماذج؟ عند تنفيذ مشروع هل تواجه مشكلة في التنفيذ؟ أم تستطيع تطبيق ما تريده بشكل مباشر أي تعرف ما هي الأدوات التي عليك استخدامها؟ وهنا لا أقصد البحث عن حل لمشكلة معينة تواجهها أو كيفية تنفيذ أمر ما في المشروع بل أقصد المشروع ككل. هل تعمقت في الواجهة الخلفية؟ وأنشات مشاريع أكثر تعقيدًا؟ هل قمت بدراسة المفاهيم المتقدمة في CSS وجافاسكريبت، هل قمت بإنشاء مشروع معقد مثل SPA بواسطة جافاسكريبت وHTML, CSSS ؟ وأنا هنا لا أقصد التقليل أبدًا من ما قد حققته بالفعل، فمجهود يحترم أحسنت حقًا، لكن ما قصدته هو توجيهك إلى أنك في البداية وبمستوى Junior أعتقد، لذلك لا تنتقل إلى لغة أخرى إلا بعد أن تصبح متمكن من الـ Stack الخاص بك وهو MERN. ولتتعمق أكثر في مجالك ستحتاج إلى اللغة الإنجليزية، لذلك عليك بكتابة الكود لكي لا تنسى من وقت آخر من خلال إنشاء مشروع تحب العمل عليه، ثم العمل على اللغة الإنجليزية لو كنت تراها غير جيدة حيث ستحتاج إلى مستوى سؤهلك للاستماع والقراءة في البداية ثم الكتابة والتحدث لتستطيع العمل في شركة في المستقبل. ابحث عن مشاريع أكثر تعقيدًا واعمل عليها، او عليك بتعلم المفاهيم المتقدمة في الـ Stack الخاص بك، وكما أشرت ستحتاج إلى اللغة الإنجليزية لكون الكتب والمقالات والدورات المتقدمة باللغة الإنجليزية.
  8. ستحتاج إلى استخدم JavaScript لتحريك صورة الغلاف على محور الـ Y، باستخدام حدث onMouseMove لتحديد موقع المؤشر وتحديث خاصية background-position-y في CSS بناءًا على ذلك الموقع، وتستطيع ضبط سرعة التحريك عن طريق ضبط القيمة التي تتم إضافتها إلى background-position-y بناءًا على حركة المؤشر. ولكن نصيحتي إليك هي بأن تقوم بإنشاء الموقع بخواصه الأساسية والمطلوب منك فقط، ثم إذا أردت التحسين وإضافة ميزات أخرى افعل ذلك، وتلك الطريقة ستجنبك إضاعة الوقت في ميزات جانبية بدلاً من العمل على إنهاء المشروع بميزاته الأساسية. وللعلم تلك الطريقة مستخدمة في بناء المشاريع حيث يتم بناء ما يعرف باسم MVP أي المشروع بميزات أساسية ليعمل فقط ويتم تجريبه ثم مع الوقت يتم إضافة الميزات والخواص المطلوبة للتوسع وبناءًا على إحتياجات المشروع، ولا أن يتم بناء كل الميزات وإطلاقها في نفس الوقت وتأخير إطلاق المشروع. وعلي أي حال،سأوضح لك بمثال بالكود: أولًا، قم بإنشاء مكون React يسمى "CoverPhoto"، واحفظه في ملف "CoverPhoto.js": import React, { useState } from 'react'; import './CoverPhoto.css'; const CoverPhoto = () => { const [positionY, setPositionY] = useState(0); const handleMouseMove = (event) => { const { clientY } = event; setPositionY(clientY); }; return ( <div className="cover-photo" onMouseMove={handleMouseMove} style={{ backgroundPositionY: `${positionY}px` }} /> ); }; export default CoverPhoto; ثم، قم بإنشاء ملف CSS واحفظه بنفس المجلد تحت اسم "CoverPhoto.css": .cover-photo { width: 100%; height: 300px; background-image: url('image.jpg'); background-size: cover; background-position: center; transition: background-position-y 0.3s ease-out; } وضع في اعتبارك تعديل "image.jpg" بمسار صحيح لصورة الغلاف. أخيرًا، عليك بتضمين مكون "CoverPhoto" في مكان الذي يُعرض فيه الغلاف في المشروع. الخاص بك. import React from 'react'; import CoverPhoto from './CoverPhoto'; const App = () => { return ( <div> {/* عناصر أخرى في التطبيق */} <CoverPhoto /> {/* عناصر أخرى في التطبيق */} </div> ); }; export default App;
  9. بالطبع ذلك ممكن، ستقومين بنفس الخطوات التي أشرك إليك بها، ثم ستقومين بالتالي: اختاري خيار or من أجل تصفية بكلمة أخرى. من القائمة المنسدلة الثانية التي أسفل الأولى اختاري contain أيضًا من أجل تصفية العمود بكلمة تحتوي على الكلمة التي نريدها. بعد ذلك، اكتبي الكلمة التي تريديها ولتكن عربية مثلاً. أخيرًا اضغطي على ok ليتم التصفية. وستجدين أنه تم تصفية الحقول التي تحتوي على كلمة رياضيات التي وضعناها في الخانة الأولى، ثم عربية التي وضعناها في الخانة الثانية.
  10. المشكلة تنتج عن محاولة unserialize (فك تسلسل) بيانات في مشروع Laravel، حاول تنفيذ الأوامر التالية: php artisan config:clear php artisan view:clear php artisan key:generate وأيضًا قم بحذف الكوكيز الخاصة بالموقع في المتصفح كالتالي: في حال استمرار المشكلة اتبع التالي: استخدم أحدث إصدار من Laravel وتأكد أنه متوافق مع إصدار PHP الذي تستخدمه. قم بفحص الكود الخاص بك للتأكد من عدم وجود أخطاء في استخدام دالة unserialize(). تحقق من صحة البيانات التي تتم unserialize عليها، فربما تكون هناك تعديلات أو تغييرات في بيانات مخزنة تسبب في هذا الخطأ، فربما تحتاج إلى إصلاح أو تحديث البيانات المخزنة. تحديث ملف composer.json وتشغيل أمر composer update للتأكد من تحديث جميع الاعتماديات والمكتبات اللازمة لمشروع Laravel. حذف ملف bootstrap/cache/config.php وملفات الكاش المؤقتة الأخرى في حال كنت تستخدم الكاش لتأكيد أن التغييرات في الكود تطبق بشكل صحيح.
  11. سبب المشكلة هو عند تثبيت حزمة http في تطبيق Flutter، تظهر رسالة الخطأ في ملف pubspec.yaml وتشير إلى أن هناك تعارض في إصدارات الحزم. حيث أن الحزمة http تعتمد على حزمة http_parser بإصدارات محددة، وفي حالتك أنت فإصدار الحزمة http_parser المتوفر في البيئة لا يتوافق مع الإصدار المطلوب بواسطة حزمة http. والرسالة تخبرك أن الإصدارات المسموح بها لـ http_parser هي أكبر من 8.0.1 وأقل من 4.0.0، ولكن الإصدار المثبت حاليًا في البيئة ليس من ضمن هذه النطاقات. بما أن التطبيق الخاص بك يعتمد على إصدار 0.12.2 من حزمة http، والتي بدورها تعتمد على إصدارات http_parser غير متوافقة، فإن عملية حل الإصدارات تفشل وتظهر رسالة الخطأ المذكورة. عليك بالتالي: تحديث إصدار حزمة http في ملف pubspec.yaml إلى إصدار يتوافق مع الإصدارات المتاحة لـ http_parser. يمكنك الاطلاع على وثائق الحزمة لمعرفة الإصدارات المدعومة. التحقق من توافق إصدارات الحزم في مشروعك والتأكد من أن الحزم المختلفة التي تستخدمها تعتمد على إصدارات متوافقة مع بعضها البعض. إعادة تثبيت أو تحديث حزمة http_parser لتتوافق مع الإصدارات المطلوبة. من المهم أيضًا استخدام أحدث إصدار من Flutter ومكتبة الـ Dart، فقد تكون هناك تحديثات أو إصلاحات لمشكلة مشابهة.
  12. ربما المشكلة لديك أنك لم تقم بربط ملف جافاسكريبت في HTML بشكل صحيح تأكد من ذلك ومن كتابة اسم الملف والمسار بشكل صحيح. وأيضًا ربما هناك خطأ في اسم الكلاس أو الـ id وإليك مثال يعمل بشكل سليم، وقد كتبت لك السكريبت داخل كود HTML تجنبًا للمشاكل قم بتجربته. <!DOCTYPE html> <html> <head> <title>مثال عن استخدام innerHTML</title> </head> <body> <h1 id="example-heading">مرحبًا بك!</h1> <div id="example-content"> <p>هذا هو المحتوى الأصلي.</p> </div> <script type="text/javascript"> // استهدف عنصر العنوان const heading = document.getElementById('example-heading'); // تحديث المحتوى باستخدام innerHTML heading.innerHTML = 'مرحبًا بكم في مثال innerHTML!'; // استهدف عنصر المحتوى const content = document.getElementById('example-content'); // تحديث المحتوى الداخلي للعنصر بواسطة innerHTML content.innerHTML = `<p>هذا هو المحتوى المحدث باستخدام <strong>innerHTML</strong> و <strong>ES6</strong>!</p>`; </script> </body> </html> وهناك نقاش آخر لنفس المشكلة أنصحك بالإطلاع عليه:
  13. قد يكون السبب هو عدم إعادة تعيين قيمة ScrollY عند تحميل الصفحة الجديدة، بمعنى عندما تقوم بالتنقل بين الصفحات في تطبيق React باستخدام React Router، يتم عرض المحتوى الجديد في نفس المكان الذي كانت فيه الصفحة السابقة، ومن المحتمل أن ScrollY يتم الاحتفاظ به من الصفحة السابقة، مما يجعل الصفحة الجديدة تبدأ في وضعية غير متوقعة. لذلك قم بإعادة تعيين قيمة ScrollY إلى الصفر عند تحميل الصفحة الجديدة باستخدام useEffect() مع مصفوفة الاعتماد الفارغة [] لضمان أن يتم تشغيلها فقط عند تحميل الصفحة للمرة الأولى. import { useEffect } from 'react'; function YourComponent() { useEffect(() => { window.scrollTo(0, 0); }, []); // ... }
  14. إذا فهمت سؤالك بشكل صحيح، فأنت ترغب في تجميع المقالات التي تحمل نفس التاريخ تحتاج إلى استخدام حلقة foreach في Laravel صحيح؟ وإذا كان كذلك فتستطيع استخدام دالة groupBy المتاحة في Laravel لتجميع المقالات حسب التاريخ كالتالي: // استعلام لاسترداد جميع المقالات الموجودة في قاعدة البيانات $articles = Article::all(); // تجميع المقالات حسب التاريخ $groupedArticles = $articles->groupBy('date'); // عرض المقالات حسب التاريخ @foreach($groupedArticles as $date => $articles) <h2>{{ $date }}</h2> @foreach($articles as $article) <h3>{{ $article->title }}</h3> <p>{{ $article->content }}</p> @endforeach @endforeach حيث تسترد جميع المقالات من قاعدة البيانات، ثم تجميعها حسب التاريخ باستخدام الدالة groupBy('date')، ثم استخدام حلقتي foreach متداخلتين لعرض المقالات حسب التاريخ. وعليك بالتأكد من ضبط النموذج وقاعدة البيانات بشكل صحيح وفقًا لما تريده.
  15. أهلاً بك عبد اللطيف، أرجو منك طرح السؤال المتعلق بالدورة أسفل الفيديو الخاص بالسؤال وسيتم الإجابة عليك، وطرح الأسئلة العامة هنا. وبخصوص سؤالك، المشروع القادم هو مشروع تطوير مجتمع يشبه حسوب I/O وستجد في فيديو المقدمة في المدخل ملفات المشروع أسفل الفيديو أرجو منك تحميلها واستخدامها كما فعلت سابقًا، حيث أن الحزم مختلفة، وإليك رابط الفيديو للمشروع القادم:
  16. بالطبع يظهر لك الخطأ عليك باستخدام ملف إكسيل الذي أرفقته لك في مجلد المشروع وليس ملفك أنت، وقم بالتجربة.
  17. سأختصر الطريق عليك والإجابة هي لا قولاً واحدًا ليس في الوقت الحالي، من الممكن أتمتة 70% من عملية تطوير الواجهة الأمامية بحلول 2027 بناءًا على دراسة نشرت مؤخرًا، ولكن ذلك لا يعني أن ذلك أكيد بنسبة 100% فكان من المتوقع أن توجد عربات طائرة في بداية الألفينات وهو ما لم يحدث. عليك بتعلم البرمجة والتركيز بشدة على الأساسيات لا تعلم التقنيات فقط مثل React بدون تعلم اللغات الأساسية وهي HTML, CSS, JS ثم التعمق في مجالك بحيث تصبح قادر على حل المشاكل في المشاريع الكبيرة بعد اكتساب الخبرة. لا تشغل بالك بذلك حاليًا، وتعلم ما تريده والتجربة خير دليل، جرب إنشاء موقع بواسطة أي ذكاء اصطناعي وسيفشل بشكل مضحك. ما يتم حاليًا هو أتمتة المهام المكررة والمساعدة في كتابة أجزاء من الكود، تستطيع البحث عن Copilot وستفهم ما أقصده، وإليك نظرة، الأمر أشبه بمساعد شخصي للبرمجة: https://github.com/features/copilot
  18. أرجو منك الإنتباه، حيث أنك وضعت قيمة إفتراضية في ملف MINE.py بقيمة 1 للمتغير column_values وعند تشغيل البرنامج ستجد في القائمة رقم واحد بشكل إفتراضي وتلك القيمة غير موجودة في ملف إكسيل الذي ارفقته لك بالطبع. ويجب تغيير قيمة المتغير column_values كالتالي: column_values = "test" ثم شغل البرنامج وعند الضغط على print سيتم طباقة القيم الموجودة في العمود الأول.
  19. المطلوب هو إعادة ترتيب البيانات في عمود "Occupation" في جدول "OCCUPATIONS" بحيث يتم فرز كل اسم تحت المهنة المناسبة له ووضعه بشكل أبجدي، وعرضها في أعمدة جديدة تحمل عناوين "Doctor"، "Professor"، "Singer"، و "Actor"، على التوالي. وعندما لا يكون هناك أسماء إضافية تتوافق مع المهنة، يتم عرض القيمة NULL. وفي حالة عدم وجود أسماء إضافية في بعض الأعمدة، سيتم ملء الخانات الفارغة بقيمة NULL.
  20. حددي العمود الذي ترغبين في تصفيته، وكما ذكرتي فهو عمود "اسم الدورة". انتقلي إلى علامة تبويب "بيانات" (Data) في شريط الأدوات العلوي. في مجموعة الأدوات الخاصة بـ "فرز وتصفية" (Sort & Filter)، انقري على الزر "تصفية" (Filter)، وستظهر صناديق تصفية بجانب عناوين الأعمدة. اضغطي على السهم المنسدل بجانب عنوان العمود الذي ترغبين في تصفيته، وستظهر قائمة منسدلة كالتالي اختاري منها: Text filters أو تصفية بالنصوص، وستظهر قائمة جانبية اختاري منها contains أو تحتوي على. والآن قومي بكتابة رياضيات مثلاً وسيتم تصفية كل الخانات في العمود التي تحتوي على رياضيات كالتالي:
  21. قمت بتعديل المشروع لك ورفعه بعد التعديل، عليك فقط تعديل المسار لملف people.xlsx الذي أنشأته وبه بيانات تجريبية فقط، وستقوم بتعديل المسار في ملف MINE.py وتغيير اسم المستخدم إلى اسم المستخدم الخاص بحاسوبك، حيث افترضت أن مجلد المشروع موجود لديك على سطح المكتب. file_path = r"C:\Users\اسم المستخدم هنا\Desktop\CLASS_1\people.xlsx" # المسار الذي تريده CLASS_1.rar
  22. هناك مشكلة في السطر التالي: self.column_values_list = [cell.value for cell in self.sheet['A']] ففي الدالة column_values() في صنف book_E، الخطأ الذي يحدث هو AttributeError: 'book_E' object has no attribute 'column_values_list'. وذلك لأنك تحاول تعيين قائمة column_values_list كخاصية للكائن self، ولكن لم تقم بتعريفها كمتغير عضو في الكلاس book_E. عليك بتعريف المتغير column_values_list كمتغير عضو في الدالة __init__ كالتالي: def __init__(self, BATH=None): self.BATH = BATH self.workbook = None self.sheet = None self.column_values_list = [] # تعريف المتغير كمتغير عضو في الكلاس بعد ذلك، تستطيع استخدام المتغير self.column_values_list في الدالة column_values() بدون أن تحدث الأخطاء. تأكد أيضًا من استيراد load_workbook من الوحدة الصحيحة openpyxl.
  23. إذا كان السؤال تابع لأحد الأسئلة الخاصة بك أرجو وضعه أسفل السؤال وسيتم الرد عليك لا تقلق، وبخصوص سؤالك، في السطر التالي: from LOOD_BOOK import book_E هل أخطأت في اسم الملف؟ حيث أنك قمت بتهجئتها على أنها "LOOD_BOOK" بدلاً من "LOAD_BOOK"، تأكد من أن اسم الملف صحيح. وفي السطر: from ttkbootstrap.constants import * يتم استيراد جميع الثوابت من وحدة ttkbootstrap.constants. ولكن الوحدة ttkbootstrap لا توفر هذه الثوابت، والأفضل الاستيراد كالتالي: from tkinter import ttk وفي السطر التالي: b1 = ttk.Button(widgets_frame, text="print", bootstyle=("info", "outline"), command=COLS_V) الخاصية bootstyle ليست خاصية صحيحة.، هل أنت ترغب في تعيين نمط الزر؟ باستطاعتك استخدام الخاصية style بدلاً من ذلك كالتالي: b1 = ttk.Button(widgets_frame, text="print", style="info.Outline.TButton", command=COLS_V) وفي السطر التالي: combo_name = ttk.Combobox(widgets_frame,justify=RIGHT,width=35,values=column_values) لم يتم تعريف المتغير column_values في هذا المكان، وعليك تعريفه كمتغير عالمي أو تمرير قيمة صحيحة للوظيفة ttk.Combobox أي التعديل لما يلي: combo_name = ttk.Combobox(widgets_frame, justify="right", width=35)
  24. في الكلاس book_E، عليك بتعديل الدالة __init__ لتستقبل المسار كمعامل افتراضي بدلاً من استخدام القيمة المباشرة: class book_E: def __init__(self, BATH=None): self.BATH = BATH self.workbook = None self.sheet = None def load_file(self): if self.BATH: self.workbook = load_workbook(self.BATH) self.sheet = self.workbook.active # ... الدوال الأخرى هنا ... وأيضًا تعديل دالة COLS_V لتحميل الملف عند النقر على زر "Button": def COLS_V(): file_path = "E:\people.xlsx" # المسار الذي تريده BOOK1 = book_E(file_path) BOOK1.load_file() combo_name.configure(values=BOOK1.column_values()) وعليك بتحديث الأمر المرتبط بزر "Button" في الكود الرئيسي ليستدعي الدالة COLS_V بدلاً من COLS_V(BOOK1): b1 = ttk.Button(widgets_frame, text="print", bootstyle=("info", "outline"), command=COLS_V) وبذلك عند النقر على زر "Button" سيتم تحميل الملف وتعيين القيم في combobox. أما بالنسبة لتعديل المتغير column_values، بإمكانك تغيير قيمته بناءً على ما تحتاجه في البرنامج، باستخدام دالة BOOK1.column_values() للحصول على قائمة القيم من الملف، ومن ثم تعيينها للمتغير column_values. كمثال: column_values = BOOK1.column_values() وتستطيع استخدام هذه القائمة لإعداد الخيارات المتاحة في combobox كما فعلت في الكود الحالي لديك.
×
×
  • أضف...