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

El Sayed El Tohamy

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

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

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

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

    1

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

  1. لتشعيل Flask على جهازك يلزم التأكد من تثبيت بايثون ومدير حزم البايثون Python & pip وكذلك محرر نصوص على سبيل المثال VSCode يمكنك الرجوع لهذا المقال إذا لم يكن لديك بايثون مثبت على جهاز https://academy.hsoub.com/questions/27105-طريقة-تحميل-و-الاشتغال-على-django-و-تجربة-و-رؤية-نتيجة-الكود-على-جهاز-ويندوز-10/#comment-83646 بعد ذلك قم بتثبيت مكتبة Flask عن طريق pip install flask ثم قم بإنشاء مجلد جديد وليكن اسمه my_flask_app قم بإنشاء ملف جديد اسمه app.py واكتب داخله الشيفرات التالية from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello, World!" ومن خلال منفذ الأوامر terminal قم بتشغيل خادم الفلاسك عن طريق flask run يتسبب هذا في تشغيل الخادم على العنوان http://127.0.0.1:5000/ قم نسخه وفتح بالمتصفح لترى صفحة مكتوبًا فيها Hello, World
  2. سعر الدورة بالدولار الأمريكي = 290$ لمعرفة كم تساوي بالريال السعودي، يجب معرفة كم يساوي الدولار من الريالات ويتم ضربه * 290،
  3. يمكننا تجاهل التكرارات عن طريق الوظيفة drop_duplicates() وهي تخص DataFrame
  4. في البداية أود أن أحييك على المجهود الرائع الذي بذلته، سأرشدك لبعض النقاط تسهل عليك الأمر، أليست البيانات تأتي من ملف إكسيل (على ما أتذكر)؟ وتضعها داخل DataFrame؟ يمكنك البحث داخل DataFrame عن الخصائص التي تريدها، وتأخذ النتائج في DataFrame جديد ثم تطبقه على treeview يمكنك الرجوع لهذا المثال بالتوفيق
  5. إذا كان المقصود وقت الاختبار، فبالتأكيد الاستفادة العلمية مع الحصول على درجة قليلة، أفضل من الحصول على درجة عالية دون استفادة، وفي المرة القادمة تكونين قادرة بإذن الله على حل المسألة بمجهودك. بالتوفيق.
  6. أي لغة تستخدم؟ لكن بشكل عام، إذا قيمة المتغير A أرقام صحيحة فيمكنك استخدام long لأنه يستوعب مدى أكبر من int، أما إذا كان المتغير سيحتوي على قيم عشرية، فستحتاج لاستخدام double. وللحصول على أي خانة من القيمة العددية ولتكن 1985 فنقوم بتحويلها إلى نص string واستخراج الخانة المطلوبة عن طريق المرقم index، على سبيل المثال لاستخراج الخانة الثانية نستخدم المرقم 1 لأن الترتيب يبدأ بصفر، ولاستخراج الخانة الأخيرة نستخدم المرقم 3 (الذي هو عبارة عن عدد الخانات - 1).
  7. وعليكم السلام ورحمة الله وبركاته، يرجى التأكد من الخطوات التالية لضمان عمل المكتبة بشكل جيد، أولاً: تثبيت المكتبة عن طريق الأمر pip install matplotlib ثانيًا: استيراد الوحدات البرمجية المطلوبة ثالثًا: استخدام أمر show إليك الشيفرة كاملة: import pandas as p import matplotlib.pyplot as plt # استيراد matplotlib x=p.Series((2,4,56,5,6)) x.plot(kind='pie') plt.show() # عرض البيانات المفترض يظهر معك هكذا
  8. لاحظ أن دعم الاتجاه من اليمين لليسار ليس متطورًا بالقدر الكافي في مكتبة tkinter، حتى في التوثيق الرسمي لها لم يذكروا شيئًا مفيدًا بخصوص هذا الموضوع، لذلك نستخدم الخصائص المتوافرة للحصول على أقرب النتائج لما نريده، على سبيل المثال السطر التالي لمحاولة جعل الأداة تنحاز لجهة اليمين حتى مع تحجيم النافذة. أما السطر التالي، فإنه يقوم بجعل اتجاه النصوص والأيقونات على الأدوات متجهة من اليمين (بالتأكيد ليس مدعومًا لكل الأدوات)، لذلك أيضًا نستعمل الخصائص المتوافرة لدينا لحل هذه المشكلة على سبيل المثال أداة الإدخال في tk نستخدم خاصية justify لجعل الاتجاه يمين self.entry1 = tk.Entry(self) self.entry1.config(justify=tk.RIGHT) وهكذا نحاول التغلب على القصور الموجود بالمكتبة.
  9. وعليكم السلام ورحمة الله، يمكنك استخدام الوظيفة 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 تعني الشرق أي اليمين.
  10. لأننا في كل حلقة نقوم بقسمة 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
  11. وعليكم السلام ورحمة الله، لا توجد وظيفة جاهزة لتنفيذ عملية البحث بمجرد الكتابة مباشرة في أداة الإدخال Entry، ولكن يمكن عمل ذلك بطريقة أخرى، سأعطيك بعض الإرشادات التي ستمكنك بإذن الله من تنفيذ ما تريده، إضافة إلى تنمية مهارة البحث والتعلم الذاتي، يوجد في أداة الإدخال حدث ينطلق عند الضغط على أي مفتاح من لوحة المفاتيح، وهو الحدث Key، فمن خلاله نستطيع استدعاء وظيفة نقوم بكتابتها ويتم تنفيذها كلما انطلق هذا الحدث (أي كلما ضغط المستخدم زرًا على لوحة المفاتيح) ويتم الربط بالشكل التالي self.entry1.bind('<Key>', self.search) يتم كتابة السطر السابق في الباني __init__ الخطوة التالية هي إنشاء وظيف تسمى search وكتابة الشيفرات المطلوبة لعملية البحث أو أي خوارزمية أخرى def search(self, key): print(key, key.char) كما هو واضح الوظيفة تحتاج معامل key والذي من خلاله نستطيع الحصول على معلومات عن الزر الذي تم ضغطه، يمكنك كتابة الشيفرات المطلوبة في هذه الوظيفة.
  12. نعم يتم استخدام الأقواس المعكوفة {} لإحاطة النصوص غير اللغة الإنجليزية، لتجنب هذه المشكلة سنقوم بعمل خوارزمية إضافية، بحيث تتم بالخطوات التالية: 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])
  13. 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() الشيفرة كاملة، تم تجربتها وتقوم بعملية النسخ واللصق على الشجرة بشكل صحيح، والعنصر يظهر للمستخدم.
  14. المشكلة هنا هي مشكلة ترميز 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)
  15. هل يمكنك مشاركة الشيفرات كاملة من فضلك، بحيث أعمل عليها كما هي عندك بالضبط. كذلك إذا توجد أي ملفات مساعدة مثل الإكسيل يرجى إرسال الملف بحتوي على عينة من البيانات للتجربة عليه.
  16. وعليكم السلام ورحمة الله وبركاته الخطأ بسبب تنسيق التاريخ، لأن التنسيق الافتراضي هو yyyy-mm-dd، فإذا كان اليوم أو الشهر أقل من 10 أي يتكون من رقم واحد يجب إضافة صفرًا قبله، فالحل # ضبط الصيغة بوضع صفرًا في خانة الشهر x = np.datetime64('2024-01-25') أو يمكن تحديد تنسيق معين آخر، في الرابط التالي شرح بتفاصيل التنسيقات https://numpy.org/doc/stable/reference/arrays.datetime.html
  17. المطلوب إنشاء من 2 إلى 6 صفحات: ويجب أن يحتوي المشروع على النقاط التالية أ- صفحة تحتوي نمود form بها عدد من خانات الإدخال entry ويتم حفظها (أي إضافة سجل) في جدولٍ ما بقواعد البيانات خاصتك: - قد يكون إضافة منتج في جدول PRODUCT - أو إضافة رحلة في جدول FLIGHT - أو زائر في جدول VISISTOR (أعتقد أنه يقصد VISITOR) - وهكذا ب- صفحة تمكننا من اختيار خيار معين ليتم الانتقال لصفحة معينة بناء على هذا الاختيار: - قائمة منسدلة drop-down list تحتوي على روابط على هيئة أسماء أو صور - قائمة menu تحتوي على روابط على هيئة أسماء أو صور - جدول grid يحتوي على روابط على هيئة أسماء أو صور - وهكذا إضافة إلى ذلك مطلوب منك توقع الصفحات الأخرى لعملية التعديل والحذف. من الواضح أن هذه الصفحة هي التي من خلالها سيتم اختيار العمل المطلوب، على سبيل المثال القائمة قد تحتوي على عناصر مثل - الأصناف - الرحلات - الزوار وعند الضغط على أي منها يتم الانتقال إلى الصفحة المقابلة للاختيار، وهذا هو المطلوب التالي. ج- بعدما يختار المستخدم عنصرًا معينًا من القائمة يتم الانتقال إلى الصفحة المناسبة (المكافئة) ويتم عرض البيانات من جدول بقواعد البيانات د- صفحة تعرض بيانات سجل واحد، ويتم عرضه في نموذج form بها خانات ممتلئة بالبيانات العائدة من قواعد البيانات. هـ - صفحة تعرض نتيجة استعلام الذي يعود بعدة سجلات بحيث يكون العرض ديناميكيًا، أي يعرض جميع السجلات في جدول و- صفحة أخرى تعرض نتيجة استعلام الذي يعود بعدة سجلات ولكن يتم تقسيم النتيجة إلى صفحات بحيث يعرض في كل صفحة عددًا ثابتًا من السجلات (على سبيل المثال 5 سجلات بالصفحة) ويمكن إضافة صفحات أخرى. التصور النهائي: صفحة بها نموذج form من خلالها يتم حفظ البيانات لقواعد البيانات، وقد تحتاج لعدد من هذه الصفحات (صفحة لكل جدول) توجد صفحة أخرى تحتوي على قائمة بها عدد من الاختيارات، عندما يختار أحدها ينتقل إلى صفحة أخرى تناسب هذا الاختيار يوجد عدد من الصفحات الأخرى لعرض البيانات الراجعة من الاستعلامات، فهناك صفحة لعرض سجل واحد، وصفحة لعرض سجلات عديدة دفعة واحدة، وصفحة ثالثة لعرض سجلات عديدة ولكن بتقسيمها على صفحات أما عن كيفية تنفيذ المشروع، سأعرض لك المتطلبات الأساسية لتنفيذ مثل هذا المشروع، هذا مشروع ويب يتطلب مهارة في تطوير الواجهة الأمامية، والواجهة الخلفية، وكذلك التعامل مع قواعد البيانات. هيكل قواعد البينات: يحتوي العديد من الجداول المطلوب حفظ وتعديل وحذف البيانات منها عن طريق تطبيق الويب، الواجهة الأمامية تحتاج على الأقل إتقان الأدوات الأساسية لتطبيق الويب HTML, CSS, JavaScript إضافة إلى إحدى المكتبات أو أُطر العمل التي تساعد في إنجاز التصميم. الواجهة الخادمية (الخلفية) تحتاج إتقان إحدى لغات البرمجة مثل php, python, أو بيئة تطوير مثل node js الحقيقة هذا مشروع ضخم، يحتاج إتقان العديد من المهارات.
  18. استبدل كلمة root بـ self بعد التعديل، قمت بتجربتها على الشجرة (ولكن العناصر أضفتها يدويًا ليس من إكسيل)، وتمت عملية النسخ واللصق بنجاح. هذه شيفرات إضافة العناصر يدويًا self.tree.insert("", "end", text="Item 1") self.tree.insert("", "end", text="Item 2") self.tree.insert("", "end", text="Item 3")
  19. ما المقصود بإضافة أداة الإدخال عليهم؟ تقصد تمكين أداة Entry من النسخ واللصق مثل TreeView؟ إذا كان هذا ما تقصده، فستحتاج لتكرار نفس الخطوات للأداة Entry
  20. الموضوع بسيط جدًا، فالوظيفة تعود بقاموس dict بالفعل، فكل ما عليك هو تعريف متغير (كائن) يستقبل القاموس الراجع من هذه الوظيفة، ثم التعامل مع هذا الكائن، عن طريق طلب أي مفتاح key منه. def func(): var1 = 'Hola' var2 = 'Hola2' return dict(var1=var1, var2=var2) # المتغير التالي نوعه قاموس[نص، نص] # dict[str, str] result = func() # يمكنك معرفة أي قيمة عن طريق المفتاح الخاص بها print(result["var1"])
  21. يمكنك إضافة أي أداة مهما كانت المكتبة الخاصة بها، يتم ذلك داخل الباني __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()
  22. في البداية لن تحتاج للوراثة غير من التصنيف 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()
  23. الخطأ ينبهك أنك تحاول استخدام 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> );
  24. أنت أنشات تصنيفًا class وتريد وضع الشيفرات بداخله؟ هل التصنيف يرث من أي تصنيف آخر؟ يرجى مشاركة الأجزاء الأولى من الشيفرات الخاصة بك، بحيث يظهر إنشاء التصنيف والباني __init__
  25. بالتأكيد عند فشل الواجهة البرمجية ستكون قيمة الكائن nriRates = undefined، لذلك حاول تغيير السطر التالي: //setNriRates(res?.data?.data); setNriRates(res?.data?.data || []); هذا سيعود بمصفوفة فارغة في حالة لم يجد res أو data ملحوظة أخرى ليس لها علاقة بالمشكلة الحالية ولكنها تهم كل من يستخدم الوجهات البرمجية api: في أغلب الأحيان تعود الواجهة البرمجية باستجابة ولكن قد تكون الاستجابة قيمتها غير 200، مثل غير موجود (400)، لذلك قد يقع الكثير من المبرمجين في هذا الخطأ ويعتقد أن الواجهة عندما تفشل فإنه res سيكون غير معرف، ولكن أحيانًا تعود باستجابة 400 أو 500 نتيجة عدم تواجدها أو انشغال الخادم ومثل هذه المشاكل، ولكنه قد عاد باستجابة فعليًا. لذلك، نصيحتي لكل المبرمجين، عندما تريد معرفة نجاح أو فشل الواجهة البرمجية api لا تسأل عن res له قيمة أم ليس له قيمة، ولكن يجب عليك السؤال عن قيمته، فإذا كانت 200 يعني نجاح الأمر، أما القيم الأخرى تدخل على فشل الأمر.
×
×
  • أضف...