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

Ahmed Ahmed64

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

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

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

أجوبة بواسطة Ahmed Ahmed64

  1. بتاريخ 36 دقائق مضت قال El Sayed El Tohamy:

    يبدو أنك تستخدم إصدارًا قديمًا من مكتبة pandas، قم بتحديثها، أو يمكنك استخدام أمر الإغلاق بدلاً من الحفظ

    writer.close()

     

    شكرا جزيلا على لطفك ودعمك ,,, أشكرك كل الشكر

                                           عفوا أستاذي سؤال أخر لو تكرمت بحثت ولم أجد إجابة له

    في برنامج Microsoft Office Excel هناك خيار داخل تبويب تخطيط الصفحة خاص بقلب ورقة العمل من اليمين لليسار

    كيف أنفذ هذا باستخدام مكتبة Openpyxl

     

  2. بتاريخ 4 دقائق مضت قال El Sayed El Tohamy:

    أحييك على مجهودك وصبرك، وهذا هو حال تطوير البرمجيات يحتاج صبرًا هائلًا،

    هل الشيفرات تعمل أم تعطي لديك خطأً؟

    نعم لدي خطأ فيما يخص أخر سطر 

    AttributeError: 'OpenpyxlWriter' object has no attribute 'save'. Did you mean: '_save'?

  3. بتاريخ 2 دقائق مضت قال El Sayed El Tohamy:

    احذف السطر الأخير واكتب الشيفرات التي أرسلتها لك بدلاً منه مع استبدال DF بالاسم الموجود لديك وهو df

    import pandas as pd
    from openpyxl import load_workbook
    
    df = pd.read_excel('test.xlsx',sheet_name="sh1",header=None, engine='openpyxl')
    data = {'الإسم الأول': df.iloc[1::, 0] ,'إسم الأب': df.iloc[1::, 1],'أسم العائلة': df.iloc[1::, 2]}
    df = pd.DataFrame.from_dict(data)
    
    # df.to_excel("op1.xlsx",index=False)
    # اكتب الشيفرات هنا ولا تنس استيراد المكتبات

     

    نعم أستاذي هذا ما فعلته لقد أرسلت لك الكود في السابق لتصحيحه لي

    import pandas as pd
    from openpyxl import load_workbook
    from openpyxl.styles import Font, PatternFill, Border, Side, Alignment
    
    df = pd.read_excel('test.xlsx',sheet_name="sh1",header=None, engine='openpyxl')
    data = {'الإسم الأول': df.iloc[1::, 0] ,'إسم الأب': df.iloc[1::, 1],'أسم العائلة': df.iloc[1::, 2]}
    df = pd.DataFrame.from_dict(data)
    writer = pd.ExcelWriter('test2.xlsx', engine='openpyxl')
    df.to_excel(writer, sheet_name='Sheet1', index=False)
    wb = writer.book
    ws = wb['Sheet1']
    data_font = Font(size=10, color='000000')
    
    for row in ws.iter_rows():
      for cell in row:
        cell.font = data_font
    writer.save()

     

  4. بتاريخ 19 دقائق مضت قال El Sayed El Tohamy:

    إليك بعض الشيفرات التي تساعدك في إنجاز مهتمك

    # استيراد المكتبات اللازمة
    import pandas as pd
    from openpyxl import load_workbook
    from openpyxl.styles import Font, PatternFill, Border, Side, Alignment
    
    
    # إنشاء كائن ExcelWriter باستخدام محرك openpyxl
    writer = pd.ExcelWriter('test.xlsx', engine='openpyxl')
    
    # حفظ DataFrame كملف إكسيل باستخدام الكائن ExcelWriter
    DF.to_excel(writer, sheet_name='Sheet1', index=False)
    
    # الحصول على كائن workbook من الكائن ExcelWriter
    wb = writer.book
    
    # الحصول على كائن worksheet من الكائن workbook
    ws = wb['Sheet1']
    
    data_font = Font(size=10, color='000000')
    
    for row in ws.iter_rows():
      for cell in row:
        cell.font = data_font
    
    
    # حفظ الكائن ExcelWriter لتطبيق التغييرات على الملف
    writer.save()

    لاحظ أننا أنشأنا كائن writer ثم قمنا بحفظ بيانات DF في ملف إكسيل جديد، ثم حصلنا على كائن workbook أسميناه wb، ثم أنشأنا كائن ws، ثم بدأنا في تطبيق التصميم المطلوب، وبالآخر الحفظ باستخدام writer

     

    أستاذي لدي هذه الشفرة كيف أقوم بالأمر عليها لكي يتضح لي شرحك أكثر فا أكثر وأسف على الإطالة 

    import pandas as pd
    from openpyxl import load_workbook
    
    df = pd.read_excel('test.xlsx',sheet_name="sh1",header=None, engine='openpyxl')
    data = {'الإسم الأول': df.iloc[1::, 0] ,'إسم الأب': df.iloc[1::, 1],'أسم العائلة': df.iloc[1::, 2]}
    df = pd.DataFrame.from_dict(data)
    
    df.to_excel("op1.xlsx",index=False)

     

    هل الشفرة تكون بهذه الكيفية 

    import pandas as pd
    from openpyxl import load_workbook
    from openpyxl.styles import Font, PatternFill, Border, Side, Alignment
    
    df = pd.read_excel('test.xlsx',sheet_name="sh1",header=None, engine='openpyxl')
    data = {'الإسم الأول': df.iloc[1::, 0] ,'إسم الأب': df.iloc[1::, 1],'أسم العائلة': df.iloc[1::, 2]}
    df = pd.DataFrame.from_dict(data)
    writer = pd.ExcelWriter('test2.xlsx', engine='openpyxl')
    df.to_excel(writer, sheet_name='Sheet1', index=False)
    wb = writer.book
    ws = wb['Sheet1']
    data_font = Font(size=10, color='000000')
    
    for row in ws.iter_rows():
      for cell in row:
        cell.font = data_font
    writer.save()

     

  5. بتاريخ 12 دقائق مضت قال El Sayed El Tohamy:

    من الواضح أنك أنجزت الخطوة الأولى وهي الحصول على DataFrame اسمه DF

    إذن تحتاج لتنفيذ الخطوة الثانية مع تغيير الاسم 'test.xlsx' إلى الاسم المناسب.

    ولاحظ أننا في النهاية سنقوم بالحفظ عن طريق الكائن writer وليس DF

    أسف على الأطالة أستاذي ولاكن إختلط علي الأمر

    توضيح أكثر

    أستاذي لم أفهم الفكرة جيداً

    أحتاج أن أقوم بالتنسيقات على الداتا فريم التي سيتم حفظها كا جدول إكسيل  قبل الوصول لهذا السطر

    self.DF.to_excel("SAVE1.xlsx",index=False)

    والذي يقوم بعملية الحفظ باستخدام

    أريد إدخال openpyxl على الكود للقيام بتنسيق الجدول

    علما أن الكود من البداية كان من خلال مكتبة pandas أي تم قرأه الملف باستخدام pandas تمت العمليات كذلك باستخدام pandas

    هل تقصد الحفظ هكذا

    self.DF  = pd.ExcelWriter('test.xlsx', engine='openpyxl')

    إذا كان هكذا فعند فتح ملف الإكسيل تظهر رسالة بأن الملف تالف

  6. بتاريخ 14 دقائق مضت قال El Sayed El Tohamy:

    وعليكم السلام ورحمة الله وبركاته،

    هذا سؤال جيد، سأعطيك بعض الإرشادات التي تساعدك في مهمتك، وكذلك تنمية مهارات التعلم الذاتي،

    1- قم بقراءة ملف الإكسيل بواسطة مكتبة pandas ووضعه داخل DataFram

    2- قم بإنشاء كائن باستخدام مكتبة openpyxl

    # إنشاء كائن ExcelWriter باستخدام محرك openpyxl
    writer = pd.ExcelWriter('test.xlsx', engine='openpyxl')

    مع تعديل اسم الملف

    3- قم بقراءة workbook, worksheet من الكائن writer

    4- قم بعمل التنسيقات المطلوبة

    5- قم بحفظ الكائن writer

     

    أستاذي لم أفهم الفكرة جيداً

    أحتاج أن أقوم بالتنسيقات على الداتا فريم التي سيتم حفظها كا جدول إكسيل  قبل الوصول لهذا السطر

    self.DF.to_excel("SAVE1.xlsx",index=False)

    والذي يقوم بعملية الحفظ باستخدام

    أريد إدخال openpyxl على الكود للقيام بتنسيق الجدول

    علما أن الكود من البداية كان من خلال مكتبة pandas أي تم قرأه الملف باستخدام pandas تمت العمليات كذلك باستخدام pandas

     

  7. السلام عليكم ورحمة الله وبركاته

    سؤال وأرجو التوضيح عليه ولو بشيء مبسط

    سؤال كالتالي:

    لقد قمت بإنشاء ملف إكسيل من خلال DataFrame ولقد استخدمت مكتبة pandas في هذا

    أحتاج إلى كود يقوم بتنسيق شكل الأعمدة كا حجم العمود ولون الخلايا وهكذا مثلاً

    أعلم أن مكتبة openpyxl مرنة أكثر في التنسيق 

    هل يمكن القيام بذلك من خلال مكتبة pandas إذا كان الجواب لا

    كيف أقوم بربط pandas مع openpyxl أي مثلا كيف أتعامل مع اسم ورقة العمل تم جلبها بمكتبة pandas لأشاركها مع مكتبة openpyxl لأقوم بالتنسيق عليها

    • أعجبني 1
  8. بتاريخ 10 دقائق مضت قال El Sayed El Tohamy:

    ربما يكون بسبب سطر آخر، تأكد من تطبيق نفس الفكرة على كل DataFrame عندك، وتأكد من حفظ الملف.

    المشكلة يبدو كانت هنا في كود البحث وعند إضافة .copy() نهاية السطر تم حل مشكلة التحذير

    self.searjh = self.df1[self.df1['إسم الطالب'] == str(self.label_Title.cget("text"))].copy()

    جزاك الله خيراً أستاذي

    • أعجبني 1
  9. بتاريخ 2 دقائق مضت قال El Sayed El Tohamy:

    نعم، لأن هذه الطريقة تقوم بعمل نسخة مستقلة من DataFrame الأصلي، فأي تعديل عليها لن يؤثر على الأصلي

    جرب إضافة copy بالآخر.

    فعلا لقد قمت بهذا الإجراء ولازال التحذير يظهر

    self.df1 =self.df[['إسم الطالب', 'إسم المادة','الفصل الدراسي' ,'العام الدراسي' , 'نتيجة المادة' ]].copy()

     

  10. بتاريخ 4 دقائق مضت قال El Sayed El Tohamy:

    نعم، رغم أنه ليس خطأً، ولكنه تحذير هام جدًا يوضح احتمالية حدوث نتائج كارثية، ومعناه أنك تقوم بتعديل DataFrame مأخوذ من DataFrame أصلي ولكن التعديل الذي تقوم به لن يؤثر في DataFrame الأصلي لأنه مأخوذ بطريقة النسخ المستقل مثل

    df2 = df1[df1['المادة'] == 'علوم']

    ولتجنب هذه المشكلة نقوم بأخذه بطريقة المرجعي، في هذه الحالة التعديلات سوف تؤثر على DataFrame الأصلي

    df2 = df1[df1['المادة'] == 'علوم'].copy()

    أما إذا كنت تعلم ما تفعله (على سبيل المثال تقوم بالتجربة فقط)، وتريد إخفاء التحذير، اكتب الشيفرة التالية

    pd.options.mode.chained_assignment = None

     

    الطريقة التي قمت بها لأخذ نسخة من الأصلي هكذا

    self.df =self.df[['إسم الطالب', 'إسم المادة','الفصل الدراسي' ,'العام الدراسي' , 'نتيجة المادة' ]]

    هل هذا سبب المشكلة

  11. بتاريخ 15 دقائق مضت قال El Sayed El Tohamy:

    في مثل هذه الحالات التي يكون فيه كتابة شيفرات مكونة من عدة أسطر، يفضل كتابتها داخل وظيفة وتطبيق هذه الوظيفة على dataframe الخاص بنا

    def get_grade(degree):
      if degree >= 85 and degree <= 100:
        return 'امتياز'
      elif degree >= 75 and degree < 85:
        return 'جيد جدًا'
      elif degree >= 65 and degree < 75:
        return 'جيد'
      elif degree >= 50 and degree < 65:
        return 'ضعيف'
      elif degree < 50 and degree >= 0:
        return 'راسب'
      else:
        return 'غير صحيح'
    
    df['التقدير'] = df['نتيجة المادة'].apply(get_grade)

     

    أشكرك أستاذي هذا فعلاً طلبي جزاك الله خيراً 

    الكود نجح أستاذي

    أستاذي لو سمحت

    عند التنفيذ يظهر لي هذا الخطأ كيف اتلاشى هذا الخطأ وهو أعتقد ليس خطأ وإنما جانب فني في الكود

    See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
      self.searjh['التقدير'] = self.searjh['نتيجة المادة'].apply(self.get_grade)

     

    • أعجبني 1
  12. السلام عليكم ورحمة الله وبركاته

    أوضح لكم سؤالي بشيء من التبسيط لكي يكون مفهوم إلى حضراتكم

    السؤال كالتالي :

    لدي عمود من DataFrame يحتوي على نتائج طلاب ,,,, أحتاج أن أقوم بتكوين عمود جديد لديه اسم [ التقدير  ] 

    أحتاج أن أقوم كتابة كود وظيفة تقوم بالمرور على عمود النتائج وطباعة التقدير في عمود التقدير

    =<85 ممتاز

    =<75 جيد جداً

    =<65 جيد

    ضعيف

    حاولت كتابة الكود ولاكن لم أنجح في استكماله

            self.searjh['التقدير'] = self.searjh['نتيجة المادة'].apply(lambda x: np.nan if x > 85 else ممتاز)

    أرجو المساعدة أساتذتي

     

    • أعجبني 1
  13. بتاريخ 15 دقائق مضت قال Hossam Mohamed15:

    اشرح المشكلة بشكل اوضح واعرض لنا الناتج output 

    أخي في الحقيقة كنت أحاول أن أدرج عمود جديد على الداتا فريم حيث نتيجة هذا العمود يقوم بجلبها بالإعتماد على عمود 

    self.searjh['نتيجة المادة']

    حيث حاول أن أصنع هذا الكود 

    self.searjh['التقدير'] = self.searjh['نتيجة المادة'].apply(lambda x: 'NaN' if x > 90 else "ممتاز")

    وأنا أحاول أن أدخل def  على السطر الذي بالأعلى

            def Estimates(self): 
            if self.nT >= 85:
                self.searjh["التقدير"] ="ممتاز"
            elif self.nT >=75:
                self.searjh["التقدير"] ="جيد جداً"
            elif self.nT >=65:
                self.searjh["التقدير"] ="جيد"
            elif self.nT >=50: 
                self.searjh["التقدير"] ="مقبول"
            else:
                self.searjh["التقدير"] ="ضعيف"

    الرجاء المساعدة في ذلك

  14. بتاريخ 16 دقائق مضت قال Chihab Hedidi:

    الرسالة التي تظهر تشير إلى أنك تقوم بتعديل قيمة في DataFrame على نسخة من البيانات، وهو ما يمكن أن يؤدي إلى مشكلات في بعض الحالات، يمكنك محاولة تجنب هذا الخطأ عن طريق استخدام loc لتحديد الصفوف والأعمدة المحددة.

    في السطور الأخيرة من الكود، قم بتغيير هذا السطر:

    self.searjh["التقدير"] = self.nT.apply(lambda x: 'A' if x >= 85 else 'Other')

    إلى:

    self.df.loc[self.df['إسم الطالب'] == str(self.label_Title.cget("text")), "التقدير"] = self.df.loc[self.df['إسم الطالب'] == str(self.label_Title.cget("text")), 'نتيجة المادة'].apply(lambda x: 'A' if x >= 85 else 'Other')

    هذا التعديل يستخدم  loc لتحديد الصفوف التي تلبي شرط "إسم الطالب" ويعدل القيمة في عمود "التقدير" بناءا على الشرط المحدد.

    عند تشغيل الكود لم يظهر خطأ كذلك لم يقم بتكوين العمود الحديد " التقدير "

  15. السلام عليكم

            self.df = pd.read_excel(self.file_name,sheet_name=self.vq,header=None)
            self.DATA_A()
            self.df = pd.DataFrame.from_dict(self.dataT)
            self.df =self.df[['إسم الطالب', 'إسم المادة' ,'العام الدراسي' , 'نتيجة المادة' ]]
            self.df['نتيجة المادة'] = pd.to_numeric(self.df['نتيجة المادة'], errors='coerce')
            self.searjh = self.df[self.df['إسم الطالب'] == str(self.label_Title.cget("text"))] 
            self.nT = self.searjh['نتيجة المادة']
            self.searjh["التقدير"] = self.nT.apply(lambda x: self.Estimates)
            
            
            def Estimates(self): 
            if self.nT >= 85:
                self.searjh["التقدير"] ="ممتاز"
            elif self.nT >=75:
                self.searjh["التقدير"] ="جيد جداً"
            elif self.nT >=65:
                self.searjh["التقدير"] ="جيد"
            elif self.nT >=50: 
                self.searjh["التقدير"] ="مقبول"
            else:
                self.searjh["التقدير"] ="ضعيف"

     

  16. بتاريخ 15 دقائق مضت قال Chihab Hedidi:

    من الواضح أن الخطأ الذي تحدث هنا هو في الجزء الذي يحتوي على الفحص المشروط if self.nT >= 85، المشكلة تكمن في محاولة مقارنة العمود بالقيمة 85، وهذا يؤدي إلى خطأ.

    بدلا من ذلك، يجب عليك استخدام apply لتطبيق الفحص المشروط على كل عنصر في العمود،  فيما يلي كيف يمكنك تحسين الكود:

    self.searjh["التقدير"] = self.nT.apply(lambda x: 'A' if x >= 85 else 'Other')

    يتم استخدام apply هنا لتطبيق الشرط على كل عنصر في العمود، ويتم إنشاء  عمود جديد تحت إسم التقدير يحتوي على التقدير المناسب لكل قيمة. يمكنك ضبط الشرط حسب احتياجاتك.

    هذا ما قمت بتعديله هل هكذا صحيح

            self.df = pd.read_excel(self.file_name,sheet_name=self.vq,header=None)
            self.DATA_A()
            self.df = pd.DataFrame.from_dict(self.dataT)
            self.df =self.df[['إسم الطالب', 'إسم المادة' ,'العام الدراسي' , 'نتيجة المادة' ]]
            self.df['نتيجة المادة'] = pd.to_numeric(self.df['نتيجة المادة'], errors='coerce')
            self.searjh = self.df[self.df['إسم الطالب'] == str(self.label_Title.cget("text"))] 
            self.nT = self.searjh['نتيجة المادة']
            self.searjh["التقدير"] = self.nT.apply(lambda x: 'A' if x >= 85 else 'Other')

    لأن الكود به خطأ 

    A value is trying to be set on a copy of a slice from a DataFrame.
    Try using .loc[row_indexer,col_indexer] = value instead

    See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
      self.searjh["التقدير"] = self.nT.apply(lambda x: 'A' if x >= 85 else 'Other')

  17. السلام عليكم

    أرجو تصحيح الخطأ بهذا الكود 

            self.df = pd.read_excel(self.file_name,sheet_name=self.vq,header=None)
            self.DATA_A()
            self.df = pd.DataFrame.from_dict(self.dataT)
            self.df =self.df[['إسم الطالب', 'إسم المادة' ,'العام الدراسي' , 'نتيجة المادة' ]]
            self.df['نتيجة المادة'] = pd.to_numeric(self.df['نتيجة المادة'], errors='coerce')
            self.searjh = self.df[self.df['إسم الطالب'] == str(self.label_Title.cget("text"))] 
            self.nT=self.searjh['نتيجة المادة']
            if self.nT >= 85:
                self.searjh["التقدير"]="A"

    ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

    • أعجبني 1
  18. بتاريخ 49 دقائق مضت قال El Sayed El Tohamy:

    في البداية أود أن أحييك على المجهود الرائع الذي بذلته، سأرشدك لبعض النقاط تسهل عليك الأمر،

    أليست البيانات تأتي من ملف إكسيل (على ما أتذكر)؟ وتضعها داخل DataFrame؟

    يمكنك البحث داخل DataFrame عن الخصائص التي تريدها، وتأخذ النتائج في DataFrame جديد ثم تطبقه على treeview

    يمكنك الرجوع لهذا المثال

    بالتوفيق

    أشكرك أستاذي جزاك الله خيرا

    هل ما قمت به صحيح أم هناك تصحيح للكود في الحقيقة الشفرة تعمل جيدا

     

    ولاكن أحتاج إلى أمر بسيط

    عند البحث قد تكون هناك قيم مكرر داخل DataFrame كيف أستطيع تجاهل تكرار القيم عند البحث وجلب أول قيمة

        def s_r(self, Key):
            query = self.entry1.get()
           
            for row in self.tree.get_children():
                self.tree.delete(row)
          
            for index, row in self.A1[self.A1[0].str.contains(query)].iterrows():
                self.tree.insert('', 'end', values=(row[0],))

     

  19. السلام عليكم ورحمة الله وبركاته

    المساعد  في التعديل على هذا الكود الذي وضيفته البحث في أداة  Treeview من خلال أداة entry

    التعديل الذي أحتاج القيام به هو بمجرد كتابة أول حرف من الكلمة المراد البحث عنها من خلال  أداة entry يتم البحث عن النتائج المطابقة وحذف باقي السجلات الغير المطابقة 

    الكود الحالي يقوم بتحديد السجل المطابق للبحث فقط والإبقاء على باقي النتائج

    self.entry1.bind('<Key>', self.search)

     

        def search(self, Key):
            query =  self.entry1.get()
            selections = []
            for child in self.tree.get_children():
                if query in self.tree.item(child)['values']:
                    self.tree.delete()
                    print(self.tree.item(child)['values'])
                    selections.append(child)
            self.tree.selection_set(selections)

     

    • أعجبني 1
  20. بتاريخ On 26‏/1‏/2024 at 08:24 قال El Sayed El Tohamy:

    وعليكم السلام ورحمة الله،

    لا توجد وظيفة جاهزة لتنفيذ عملية البحث بمجرد الكتابة مباشرة في أداة الإدخال Entry،

    ولكن يمكن عمل ذلك بطريقة أخرى، سأعطيك بعض الإرشادات التي ستمكنك بإذن الله من تنفيذ ما تريده، إضافة إلى تنمية مهارة البحث والتعلم الذاتي،

    يوجد في أداة الإدخال حدث ينطلق عند الضغط على أي مفتاح من لوحة المفاتيح، وهو الحدث Key، فمن خلاله نستطيع استدعاء وظيفة نقوم بكتابتها ويتم تنفيذها كلما انطلق هذا الحدث (أي كلما ضغط المستخدم زرًا على لوحة المفاتيح)

    ويتم الربط بالشكل التالي

    self.entry1.bind('<Key>', self.search)

    يتم كتابة السطر السابق في الباني __init__

    الخطوة التالية هي إنشاء وظيف تسمى search وكتابة الشيفرات المطلوبة لعملية البحث أو أي خوارزمية أخرى

        def search(self, key):
            print(key, key.char)
            

    كما هو واضح الوظيفة تحتاج معامل key والذي من خلاله نستطيع الحصول على معلومات عن الزر الذي تم ضغطه،

    يمكنك كتابة الشيفرات المطلوبة في هذه الوظيفة.

    أستاذي أحتاج إلى التعديل على هذا الكود الذي وضيفته البحث في أداة  Treeview من خلال أداة entry

        def sr(self, Key):
            query =  self.entry1.get()
            selections = []
            for child in self.tree.get_children():
                if query in self.tree.item(child)['values']:
                    self.tree.delete()
                    print(self.tree.item(child)['values'])
                    selections.append(child)
            self.tree.selection_set(selections)

    التعديل الذي أحتاج القيام به هو بمجرد كتابة أول حرف من الكلمة المراد البحث عنها من خلال  أداة entry يتم البحث عن النتائج المطابقة وحذف باقي السجلات الغير المطابقة 

  21. بتاريخ 16 دقائق مضت قال El Sayed El Tohamy:

    وعليكم السلام ورحمة الله،

    يمكنك استخدام الوظيفة place بدلًا من grid

    import tkinter as tk
    from tkinter import ttk
    class App(ctk.CTk,tk.Tk):
        def __init__(self):
            super().__init__()
            
            ctk.set_appearance_mode("dark")
            ctk.set_default_color_theme("green")
            self.option_add('*Ttk*direction', 'right')
            self.Button1 = ctk.CTkButton(self, text="فتح") 
            #self.Button1.grid(row=0, column=0, pady=(5, 5),padx=(5, 5), sticky="e")
            self.Button1.place(relx=0.9, y=10, anchor=tk.E)
            
    app = App()
    app.mainloop()    

    لاحظ أننا استخدمنا relx = 0.9 وهذا سيجعل المسافة الأفقية تبعد عن حافة النافذة بمقدار 90%، ونلاحظ استخدام anchor=tk.E والتي تعني أن يحافظ على المسافة اليمنى لأن E تعني الشرق أي اليمين.

     

    أستاذي هل تقصد أن الكود هذا لا يستخدم مع grid

    self.option_add('*Ttk*direction', 'right')

     

  22. السلام عليكم

    التحقق ومراجعة الكود الخاص بقلب الواجهة للعربية أي RTL

    حيث لم ينجح الكود في قلب الاتجاه 

    المفترض أن يكون العمود 0 الصف 0   يمين الشاشة بعد هذا الكود

    import customtkinter as ctk
    import tkinter as tk
    from tkinter import ttk
    class App(ctk.CTk,tk.Tk):
        def __init__(self):
            super().__init__()
            ctk.set_appearance_mode("dark")
            ctk.set_default_color_theme("green")
            self.option_add('*Ttk*direction', 'rtl')
            self.Button1 = ctk.CTkButton(self, text="فتح") 
            self.Button1.grid(row=0, column=0, pady=(5, 5),padx=(5, 5), sticky="e")
            
    app = App()
    app.mainloop()        

     

  23. بتاريخ 3 ساعة قال كمال احمد2:

    نعم يمكنك فعل هذه ، تقدم Tkinter خيارًا يسمى direction، يمكن تعيينه إلى "right-to-left" لتمكين التخطيط من اليمين إلى اليسار. يمكنك تعيين هذا الخيار للتطبيق بأكمله أو لعناصر واجهة المستخدم الفردية

    root = tk.Tk()
    root.option_add('*Ttk*direction', 'rtl')  # تعيين الاتجاه لجميع عناصر ttk


    إذا كنت ترغب في تعيينه لعناصر محددة، قم بتبديل *Ttk* بالاسم الأسلوب المناسب (على سبيل المثال، *TButton*direction).

    مثال على استخدام "CustomTkinter"

     

    import CustomTkinter as ctk
    
    root = ctk.CustomTk()
    root.option_add('*Ttk*direction', 'rtl') 

     

    هل عند استخدام الكلاس يوضع الكود بهذه الكيفية

    import customtkinter as ctk
    import tkinter as tk
    from tkinter import ttk
    class App(ctk.CTk,tk.Tk):
        def __init__(self):
            super().__init__()
            ctk.set_appearance_mode("dark")
            ctk.set_default_color_theme("green")
            self.option_add('*Ttk*direction', 'rtl')
            self.Button1 = ctk.CTkButton(self, text="فتح") 
            self.Button1.grid(row=0, column=0, pady=(5, 5),padx=(5, 5), sticky="e")
            
    app = App()
    app.mainloop()        

    عند التنفيذ يظهر Button ناحية اليسار

×
×
  • أضف...