إنشاء تطبيق محول العملات باستخدام Tkinter

في هذا الدرس، ستنشئ تطبيقًا لتحويل العملات باستخدام بايثون وTkinter. يتيح التطبيق للمستخدمين اختيار العملة المصدر، والعملة المستهدفة، وإدخال المبلغ المراد تحويله. سيستخدم التطبيق أسعار الصرف الفورية للتحويل من العملة المصدر إلى العملة المستهدفة، مما يوفر تحويلات دقيقة ومحدثة.

من خلال هذا المشروع، ستكتسب خبرة عملية في التعامل مع عناصر واجهة المستخدم الرسومية لـ Tkinter، ومعالجة مدخلات المستخدم، والتفاعل مع واجهة برمجة تطبيقات خارجية. بنهاية البرنامج التعليمي، سيكون لديك تطبيق لتحويل العملات، وستكتسب مهارات عملية يمكنك تطبيقها في مشاريعك الخاصة باستخدام Python وTkinter.

إعداد البيئة

سنبدأ بإعداد بيئة عمل للمشروع. نستخدم Tkinter لهذا المشروع، وهو مُضمّن افتراضيًا في معظم إصدارات بايثون، لذا لا نحتاج إلى تثبيته.

سنستخدم أيضًا مكتبة requests لإرسال طلبات HTTP إلى واجهة برمجة تطبيقات سعر الصرف، والتي يُمكننا تثبيتها من PyPi باستخدام pip. نريد أيضًا إنشاء مجلد لحفظ ملفات مشروعنا، بما في ذلك نص بايثون والصور.

فيما يلي التعليمات لإنشاء مجلد لمشروعنا يسمى currency_converter، وإعداد بيئة افتراضية، وتنشيطها وتثبيت requests في تلك البيئة.

> mkdir currency_converter/
> cd currency_converter
> python -m venv venv
> venv\Scripts\activate.bat
(venv)> pip install requests

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

إعداد هيكل المشروع

الآن بعد أن قمنا بإنشاء البيئة الافتراضية وتثبيت مكتبات الطرف الثالث المطلوبة، يمكننا إعداد بنية المشروع.

أضف مجلدًا باسم images إلى جذر مشروعك.

المجلد الفرعي /images هو المكان الذي سنضع فيه شعار التطبيق. سيُحفظ كود تطبيقنا في المجلد الرئيسي، المسمى currency_converter.py.

currency_converter/
│
├── images/
│   └── logo.png
│
└── currency_converter.py

البدء باستخدام تطبيقنا

بعد إعداد مجلد المشروع وتثبيت المتطلبات، يمكننا البدء ببناء تطبيقنا. أنشئ ملفًا جديدًا باسم currency_converter.py في جذر مجلد المشروع، وافتحه في محرر النصوص.

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

import os
import sys
import tkinter as tk
import tkinter.ttk as ttk
from tkinter import messagebox

import requests

class CurrencyConverterApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("500x450+300+150")
        self.title("Currency Converter")
        self.resizable(width=0, height=0)

if __name__ == "__main__":
    app = CurrencyConverterApp()
    app.mainloop()

في الكود أعلاه، نستورد وحدتي os وsys من مكتبة بايثون القياسية. ثم نستورد حزمة tkinter باسم tk. يُستخدم هذا الاختصار عادةً مع Tkinter لتوفير كتابة الاسم الكامل بشكل متكرر. نستورد أيضًا حزمة tkinter.ttk التي تتيح لنا الوصول إلى أدوات Tkinter ذات السمات، والتي تبدو أجمل من الإعدادات الافتراضية. نستورد أيضًا وحدة Messagebox لإنشاء نوافذ حوار منبثقة. وأخيرًا، نستورد مكتبة Requests لإرسال طلبات HTTP إلى واجهة برمجة التطبيقات (API) للحصول على أسعار صرف محدثة وتحويل العملات.

نبدأ بإنشاء نافذة جذر التطبيق، والتي تعمل أيضًا كحاوية للتطبيق في Tkinter. للقيام بذلك، ننشئ فئة تُسمى CurrencyConverterApp، وهي ترث من فئة tk.Tk. نضيف إليها دالة ()__init__ مخصصة، والتي تُستخدم لتهيئة الكائن، حيث نضبط سمات النافذة.

لضبط عرض النافذة وارتفاعها وموقعها، نستخدم دالة ()geometry. أما بالنسبة لعنوان النافذة، فنستخدم دالة ()title. وأخيرًا، نستخدم دالة ()resizable مع ضبط width وheight على 0 لجعل النافذة غير قابلة لتغيير الحجم.

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

عندما تقوم بتشغيل هذا الكود، سترى النافذة التالية على شاشتك:

النافذة الرئيسية لمحول العملات

لا يوجد الكثير مما يمكن رؤيته حاليًا: محول العملات لدينا لا يحتوي على واجهة مستخدم رسومية عملية. إنه مجرد نافذة عادية بعنوان وحجم مناسبين.

الآن دعونا ننشئ واجهة المستخدم الرسومية للتطبيق.

إنشاء واجهة المستخدم الرسومية لمحول العملات

لإنشاء واجهة المستخدم الرسومية للتطبيق، لنبدأ بإضافة الأدوات إلى النافذة الرئيسية. سنضيف الأدوات التالية:

  • شعار التطبيق
  • علامتان وصندوقان مشتركان مرتبطان لاختيار العملة المصدر والعملة المستهدفة
  • تسمية للمبلغ المراد تحويله وحقل إدخال مرتبط به
  • علامة لعرض نتائج التحويل
  • زر لتشغيل التحويل

أولاً دعونا نضيف الشعار إلى تطبيقنا.

# ...

class CurrencyConverterApp(tk.Tk):
    # ...

    def build_gui(self):
        self.logo = tk.PhotoImage(file="images/logo.png")
        tk.Label(self, image=self.logo).pack()

في هذا المقطع البرمجي، نُنشئ أولًا دالة ()build_gui لتحديد جميع الأدوات التي نحتاجها في واجهة المستخدم الرسومية. داخل هذه الدالة، نُحمّل صورة باستخدام فئة ()tk.PhotoImage.

بعد ذلك، نُنشئ label لعرض الصورة باستخدام دالة ()ttk.Label، التي تقبل self وimage كوسيطتين. وأخيرًا، نضع label في النافذة الرئيسية باستخدام دالة ()pack، وهي مُدير هندسة في Tkinter.

لاستخدام دالة ()build_gui، يجب استدعاؤها. للقيام بذلك، أضف استدعاء ()self.build_gui إلى نهاية دالة init(). ينتج عن ذلك الكود التالي.

import os
import sys
import tkinter as tk
import tkinter.ttk as ttk
from tkinter import messagebox

import requests

class CurrencyConverterApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("500x450+300+150")
        self.title("Currency Converter")
        self.resizable(width=0, height=0)

    def build_gui(self):
        self.logo = tk.PhotoImage(file="images/logo.png")
        tk.Label(self, image=self.logo).pack()
        self.build_gui()


if __name__ == "__main__":
    app = CurrencyConverterApp()
    app.mainloop()

شغّل التطبيق. ستحصل على النتيجة التالية:

نافذة محول العملات مع الشعار

الآن يمكننا أن نرى شيئًا! سنستمر في إضافة عناصر واجهة المستخدم لبناء واجهة المستخدم. أولًا، سننشئ إطارًا لوضع عناصر واجهة المستخدم. أضف إطارًا أسفل رمز الشعار الذي أضفناه إلى دالة ()build_gui:

# ...

class CurrencyConverterApp(tk.Tk):
    # ...

    def build_gui(self):
        self.logo = tk.PhotoImage(file="images/logo.png")
        tk.Label(self, image=self.logo).pack()
        frame = tk.Frame(self)
        frame.pack()

هنا، نُنشئ إطارًا باستخدام فئة tk.Frame. تأخذ هذه الفئة self كمعامل لأن النافذة الحالية هي النافذة الأم للإطار. لوضع الإطار داخل النافذة الرئيسية، نستخدم دالة ()pack.

بعد تثبيت الإطار، يُمكننا إضافة المزيد من الأدوات. فيما يلي الكود الخاص بتعبئة الإطار:

# ...

class CurrencyConverterApp(tk.Tk):
    # ...

    def build_gui(self):
        # ...

        from_label = ttk.Label(frame, text="From:")
        from_label.grid(row=0, column=0, padx=5, pady=5, sticky=tk.W)

        to_label = ttk.Label(frame, text="To:")
        to_label.grid(row=0, column=1, padx=5, pady=5, sticky=tk.W)

        self.from_combo = ttk.Combobox(frame)
        self.from_combo.grid(row=1, column=0, padx=5, pady=5)

        self.to_combo = ttk.Combobox(frame)
        self.to_combo.grid(row=1, column=1, padx=5, pady=5)

في هذا الكود، نُنشئ علامتين باستخدام فئة )ttk.Label. نُحدد موضعهما باستخدام دالة ()grid. ثم نُنشئ صندوقي التحرير والسرد باستخدام فئة ()ttk.Combobox، ونضعهما في الإطار باستخدام دالة ()grid مرة أخرى.

لاحظ أننا وضعنا العلامات في الصف الأول من الإطار، بينما وضعت المربعات المنسدلة في الصف الثاني. ستبدو واجهة المستخدم الرسومية الآن كما يلي:

واجهة المستخدم الرسومية لمحول العملات

رائع! واجهة تطبيقك الرسومية تحتوي الآن على أدوات لاختيار عملات المصدر والهدف. لنُضِف الآن الأدوات الأربع الأخيرة. إليك الكود الخاص بذلك:

# ...

class CurrencyConverterApp(tk.Tk):
    # ...

    def build_gui(self):
        # ...

        amount_label = ttk.Label(frame, text="Amount:")
        amount_label.grid(row=2, column=0, padx=5, pady=5, sticky=tk.W)

        self.amount_entry = ttk.Entry(frame)
        self.amount_entry.insert(0, "1.00")
        self.amount_entry.grid(
            row=3, column=0, columnspan=2, padx=5, pady=5, sticky=tk.W + tk.E
        )

        self.result_label = ttk.Label(font=("Arial", 20, "bold"))
        self.result_label.pack()

        convert_button = ttk.Button(self, text="Convert", width=20)
        convert_button.pack()

في هذا المقطع البرمجي، نضيف علامتين باستخدام صنف ()ttk.Label كالمعتاد. ثم ننشئ حقل الإدخال باستخدام صنف ()ttk.Entry. بعد ذلك، نضيف زر التحويل باستخدام صنف ()ttk.Button. يجب أن تكون جميع هذه الأدوات داخل كائن الإطار.

لاحظ أننا وضعنا amount_label ومدخل المبلغ amount_entry باستخدام دالة ()grid. في المقابل، استخدمنا دالة ()pack لوضع تسمية النتيجة (result_label) وزر التحويل (convert_button).

يظهر الكود الحالي الكامل أدناه.

import os
import sys
import tkinter as tk
import tkinter.ttk as ttk
from tkinter import messagebox

import requests

class CurrencyConverterApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("500x450+300+150")
        self.title("Currency Converter")
        self.resizable(width=0, height=0)
        self.build_gui()

    def build_gui(self):
        self.logo = tk.PhotoImage(file="images/logo.png")
        tk.Label(self, image=self.logo).pack()
        frame = tk.Frame(self)
        frame.pack()

        from_label = ttk.Label(frame, text="From:")
        from_label.grid(row=0, column=0, padx=5, pady=5, sticky=tk.W)

        to_label = ttk.Label(frame, text="To:")
        to_label.grid(row=0, column=1, padx=5, pady=5, sticky=tk.W)

        self.from_combo = ttk.Combobox(frame)
        self.from_combo.grid(row=1, column=0, padx=5, pady=5)

        self.to_combo = ttk.Combobox(frame)
        self.to_combo.grid(row=1, column=1, padx=5, pady=5)

        amount_label = ttk.Label(frame, text="Amount:")
        amount_label.grid(row=2, column=0, padx=5, pady=5, sticky=tk.W)

        self.amount_entry = ttk.Entry(frame)
        self.amount_entry.insert(0, "1.00")
        self.amount_entry.grid(
            row=3, column=0, columnspan=2, padx=5, pady=5, sticky=tk.W + tk.E
        )

        self.result_label = ttk.Label(font=("Arial", 20, "bold"))
        self.result_label.pack()

        convert_button = ttk.Button(self, text="Convert", width=20)
        convert_button.pack()


if __name__ == "__main__":
    app = CurrencyConverterApp()
    app.mainloop()

قم بتشغيل هذا الأمر وسوف ترى النافذة التالية.

واجهة المستخدم الرسومية لمحول العملات

يبدو الوضع جيدًا الآن. واجهة التطبيق الرسومية مكتملة وظيفيًا. على الرغم من عدم ظهور علامة نتيجة التحويل، إلا أنها موجودة وستكون مرئية بمجرد إضافة أي شيء إليها.

تنفيذ وظيفة تحويل العملة

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

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

الآن وقد حصلنا على مفتاح API، لنبدأ بتطبيق خاصية تحويل العملات. أولًا، سنضيف مفتاح API كمتغير بيئة.

في نظام ويندوز، افتح الطرفية كمسؤول وشغّل الأمر التالي. يُرجى ملاحظة أنه يجب استبدال جزء “your_api_key” بمفتاح واجهة برمجة التطبيقات الفعلي:

> setx API_KEY "your_api_key"

الآن، عُد إلى مُحرِّر الكود. أسفل الاستيرادات، الصق الكود التالي:

# ...
import requests

API_KEY = os.getenv("API_KEY")
if API_KEY is None:
    messagebox.showerror(
        "API Key Error", "API_KEY environment variable is not set."
    )
    sys.exit(1)

API_URL = f"https://v6.exchangerate-api.com/v6/{API_KEY}/"

# ...

هنا، نسترد مفتاح واجهة برمجة التطبيقات من متغير البيئة (الذي حددناه للتو) باستخدام دالة ()os.getenv. باستخدام جملة الشرط (if)، نتحقق مما إذا كان المفتاح قد تم تعيينه. إذا لم يكن كذلك، نصدر رسالة خطأ وننهي تشغيل التطبيق باستخدام دالة ()sys.exit. بعد ذلك، ننشئ رابط URL للحصول على أحدث العملات.

شغّل الكود الآن – في نفس واجهة البرنامج التي عيّنت فيها متغير البيئة. إذا ظهرت لك نافذة الخطأ، فاعلم أن متغير البيئة لم يُعيّن – راجع التعليمات مرة أخرى، وتأكد من صحة تعيين المتغير في واجهة البرنامج التي تُشغّل الكود فيها. إذا رأيت التطبيق يعمل بشكل طبيعي، فكل شيء على ما يرام!

الخطأ الذي يظهر عندما لا يتم تعيين API_KEY بشكل صحيح في البيئة.

التفاعل مع واجهة برمجة التطبيقات (API)

بعد إعداد API_KEY بشكل صحيح، ننتقل إلى التفاعل مع واجهة برمجة التطبيقات نفسها. للقيام بذلك، سننشئ دالة للحصول على جميع العملات. لنسمِّها ()get_currencies. أضف هذه الدالة الجديدة أسفل دالة ()build_gui:

# ...

class CurrencyConverterApp(tk.Tk):
    # ...

    def build_gui(self):
        # ...

    def get_currencies(self):
        response = requests.get(f"{API_URL}/latest/USD")
        data = response.json()
        return list(data["conversion_rates"])

الطريقة المذكورة أعلاه تُرسل طلب GET إلى عنوان URL المُعطى. نُحوّل استجابة JSON المُستقبَلة إلى كائنات بايثون باستخدام دالة ()json. وأخيرًا، نُحوّل معدلات التحويل الواردة في الاستجابة إلى قائمة بايثون.

يمكننا ملء صندوقي المجموعة باستخدام دالة ()get_currencies. أضف الكود التالي أسفل دالة build_gui.

# ...

class CurrencyConverterApp(tk.Tk):
    # ...

    def build_gui(self):
        # ...

        currencies = self.get_currencies()

        self.from_combo["values"] = currencies
        self.from_combo.current(0)

        self.to_combo["values"] = currencies
        self.to_combo.current(0)

يؤدي هذا إلى استدعاء التابع get_currencies للحصول على العملات المتاحة، ثم ملء مربعي المجموعة بالقائمة المرتجعة.

إذا شغّلت التطبيق الآن، فستجد أن مربعات الخيارات تحتوي الآن على العملات المُعادة من واجهة برمجة التطبيقات. لاحظ أننا قمنا بتعيين الدولار الأمريكي كعملة افتراضية، وهو العملة الأولى في القائمة.

من صندوق العملات

إلى مربع المجموعة العملة

التعامل مع تحويل العملات

الخطوة الأخيرة هي تنفيذ تحويل العملات الفعلي، باستخدام القيم المُعادة من واجهة برمجة التطبيقات. للقيام بذلك، سننشئ دالةً للتعامل مع هذا. أضف دالةً جديدةً تُسمى ()convert إلى أسفل فئة CurrencyConverterApp.

# ...

class CurrencyConverterApp(tk.Tk):
    # ...

    def convert(self):
        src = self.from_combo.get()
        dest = self.to_combo.get()
        amount = self.amount_entry.get()
        response = requests.get(f"{API_URL}/pair/{src}/{dest}/{amount}").json()
        result = response["conversion_result"]
        self.result_label.config(text=f"{amount} {src} = {result} {dest}")

في الأسطر الثلاثة الأولى، نحصل على بيانات الإدخال من مربعي التحرير والسرد from_combo وto_combo وحقل amount_entry باستخدام دالة ()get لكل عنصر واجهة مستخدم. يُسمى مربع التحرير والسرد from_combo src، وبيانات مربع التحرير والسرد to_combo dest، وحقل amount_entry amount.

للحصول على تحويل العملات، نُرسل طلب GET إلى واجهة برمجة التطبيقات (API) باستخدام عنوان URL مُنشأ باستخدام بيانات الإدخال. النتيجة المُعادة من واجهة برمجة التطبيقات تكون بصيغة JSON، والتي نُحوّلها إلى قاموس بايثون باستخدام دالة .json(). نأخذ “conversion_result” من الاستجابة ونستخدمها لتحديث تسمية النتيجة بنتيجة التحويل.

الخطوة الأخيرة هي ربط دالة ()convert بزر لتشغيلها. للقيام بذلك، سنضيف وسيطة command إلى تعريف الزر. سيتم تعيين قيمة هذه الوسيطة إلى كائن دالة convert بدون الأقواس.

هكذا سيبدو رمز الزر بعد التحديث:

convert_button = ttk.Button(
            self,
            text="Convert",
            width=20,
            command=self.convert,
        )

هذا الكود يربط الزر بوظيفة ()convert. الآن، عند النقر على زر Convert، سيتم تشغيل هذه الوظيفة.

هذا كل شيء! بهذه اللمسات الأخيرة، اكتمل تطبيق تحويل العملات. يظهر الكود النهائي كاملاً أدناه.

import os
import sys
import tkinter as tk
import tkinter.ttk as ttk
from tkinter import messagebox

import requests

API_KEY = os.getenv("API_KEY")
if API_KEY is None:
    messagebox.showerror("API Key Error", "API_KEY environment variable is not set.")
    sys.exit(1)

API_URL = f"https://v6.exchangerate-api.com/v6/{API_KEY}/"


class CurrencyConverterApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("500x450+300+150")
        self.title("Currency Converter")
        self.resizable(width=0, height=0)
        self.build_gui()

    def build_gui(self):
        self.logo = tk.PhotoImage(file="images/logo.png")
        tk.Label(self, image=self.logo).pack()
        frame = tk.Frame(self)
        frame.pack()

        from_label = ttk.Label(frame, text="From:")
        from_label.grid(row=0, column=0, padx=5, pady=5, sticky=tk.W)

        to_label = ttk.Label(frame, text="To:")
        to_label.grid(row=0, column=1, padx=5, pady=5, sticky=tk.W)

        self.from_combo = ttk.Combobox(frame)
        self.from_combo.grid(row=1, column=0, padx=5, pady=5)

        self.to_combo = ttk.Combobox(frame)
        self.to_combo.grid(row=1, column=1, padx=5, pady=5)

        amount_label = ttk.Label(frame, text="Amount:")
        amount_label.grid(row=2, column=0, padx=5, pady=5, sticky=tk.W)

        self.amount_entry = ttk.Entry(frame)
        self.amount_entry.insert(0, "1.00")
        self.amount_entry.grid(
            row=3, column=0, columnspan=2, padx=5, pady=5, sticky=tk.W + tk.E
        )

        self.result_label = ttk.Label(font=("Arial", 20, "bold"))
        self.result_label.pack()

        convert_button = ttk.Button(
            self, text="Convert", width=20, command=self.convert
        )
        convert_button.pack()

        currencies = self.get_currencies()

        self.from_combo["values"] = currencies
        self.from_combo.current(0)

        self.to_combo["values"] = currencies
        self.to_combo.current(0)

    def get_currencies(self):
        response = requests.get(f"{API_URL}/latest/USD")
        data = response.json()
        return list(data["conversion_rates"])

    def convert(self):
        src = self.from_combo.get()
        dest = self.to_combo.get()
        amount = self.amount_entry.get()
        response = requests.get(f"{API_URL}/pair/{src}/{dest}/{amount}").json()
        result = response["conversion_result"]
        self.result_label.config(text=f"{amount} {src} = {result} {dest}")


if __name__ == "__main__":
    app = CurrencyConverterApp()
    app.mainloop()

شغّل الكود النهائي وستتمكن من تحويل المبالغ بين أيٍّ من العملات المدعومة. على سبيل المثال، حدد الدولار الأمريكي واليورو في خانتي “من” و”إلى”، وأدخل قيمة التحويل 100. سيتصل التطبيق بواجهة برمجة التطبيقات ويُحدّث الملصق بنتيجة التحويل، كما يلي:

تشغيل تطبيق تحويل العملات

أحسنت! لقد أنشأتَ تطبيقًا لتحويل العملات باستخدام بايثون وTkinter. تعلمتَ أساسيات بناء واجهة مستخدم باستخدام عناصر واجهة المستخدم وتخطيطاتها، وكيفية استخدام واجهات برمجة التطبيقات (APIs) لملء عناصر واجهة المستخدم بالقيم، وإجراء عمليات بناءً على مدخلات المستخدم.

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

  • هل تُجري بعض التحويلات بانتظام؟ أضف طريقةً لتطبيق تحويلات العملات “المفضلة” بسرعة على واجهة المستخدم.
  • أضف أزرارًا لتعيين المبالغ القياسية (10، 100، 1000) للتحويل.
  • استخدم طلبات API المتعددة لإظهار القيم التاريخية (منذ يوم واحد، منذ أسبوع واحد، منذ عام واحد) باستخدام واجهة برمجة التطبيقات للبيانات التاريخية.

اكتشاف المزيد من بايثون العربي

اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

Scroll to Top

اكتشاف المزيد من بايثون العربي

اشترك الآن للاستمرار في القراءة والحصول على حق الوصول إلى الأرشيف الكامل.

Continue reading