-
المساهمات
222 -
تاريخ الانضمام
-
تاريخ آخر زيارة
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
أجوبة بواسطة Ahmed Ahmed64
-
-
بتاريخ 36 دقائق مضت قال El Sayed El Tohamy:
يبدو أنك تستخدم إصدارًا قديمًا من مكتبة pandas، قم بتحديثها، أو يمكنك استخدام أمر الإغلاق بدلاً من الحفظ
writer.close()
شكرا جزيلا على لطفك ودعمك ,,, أشكرك كل الشكر
عفوا أستاذي سؤال أخر لو تكرمت بحثت ولم أجد إجابة له
في برنامج Microsoft Office Excel هناك خيار داخل تبويب تخطيط الصفحة خاص بقلب ورقة العمل من اليمين لليسار
كيف أنفذ هذا باستخدام مكتبة Openpyxl
-
بتاريخ 4 دقائق مضت قال El Sayed El Tohamy:
أحييك على مجهودك وصبرك، وهذا هو حال تطوير البرمجيات يحتاج صبرًا هائلًا،
هل الشيفرات تعمل أم تعطي لديك خطأً؟
نعم لدي خطأ فيما يخص أخر سطر
AttributeError: 'OpenpyxlWriter' object has no attribute 'save'. Did you mean: '_save'?
-
بتاريخ 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()
-
بتاريخ 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()
-
بتاريخ 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')
إذا كان هكذا فعند فتح ملف الإكسيل تظهر رسالة بأن الملف تالف
-
بتاريخ 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
-
السلام عليكم ورحمة الله وبركاته
سؤال وأرجو التوضيح عليه ولو بشيء مبسط
سؤال كالتالي:
لقد قمت بإنشاء ملف إكسيل من خلال DataFrame ولقد استخدمت مكتبة pandas في هذا
أحتاج إلى كود يقوم بتنسيق شكل الأعمدة كا حجم العمود ولون الخلايا وهكذا مثلاً
أعلم أن مكتبة openpyxl مرنة أكثر في التنسيق
هل يمكن القيام بذلك من خلال مكتبة pandas إذا كان الجواب لا
كيف أقوم بربط pandas مع openpyxl أي مثلا كيف أتعامل مع اسم ورقة العمل تم جلبها بمكتبة pandas لأشاركها مع مكتبة openpyxl لأقوم بالتنسيق عليها
- 1
-
بتاريخ 10 دقائق مضت قال El Sayed El Tohamy:
ربما يكون بسبب سطر آخر، تأكد من تطبيق نفس الفكرة على كل DataFrame عندك، وتأكد من حفظ الملف.
المشكلة يبدو كانت هنا في كود البحث وعند إضافة .copy() نهاية السطر تم حل مشكلة التحذير
self.searjh = self.df1[self.df1['إسم الطالب'] == str(self.label_Title.cget("text"))].copy()
جزاك الله خيراً أستاذي
- 1
-
بتاريخ 2 دقائق مضت قال El Sayed El Tohamy:
نعم، لأن هذه الطريقة تقوم بعمل نسخة مستقلة من DataFrame الأصلي، فأي تعديل عليها لن يؤثر على الأصلي
جرب إضافة copy بالآخر.
فعلا لقد قمت بهذا الإجراء ولازال التحذير يظهر
self.df1 =self.df[['إسم الطالب', 'إسم المادة','الفصل الدراسي' ,'العام الدراسي' , 'نتيجة المادة' ]].copy()
-
بتاريخ 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[['إسم الطالب', 'إسم المادة','الفصل الدراسي' ,'العام الدراسي' , 'نتيجة المادة' ]]
هل هذا سبب المشكلة
-
بتاريخ 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
-
السلام عليكم ورحمة الله وبركاته
أوضح لكم سؤالي بشيء من التبسيط لكي يكون مفهوم إلى حضراتكم
السؤال كالتالي :
لدي عمود من DataFrame يحتوي على نتائج طلاب ,,,, أحتاج أن أقوم بتكوين عمود جديد لديه اسم [ التقدير ]
أحتاج أن أقوم كتابة كود وظيفة تقوم بالمرور على عمود النتائج وطباعة التقدير في عمود التقدير
=<85 ممتاز
=<75 جيد جداً
=<65 جيد
ضعيف
حاولت كتابة الكود ولاكن لم أنجح في استكماله
self.searjh['التقدير'] = self.searjh['نتيجة المادة'].apply(lambda x: np.nan if x > 85 else ممتاز)
أرجو المساعدة أساتذتي
- 1
-
بتاريخ 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["التقدير"] ="ضعيف"
الرجاء المساعدة في ذلك
-
بتاريخ 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 لتحديد الصفوف التي تلبي شرط "إسم الطالب" ويعدل القيمة في عمود "التقدير" بناءا على الشرط المحدد.
عند تشغيل الكود لم يظهر خطأ كذلك لم يقم بتكوين العمود الحديد " التقدير "
-
السلام عليكم
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["التقدير"] ="ضعيف"
-
بتاريخ 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 insteadSee 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') -
السلام عليكم
أرجو تصحيح الخطأ بهذا الكود
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 ساعة قال El Sayed El Tohamy:
يمكننا تجاهل التكرارات عن طريق الوظيفة
drop_duplicates()
وهي تخص DataFrame
ما مشكلة هذا الكود لا يقوم بإزالة التكرار
df1.drop_duplicates(subset='إسم الطالب',keep='first')
-
بتاريخ 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],))
-
السلام عليكم ورحمة الله وبركاته
المساعد في التعديل على هذا الكود الذي وضيفته البحث في أداة 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
-
بتاريخ 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 يتم البحث عن النتائج المطابقة وحذف باقي السجلات الغير المطابقة
-
بتاريخ 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')
-
السلام عليكم
التحقق ومراجعة الكود الخاص بقلب الواجهة للعربية أي 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()
-
بتاريخ 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 ناحية اليسار
الربط بين مكتبتين pandas و openpyxl
في بايثون
نشر
أحسنت أستاذي بارك الله فيك