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

El Sayed El Tohamy

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

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

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

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

    1

كل منشورات العضو El Sayed El Tohamy

  1. لاحظ أن دعم الاتجاه من اليمين لليسار ليس متطورًا بالقدر الكافي في مكتبة tkinter، حتى في التوثيق الرسمي لها لم يذكروا شيئًا مفيدًا بخصوص هذا الموضوع، لذلك نستخدم الخصائص المتوافرة للحصول على أقرب النتائج لما نريده، على سبيل المثال السطر التالي لمحاولة جعل الأداة تنحاز لجهة اليمين حتى مع تحجيم النافذة. أما السطر التالي، فإنه يقوم بجعل اتجاه النصوص والأيقونات على الأدوات متجهة من اليمين (بالتأكيد ليس مدعومًا لكل الأدوات)، لذلك أيضًا نستعمل الخصائص المتوافرة لدينا لحل هذه المشكلة على سبيل المثال أداة الإدخال في tk نستخدم خاصية justify لجعل الاتجاه يمين self.entry1 = tk.Entry(self) self.entry1.config(justify=tk.RIGHT) وهكذا نحاول التغلب على القصور الموجود بالمكتبة.
  2. وعليكم السلام ورحمة الله، يمكنك استخدام الوظيفة 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 تعني الشرق أي اليمين.
  3. لأننا في كل حلقة نقوم بقسمة x على y ثم نحفظ باقي القسمة في y ونجعل x تساوي y لنبدأ حلقة جديدة وهكذا، وبناء عليه، يجب أن تستمر الحلقة التكرارية إلى أن تكون قيمة y تساوي صفرًا، لذلك الحلقة تعتمد على قيمة y وليس قيمة x مثال: نبدأ بالقيم x=15, y-10 x = 15, y = 10 # الحلقة الأولى x = 10, y = 5 # الحلقة الثانية وهي آخر حلقة لاحظ أنه في الحلقة الثانية سيدخلها وقيمة x=10 أما قيمة y=5 لذلك في نهاية الحلقة ستكون قيمة Y=0 بينما قيمة x=5 وبالتالي لن يدخل حلقة ثالثة، ويخرج ثم يطبع قيمة x=5 وهو القاسم المشترك الأكبر بين 15 و 10
  4. وعليكم السلام ورحمة الله، لا توجد وظيفة جاهزة لتنفيذ عملية البحث بمجرد الكتابة مباشرة في أداة الإدخال Entry، ولكن يمكن عمل ذلك بطريقة أخرى، سأعطيك بعض الإرشادات التي ستمكنك بإذن الله من تنفيذ ما تريده، إضافة إلى تنمية مهارة البحث والتعلم الذاتي، يوجد في أداة الإدخال حدث ينطلق عند الضغط على أي مفتاح من لوحة المفاتيح، وهو الحدث Key، فمن خلاله نستطيع استدعاء وظيفة نقوم بكتابتها ويتم تنفيذها كلما انطلق هذا الحدث (أي كلما ضغط المستخدم زرًا على لوحة المفاتيح) ويتم الربط بالشكل التالي self.entry1.bind('<Key>', self.search) يتم كتابة السطر السابق في الباني __init__ الخطوة التالية هي إنشاء وظيف تسمى search وكتابة الشيفرات المطلوبة لعملية البحث أو أي خوارزمية أخرى def search(self, key): print(key, key.char) كما هو واضح الوظيفة تحتاج معامل key والذي من خلاله نستطيع الحصول على معلومات عن الزر الذي تم ضغطه، يمكنك كتابة الشيفرات المطلوبة في هذه الوظيفة.
  5. نعم يتم استخدام الأقواس المعكوفة {} لإحاطة النصوص غير اللغة الإنجليزية، لتجنب هذه المشكلة سنقوم بعمل خوارزمية إضافية، بحيث تتم بالخطوات التالية: 1- النسخ من الشجرة 2- إزالة الأقواس من النص المنسوخ 3- إنشاء أداة إدخال مؤقتة ونقوم بإضافة النص إليها ثم نقوم بالنسخ من هذه الأداة، السبب، أن النسخ من أداة الإدخال لا يسبب نفس المشكلة قم بتعديل الوظيفتين التاليتين فقط # النسخ def it_copy(self): item = self.tree.selection()[0] # قراءة النص من العنصر text = self.tree.item(item, option='text') # استبدال الأقواس المعكوفة بنص فارغ text = text.replace("{", "").replace("}", "") # إنشاء أداة إدخال مؤقتة لاستخدامها في عملية النسخ والقص لتفادى المشاكل tempEntry = tk.Entry(self) tempEntry.insert(0, text) tempEntry.select_range(0, "end") tempEntry.event_generate("<<Copy>>") #pyperclip.copy(self.tree.item(item, option='text')) # اللصق def it_paste(self): self.text = self.clipboard_get() #self.text = pyperclip.paste() self.tree.insert("", "end", text=self.text, values=[self.text])
  6. import customtkinter as ctk import tkinter as tk import pandas as pd import os import pyperclip from tkinter import ttk , filedialog from customtkinter import CTkInputDialog from CTkMessagebox import CTkMessagebox class App(ctk.CTk,tk.Tk): def __init__(self): super().__init__() ctk.set_appearance_mode("light") # Modes: system (default), light, dark ctk.set_default_color_theme("green") # Themes: blue (default), dark-blue, green self.title("CTk example") self.columnconfigure(0, weight = 1) self.rowconfigure(0, weight = 1) # CSS //////////////////////////////////////// self.Font_NAME = str("Noto Kufi Arabic Medium") self.Button_font_size = int(12) self.Label_font_size = int(12) self.Entry_font_size = int(12) self.Text_Color = "#000000" self.Border_Frame_color = "#ff6c0b" self.FG_Frame_color = "#FFFFFF" self.Hover_Color="#FFD045" # images ********************************************************************************************** self.search_var = tk.StringVar() #---------------------------------------------------------------------------------------------- # Frame_Basis ********************************************************************************************** self.Frame_Basis = ctk.CTkFrame(self, fg_color="#F4F4F4") self.Frame_Basis.grid(row=0, column=0, pady=(5, 5),padx=(5, 5), sticky="ewsn") self.Frame_Basis.columnconfigure(0, weight = 1) self.Frame_Basis.rowconfigure(0, weight = 0) self.Frame_Basis.rowconfigure(1, weight = 0) self.Frame_Basis.rowconfigure(2, weight = 1) #---------------------------------------------------------------------------------------------- # Insert frames within a self.Frame_Basis ***************************************************************************** self.Frame_A = ctk.CTkFrame(self.Frame_Basis , border_width = 1,border_color= self.Border_Frame_color,fg_color = self.FG_Frame_color) self.Frame_A.grid(row=0, column=0, pady=(5, 5),padx=(5, 5), sticky="ewsn") self.Frame_A.columnconfigure(0, weight = 0) self.Frame_A.columnconfigure(1, weight = 1) #self.Frame_A.rowconfigure(0, weight = 1) # Insert tools within a Frame_A ************ self.label_Title = ctk.CTkLabel(self.Frame_A, text="test",text_color=self.Text_Color, fg_color="transparent", font=ctk.CTkFont(family=self.Font_NAME, size=18),justify="right") self.label_Title.grid(row = 0, column = 1, padx=(5, 5), pady=(5, 5), sticky="ew") self.label_Logo = ctk.CTkLabel(self.Frame_A, text="test" ,fg_color="transparent", font=ctk.CTkFont(family=self.Font_NAME, size=self.Label_font_size),anchor="e") self.label_Logo.grid(row = 0, column = 0, padx=(5, 5), pady=(5, 5), sticky="ew") # Insert tools within a Frame_B ************ self.Frame_B = ctk.CTkFrame(self.Frame_Basis , border_width = 1,border_color= self.Border_Frame_color,fg_color = self.FG_Frame_color) self.Frame_B.grid(row=1, column=0, pady=(5, 5),padx=(5, 5), sticky="ewsn") self.Frame_B.columnconfigure(0, weight = 1) self.Frame_B.columnconfigure(1, weight = 0) self.Frame_B.columnconfigure(2, weight = 0) self.Frame_B.rowconfigure(0, weight = 0) self.Button2 = ctk.CTkButton(self.Frame_B, text="تحميل Treeview",text_color=self.Text_Color ,compound="left",fg_color= "transparent",border_width = 1,border_color= self.Border_Frame_color,font=(self.Font_NAME,self.Button_font_size),hover_color=self.Hover_Color,command=self.lod_Treeview) self.Button2.grid(row=0, column=0, pady=(5, 5),padx=(5, 2), sticky="e") self.optionmenu1 = ctk.CTkOptionMenu(self.Frame_B,values=["إختر ورقة العمل"],text_color=self.Text_Color, fg_color="#ffae54",button_color="#ff6c0b", font=ctk.CTkFont(family="Calibri", size=12, weight="bold"),corner_radius=20) self.optionmenu1.grid(row=0, column=1, padx=(10, 10), pady=(10, 10), sticky="e") self.optionmenu1.configure(command=self.optionmenu_callback) self.Button1 = ctk.CTkButton(self.Frame_B, text="فتح ملف",text_color=self.Text_Color ,compound="left",fg_color= "transparent",border_width = 1,border_color= self.Border_Frame_color,font=(self.Font_NAME,self.Button_font_size),hover_color=self.Hover_Color,command=self.File_dialog) self.Button1.grid(row=0, column=2, pady=(5, 5),padx=(5, 10), sticky="e") self.label_search_Nm = ctk.CTkLabel(self.Frame_B, text="البحث",text_color=self.Text_Color, fg_color="transparent", font=ctk.CTkFont(family=self.Font_NAME, size=self.Label_font_size),anchor="w") self.label_search_Nm.grid(row = 1, column = 2, padx=(5, 5), pady=(5, 5), sticky="ew") self.entry1 = tk.Entry(self.Frame_B, font=ctk.CTkFont(family=self.Font_NAME, size=self.Entry_font_size),justify="right") self.entry1.grid(row=1, column=1, padx=(2, 10), pady=(5, 5), sticky="e") self.popup_menuA = tk.Menu(self, tearoff=0) self.popup_menuA.add_command(label="Cut", command=lambda: self.entry1.event_generate("<<Cut>>")) self.popup_menuA.add_command(label="Copy", command=lambda : self.entry1.event_generate("<<Copy>>")) self.popup_menuA.add_command(label="Paste", command=lambda: self.entry1.event_generate("<<Paste>>")) self.entry1.bind("<Button-3>", self.show_popup_menu) # Insert tools within a Frame_C ************ self.Frame_C = ctk.CTkFrame(self.Frame_Basis , border_width = 1,border_color= self.Border_Frame_color,fg_color = self.FG_Frame_color) self.Frame_C.grid(row=2, column=0, pady=(5, 5),padx=(5, 5), sticky="ewsn") self.Frame_C.columnconfigure(0, weight = 1) #Treeview self.tree = ttk.Treeview(self.Frame_C) self.tree.grid(row=0, column=0, padx=(5, 5), pady=(5, 5),sticky='nsew') self.tree.bind('<Button-3>', self.popup_menu) # القائمة self.popup1 = tk.Menu(self.tree, tearoff=0) self.popup1.add_command( command=self.it_copy, label="Copy") self.popup1.add_command( command=self.it_paste, label="paste") # النسخ def it_copy(self): item = self.tree.selection()[0] self.clipboard_clear() # self.clipboard_append(self.tree.item(item, option='text')) pyperclip.copy(self.tree.item(item, option='text')) # اللصق def it_paste(self): # self.text = self.clipboard_get() self.text = pyperclip.paste() # self.tree.insert("", "end", text=self.text) self.tree.insert("", "end", text=self.text, values=self.text) def File_dialog(self): self.file_name = filedialog.askopenfilename(initialdir="C:\\Users\\Cakow\\PycharmProjects\\Main", title="Open file okay?", filetypes=(("text files", "*.xlsx"),("all files", "*.*"))) self.df = pd.ExcelFile(self.file_name) self.optionmenu1.configure(values = self.df.sheet_names) if self.file_name: self.file_name = os.path.basename(self.file_name) def optionmenu_callback(self,value): self.vq = value return self.vq def lod_Treeview(self): if hasattr(self, 'file_name') and self.file_name: self.df = pd.read_excel(self.file_name,sheet_name=self.vq,header=None) self.A = self.df.iloc[1::1, [0]] self.A1 = pd.DataFrame(self.A ) self.tree["column"]=list(self.A1.columns) self.tree["show"] = "headings" for column in self.tree["column"]: self.tree.heading(column , text=column) df_rows = self.A1.to_numpy().tolist() for row in df_rows: self.tree.insert("" , "end" , text = row ,values = row) else: CTkMessagebox(title="خطأ",message="أرجو فتح ملف أولا",icon="cancel",option_1="OK", font=ctk.CTkFont(family="Noto Kufi Arabic Medium", size=14),justify="center") # إظهر القائمة def show_popup_menu(self,event): self.popup_menuA.post(event.x_root, event.y_root) def popup_menu(self,event): self.tree.identify_row(event.y) self.popup1.post(event.x_root, event.y_root) app = App() app.mainloop() الشيفرة كاملة، تم تجربتها وتقوم بعملية النسخ واللصق على الشجرة بشكل صحيح، والعنصر يظهر للمستخدم.
  7. المشكلة هنا هي مشكلة ترميز encode اللغة العربية، لذلك نستخدم مكتبة pyperclip في عملية النسخ واللصق كذلك إضافة معامل values عند إدراج insert العنصر للشجرة # النسخ def it_copy(self): item = self.tree.selection()[0] self.clipboard_clear() # self.clipboard_append(self.tree.item(item, option='text')) pyperclip.copy(self.tree.item(item, option='text')) # اللصق def it_paste(self): # self.text = self.clipboard_get() self.text = pyperclip.paste() # self.tree.insert("", "end", text=self.text) self.tree.insert("", "end", text=self.text, values=self.text)
  8. هل يمكنك مشاركة الشيفرات كاملة من فضلك، بحيث أعمل عليها كما هي عندك بالضبط. كذلك إذا توجد أي ملفات مساعدة مثل الإكسيل يرجى إرسال الملف بحتوي على عينة من البيانات للتجربة عليه.
  9. وعليكم السلام ورحمة الله وبركاته الخطأ بسبب تنسيق التاريخ، لأن التنسيق الافتراضي هو yyyy-mm-dd، فإذا كان اليوم أو الشهر أقل من 10 أي يتكون من رقم واحد يجب إضافة صفرًا قبله، فالحل # ضبط الصيغة بوضع صفرًا في خانة الشهر x = np.datetime64('2024-01-25') أو يمكن تحديد تنسيق معين آخر، في الرابط التالي شرح بتفاصيل التنسيقات https://numpy.org/doc/stable/reference/arrays.datetime.html
  10. المطلوب إنشاء من 2 إلى 6 صفحات: ويجب أن يحتوي المشروع على النقاط التالية أ- صفحة تحتوي نمود form بها عدد من خانات الإدخال entry ويتم حفظها (أي إضافة سجل) في جدولٍ ما بقواعد البيانات خاصتك: - قد يكون إضافة منتج في جدول PRODUCT - أو إضافة رحلة في جدول FLIGHT - أو زائر في جدول VISISTOR (أعتقد أنه يقصد VISITOR) - وهكذا ب- صفحة تمكننا من اختيار خيار معين ليتم الانتقال لصفحة معينة بناء على هذا الاختيار: - قائمة منسدلة drop-down list تحتوي على روابط على هيئة أسماء أو صور - قائمة menu تحتوي على روابط على هيئة أسماء أو صور - جدول grid يحتوي على روابط على هيئة أسماء أو صور - وهكذا إضافة إلى ذلك مطلوب منك توقع الصفحات الأخرى لعملية التعديل والحذف. من الواضح أن هذه الصفحة هي التي من خلالها سيتم اختيار العمل المطلوب، على سبيل المثال القائمة قد تحتوي على عناصر مثل - الأصناف - الرحلات - الزوار وعند الضغط على أي منها يتم الانتقال إلى الصفحة المقابلة للاختيار، وهذا هو المطلوب التالي. ج- بعدما يختار المستخدم عنصرًا معينًا من القائمة يتم الانتقال إلى الصفحة المناسبة (المكافئة) ويتم عرض البيانات من جدول بقواعد البيانات د- صفحة تعرض بيانات سجل واحد، ويتم عرضه في نموذج form بها خانات ممتلئة بالبيانات العائدة من قواعد البيانات. هـ - صفحة تعرض نتيجة استعلام الذي يعود بعدة سجلات بحيث يكون العرض ديناميكيًا، أي يعرض جميع السجلات في جدول و- صفحة أخرى تعرض نتيجة استعلام الذي يعود بعدة سجلات ولكن يتم تقسيم النتيجة إلى صفحات بحيث يعرض في كل صفحة عددًا ثابتًا من السجلات (على سبيل المثال 5 سجلات بالصفحة) ويمكن إضافة صفحات أخرى. التصور النهائي: صفحة بها نموذج form من خلالها يتم حفظ البيانات لقواعد البيانات، وقد تحتاج لعدد من هذه الصفحات (صفحة لكل جدول) توجد صفحة أخرى تحتوي على قائمة بها عدد من الاختيارات، عندما يختار أحدها ينتقل إلى صفحة أخرى تناسب هذا الاختيار يوجد عدد من الصفحات الأخرى لعرض البيانات الراجعة من الاستعلامات، فهناك صفحة لعرض سجل واحد، وصفحة لعرض سجلات عديدة دفعة واحدة، وصفحة ثالثة لعرض سجلات عديدة ولكن بتقسيمها على صفحات أما عن كيفية تنفيذ المشروع، سأعرض لك المتطلبات الأساسية لتنفيذ مثل هذا المشروع، هذا مشروع ويب يتطلب مهارة في تطوير الواجهة الأمامية، والواجهة الخلفية، وكذلك التعامل مع قواعد البيانات. هيكل قواعد البينات: يحتوي العديد من الجداول المطلوب حفظ وتعديل وحذف البيانات منها عن طريق تطبيق الويب، الواجهة الأمامية تحتاج على الأقل إتقان الأدوات الأساسية لتطبيق الويب HTML, CSS, JavaScript إضافة إلى إحدى المكتبات أو أُطر العمل التي تساعد في إنجاز التصميم. الواجهة الخادمية (الخلفية) تحتاج إتقان إحدى لغات البرمجة مثل php, python, أو بيئة تطوير مثل node js الحقيقة هذا مشروع ضخم، يحتاج إتقان العديد من المهارات.
  11. استبدل كلمة root بـ self بعد التعديل، قمت بتجربتها على الشجرة (ولكن العناصر أضفتها يدويًا ليس من إكسيل)، وتمت عملية النسخ واللصق بنجاح. هذه شيفرات إضافة العناصر يدويًا self.tree.insert("", "end", text="Item 1") self.tree.insert("", "end", text="Item 2") self.tree.insert("", "end", text="Item 3")
  12. ما المقصود بإضافة أداة الإدخال عليهم؟ تقصد تمكين أداة Entry من النسخ واللصق مثل TreeView؟ إذا كان هذا ما تقصده، فستحتاج لتكرار نفس الخطوات للأداة Entry
  13. الموضوع بسيط جدًا، فالوظيفة تعود بقاموس dict بالفعل، فكل ما عليك هو تعريف متغير (كائن) يستقبل القاموس الراجع من هذه الوظيفة، ثم التعامل مع هذا الكائن، عن طريق طلب أي مفتاح key منه. def func(): var1 = 'Hola' var2 = 'Hola2' return dict(var1=var1, var2=var2) # المتغير التالي نوعه قاموس[نص، نص] # dict[str, str] result = func() # يمكنك معرفة أي قيمة عن طريق المفتاح الخاص بها print(result["var1"])
  14. يمكنك إضافة أي أداة مهما كانت المكتبة الخاصة بها، يتم ذلك داخل الباني __init__ بحيث تجعل المعامل الأول للأداة هو self مثل المثال التالي: class app(tk.Tk): def __init__(self) -> None: super().__init__() self.tree = ttk.Treeview(self) self.tree.pack() self.entry2 = tk.Entry(self) self.entry2.pack()
  15. في البداية لن تحتاج للوراثة غير من التصنيف tk.Tk فقط، هذه الشيفرة كاملة بعد وضعها داخل تصنيف class يسمى app import tkinter as tk from tkinter import ttk class app(tk.Tk): def __init__(self) -> None: super().__init__() // لاحظ أن الكائن التالي يحتاج مكتبة // ttk self.tree = ttk.Treeview(self) self.tree.pack() self.tree.insert("", "end", text="Item 1") self.tree.insert("", "end", text="Item 2") self.tree.insert("", "end", text="Item 3") self.popup = tk.Menu(self.tree, tearoff=0) self.popup.add_command(label="Copy", command=lambda: self.copy_item()) self.popup.add_command(label="Paste", command=lambda: self.paste_item()) self.tree.bind("<Button-3>", self.show_popup) def copy_item(self): item = self.tree.selection()[0] self.clipboard_clear() self.clipboard_append(self.tree.item(item, option="text")) def paste_item(self): text = self.clipboard_get() self.tree.insert("", "end", text=text) def show_popup(self, event): row = self.tree.identify_row(event.y) if row: self.tree.selection_set(row) self.popup.post(event.x_root, event.y_root) form = app() form.mainloop()
  16. الخطأ ينبهك أنك تحاول استخدام next/router في جهة الخادم server-side. السبب أن جهة الخادم server-side عبارة عن بيئة تطوير تستخدم إطار عمل Next.js وهذا الإطار لا يدعم Router لأنه يخص المتصفح، حاول تجربة الشيفرات التالية: import React, { useEffect } from "react"; import { useRouter } from "next/router"; const [Theme, setTheme] = useState("light"); function themeSwitcher() { const router = useRouter(); useEffect(() => { if (Theme === "light") { setTheme("dark"); console.log(Theme); router.push({ pathname: "/layout", query: Theme, }); } else { setTheme("light"); console.log(Theme); router.push({ pathname: "/layout", query: Theme, }); } //لاحظ أن الخطاف سيعتمد على قيمة الكائن // Theme }, [Theme]); } return ( <div> <button onClick={themeSwitcher}>light/dark</button> </div> );
  17. أنت أنشات تصنيفًا class وتريد وضع الشيفرات بداخله؟ هل التصنيف يرث من أي تصنيف آخر؟ يرجى مشاركة الأجزاء الأولى من الشيفرات الخاصة بك، بحيث يظهر إنشاء التصنيف والباني __init__
  18. بالتأكيد عند فشل الواجهة البرمجية ستكون قيمة الكائن nriRates = undefined، لذلك حاول تغيير السطر التالي: //setNriRates(res?.data?.data); setNriRates(res?.data?.data || []); هذا سيعود بمصفوفة فارغة في حالة لم يجد res أو data ملحوظة أخرى ليس لها علاقة بالمشكلة الحالية ولكنها تهم كل من يستخدم الوجهات البرمجية api: في أغلب الأحيان تعود الواجهة البرمجية باستجابة ولكن قد تكون الاستجابة قيمتها غير 200، مثل غير موجود (400)، لذلك قد يقع الكثير من المبرمجين في هذا الخطأ ويعتقد أن الواجهة عندما تفشل فإنه res سيكون غير معرف، ولكن أحيانًا تعود باستجابة 400 أو 500 نتيجة عدم تواجدها أو انشغال الخادم ومثل هذه المشاكل، ولكنه قد عاد باستجابة فعليًا. لذلك، نصيحتي لكل المبرمجين، عندما تريد معرفة نجاح أو فشل الواجهة البرمجية api لا تسأل عن res له قيمة أم ليس له قيمة، ولكن يجب عليك السؤال عن قيمته، فإذا كانت 200 يعني نجاح الأمر، أما القيم الأخرى تدخل على فشل الأمر.
  19. يمكن استخدام الشيفرة التالية، ولكن هناك ملاحظة: بخصوص عنوان الموضوع، يفضل أن يكون العنوان معبرًا عن المحتوى حتى يمكنك الرجوع إليه فيما بعد، وحتى تعم الفائدة للجميع. # وضع قيم مبدئية للمتغيرات uppercase = False symbol = False length = False # تعريف الرموز التي يجب أن يحتوي واحدًا منها، بالتأكيد يمكننا الإضافة إليها symbols = "!@#$%&*" # نختبر طول كلمة المرور if len(password) >= 8: length = True # حلقة تكرارية على كل حرف for char in password: # نختبر إذا كان الحرف كبيرًا if char.isupper(): uppercase = True # نقوم بتغيير قيمة المتغير لأن هذا الشرط تم استيفاؤه # نختبر إذا الحرف رمز if char in symbols: symbol = True # تم استيفاء الشرط if not uppercase: print("Should include at least one lowercase character") if not symbol: print("Should include at least one of these symboles !@#$%&* ") if not length: print("Length should be at least 8 characters") يتبقي اختبار الأحرف الصغيرة والأرقام، أتركها لك للتدريب. إرشاد: ستتم بنفس الطريق، ولكن يجب إيجاد الوظيفة المناسبة من وظائف str
  20. سأرسل لك الشيفرة كاملة import tkinter as tk from tkinter import ttk root = tk.Tk() tree = ttk.Treeview(root) tree.pack() tree.insert("", "end", text="Item 1") tree.insert("", "end", text="Item 2") tree.insert("", "end", text="Item 3") popup = tk.Menu(tree, tearoff=0) popup.add_command(label="Copy", command=lambda: copy_item()) popup.add_command(label="Paste", command=lambda: paste_item()) def copy_item(): item = tree.selection()[0] # تنظيف الذاكرة root.clipboard_clear() # نسخ عنوان العنصر إلى الذكرة root.clipboard_append(tree.item(item, option="text")) # تعريف وظيفة لعملية اللصق def paste_item(): text = root.clipboard_get() tree.insert("", "end", text=text) # تعريف وظيفة لإظهار القائمة def show_popup(event): # تحديد الصف تحت مؤشر الفأرة row = tree.identify_row(event.y) # في حالة أن الصف ليس فارغًا if row: # نقوم باختيار الصف من الشجرة tree.selection_set(row) # إظهار القائمة popup.post(event.x_root, event.y_root) tree.bind("<Button-3>", show_popup) root.mainloop() يمكنك استخدام الشيفرة كما هي أو وضعها داخل تصنيف class
  21. ربما تحتاج استبدال هذه الأسطر self.popup_menu.add_command(label="Cut", command=lambda: self.entry1.event_generate("<<Cut>>")) self.popup_menu.add_command(label="Copy", command=lambda : self.entry1.event_generate("<<Copy>>")) self.popup_menu.add_command(label="Paste", command=lambda: self.entry1.event_generate("<<Paste>>")) بهذه self.popup_menu.add_command(label="Cut", command=lambda: self.cut_item()) self.popup_menu.add_command(label="Copy", command=lambda: self.copy_item()) self.popup_menu.add_command(label="Paste", command=lambda: self.paste_item()) def cut_item(): item = tree.selection()[0] root.clipboard_clear() root.clipboard_append(tree.item(item, option="text")) tree.delete(item) def copy_item(): item = tree.selection()[0] root.clipboard_clear() root.clipboard_append(tree.item(item, option="text")) def paste_item(): text = root.clipboard_get() tree.insert("", "end", text=text) بالتأكيد يمكننا تحسين الكود عن طريق دمج الوظيفتين copy_item و cut_item ووضع معامل لتحديد المطلوب هل هو قص أو نسخ، ولكن فضلت كتابتها بهذا الشكل لتكون الصورة واضحة. مع استخدام def show_popup_menu(self,event): self.popup_menu.post(event.x_root, event.y_root)
  22. السطر الأخير يقوم بحذف الكائن draw الذي تم تعريفه مسبقًا، وذلك لتحسين الأداء وتفريغ الذاكرة، بعدما قام بمهمته، وهو يستخدم لرسم أشكال بسيطة وكتابة نص بسيط على الصور.
  23. كما توقعنا، الجزء التالي مفترض يكون المقارنة بين الوجه المعروف والأوجه الغير معروفة. الآن لدينا تشفير لصورة Malan، ولدينا قائمة بأماكن وتشفيرات الصورة الموجودة بصورة Harvard الحلقة التكرارية تقوم بالدوران على كل صورة بالقائمة Harvard وتقوم بمقارنتها مع صورة Malan عن طريق الوظيفة compare_faces التي تعود بقيمة True or false في الحقيقة يجب أن نوضح الوظيفة compare_faces بشكل أعمق حتى نفهمها ونستطيع استخدامها بشكل صحيح، هذه الوظيفة تحتاج معاملين: الأول عبارة عن قائمة list تحتوي على تشفيرات الأوجه المعروفة (في حالتنا هذه تحتوي على عنصر واحد فقط وهو تشفير وجه Malan) الثاني عبارة عن تشفير للوجه المراد اختباره مقابل القائمة المعروفة وتعود هذه الوظيفة بقائمة من القيم المنطقية True/False التي تعبر عن تطابق أو عدم تطابق الوجه المختبر مع كل وجه من القائمة المعروفة، في حالتنا ستحتوي هذه القائمة على عنصر واحد فقط، ولكن إذا افترضنا أن لدينا ثلاثة أوجه معروفة، ففي هذه الحالة ستعود الوظيفة بقائمة تحتوي على ثلاثة عناصر. أما الوظيفة face_distance فهي تعمل بشكل مشابه للوظيفة face_compare ولكنها تعود بقائمة تحتوي على قيم عددية بين 0 و 1، هذه القيم تعبر عن البعد بين الصور المعروفة والصورة المختبرة، كلما قلّت القيمة كلما كان أكثر تشابهًا، لذلك القيمة 0 تعني لا توجد مسافة (أي تطابق تام). في حالتنا بالتأكيد ستعود بقيمة واحدة لأن لدينا صورة واحدة معروفة، أما لو كان هناك أكثر من صورة فستعود بقائمة بها عدد عناصر يساوي عدد الصور ويعبر عن مدى بعد الصورة المختبرة عن كل صورة معروفة. السطر الثالث يعود برقم العنصر الأقل مسافة (أي الأكثر تشابهًا)
  24. هي سهلة جدًا، يمكن أن أقولها لك، ولكن أريدك البحث عنها بنفسك، لتنمية مهارة التعليم الذاتي، وإليك إرشاد: سيتم تغيير الوظيفة contains بوظيفة أخرى. بالتوفيق والسداد،
  25. السطر المستخدم في تشفير صورة Malan يقوم بتشفير وجهًا واحدًا فقط، الذي هو صورة Malan ولكنه يقوم بالبحث عن جميع أماكن الأوجه بالصورة الثانية ويقوم بتشفيرها جميعًا هذا السيناريو يستخدم عندما تكون صورة Malan تحتوي على وجهٍ واحد (الذي هو وجه Malan)، لذلك لا نحتاج للبحث عن أماكن الأوجه حيث لا يوجد إلا وجه واحد نعرفه، والمفترض الذي سنستخدمه فيما بعد للتعرف عليه واستخراجه من الصورة الثانية Harvard باختصار، نستخدم صورة Malan لمعرفة تشفير وجهه، ثم نستخدم الصورة الثانية Harvard لاستخراج Malan من بين أصدقائه. # encodings # البحث عن جميع الأماكن التي يوجد بها أوجه harvard_locations = face_recognition.face_locations(harvard) # تشفير كل الأوجه الموجودة في هذه الأماكن harvard_encodings = face_recognition.face_encodings(harvard , harvard_locations) # تشغير وجهًا واحدًا وهو يعبر عن وجه مولان # (الذي في الغالب لن يوجد غيره بهذه الصورة، أو قد يكون هناك عدة أوجه ولكن كلها له) # تم استخدام [0] لأن الوظفية تعود بقائمة من المصفوفات، # list of arrays # فنحن نريد المصفوفة الأولى malan_encodings = face_recognition.face_encodings(malan)[0] لاحظ أن هذه الطريقة قد تسبب مشكلة إذا احتوت الصورة Malan على أوجه لأناس مختلفين، لأنه في هذه الحالة سيقوم بتشفير أول وجه بالصورة، وقد لا يكون وجه Malan.
×
×
  • أضف...