يُسهّل Tkinter، وهو مجموعة أدوات واجهة المستخدم الرسومية المُدمجة في بايثون، إنشاء تطبيقات سطح المكتب التفاعلية. وتُعدّ مهمة فتح نوافذ جديدة استجابةً لأفعال المستخدم، مثل نقرات الأزرار، من المهام الشائعة. وتُفصّل هذه المقالة كيفية إنشاء هذه النوافذ الجديدة وإدارتها بكفاءة، مع تغطية مختلف السيناريوهات وأفضل الممارسات.
جدول المحتويات
- إنشاء النافذة الرئيسية والزر
- تخصيص النوافذ الجديدة
- إدارة النوافذ المتعددة
- تقنيات متقدمة: النمطية ونقل البيانات
- الخلاصة
إنشاء النافذة الرئيسية والزر
لنبدأ باستيراد Tkinter وإنشاء نافذة رئيسية أساسية مع زر يحفز إنشاء نافذة جديدة:
import tkinter as tk
def create_new_window():
new_window = tk.Toplevel(root)
new_window.title("نافذة جديدة")
new_window.geometry("300x200")
root = tk.Tk()
root.title("التطبيق الرئيسي")
button = tk.Button(root, text="فتح نافذة جديدة", command=create_new_window)
button.pack(pady=20)
root.mainloop()
يُعرّف هذا الكود دالة create_new_window
التي تستخدم tk.Toplevel(root)
لإنشاء نافذة جديدة من المستوى الأعلى. يضمن وسيط root
ارتباط النافذة الجديدة بالتطبيق الرئيسي. يُعيّن geometry
أبعادها. يربط سمة command
للزر بهذه الدالة. يُشغّل root.mainloop()
حلقة أحداث Tkinter.
تخصيص النوافذ الجديدة
يمكن تخصيص النافذة الجديدة، كونها نافذة Tkinter قياسية، على نطاق واسع. أضف تسميات أو حقول إدخال أو أي أدوات واجهة مستخدم أخرى لإنشاء الواجهة المرغوبة:
import tkinter as tk
def create_new_window():
new_window = tk.Toplevel(root)
new_window.title("نافذة جديدة")
new_window.geometry("300x200")
label = tk.Label(new_window, text="هذه نافذة مُخصّصة!")
label.pack(pady=20)
entry = tk.Entry(new_window)
entry.pack(pady=10)
# ... (بقية الكود من المثال السابق)
يضيف هذا المثال المُحسّن تسمية وحقل إدخال. للحصول على تخطيطات أكثر تطوراً، ضع في اعتبارك استخدام .grid()
أو .place()
بدلاً من .pack()
لتحقيق تحكم أفضل في وضع الأدوات.
إدارة النوافذ المتعددة
عند التعامل مع العديد من النوافذ، يصبح تتبعها أمراً بالغ الأهمية. يمكن لقائمة بسيطة تخزين مراجع لكل نافذة:
import tkinter as tk
windows = []
def create_new_window():
new_window = tk.Toplevel(root)
new_window.title(f"نافذة جديدة {len(windows) + 1}")
new_window.geometry("300x200")
windows.append(new_window)
new_window.protocol("WM_DELETE_WINDOW", lambda: close_window(new_window))
def close_window(window):
windows.remove(window)
window.destroy()
# ... (بقية الكود)
تخزّن قائمة windows
كل نافذة جديدة. يعرض العنوان الآن رقم النافذة. تُزيل دالة close_window
النافذة بأمان من القائمة وتُدمّرها. تضمن طريقة protocol
التنظيف المناسب عند إغلاق النافذة.
تقنيات متقدمة: النمطية ونقل البيانات
النمطية: لإنشاء حوارات نمطية (النوافذ التي تمنع التفاعل مع التطبيق الرئيسي حتى يتم إغلاقها)، استخدم tk.Toplevel
مع تعيين خيار transient
إلى root
واعتبر استخدام grab_set()
على الحوار لضمان أنه النافذة القابلة للتركيز الوحيدة.
نقل البيانات: يمكن إجراء تبادل البيانات بين النوافذ باستخدام طرق مختلفة:
- المتغيرات العالمية: بسيطة، لكنها قد تؤدي إلى مشاكل في التطبيقات الأكبر حجماً.
- وسائط الدوال: تمرير البيانات مباشرةً إلى دالة إنشاء النافذة الجديدة.
- متغيرات Tkinter: استخدام
StringVar
،IntVar
، إلخ، لربط البيانات وتحديثها بكفاءة.
الخلاصة
إنشاء وإدارة النوافذ الجديدة في Tkinter أمر قابل للإدارة باستخدام tk.Toplevel
. تُحسّن التقنيات الفعالة للتعامل مع النوافذ المتعددة ونقل البيانات تنظيم التطبيق وقابلية صيانته. تذكّر باستخدام مديري التخطيط المناسبين (.grid()
، .place()
) واعتبر استخدام حوارات نمطية لتفاعلات محددة. جرّب وكيّف نهجك ليناسب احتياجات تطبيقك.