لحل مشكلتك، يبدو أن الشكل مشغول ولا يستجيب للنقرات بسبب الحلقة التي تقوم بتمرير الشكل. بمجرد دخول الحلقة، يتم فتح شكل جديد بسرعة وهذا يؤدي إلى استهلاك موارد الكمبيوتر ويجعل الشكل مشغولًا.
لحل هذه المشكلة، يمكنك تعديل الشيفرة بحيث يتم إنشاء الشكل مرة واحدة خارج الحلقة، وثم إعادة استخدامه في كل تكرار من الحلقة. وبهذه الطريقة، سيتم فتح الشكل مرة واحدة فقط ويمكنك الحصول على الإحداثيات بحرية.
فيما يلي التعديلات التي يجب إجراؤها على الشيفرة:
pythonimport matplotlib.pyplot as plt
# تحديد الدالة onclick قبل دخول الحلقة
def onclick(event):
global ix, iy, coords, cid, fig
ix, iy = event.xdata, event.ydata
coords.append((ix, iy))
if len(coords) == 1:
fig.canvas.mpl_disconnect(cid)
plt.close()
# تحديد عدد الصور
nb_images = 5
# تهيئة الشكل مرة واحدة قبل الحلقة
plt.ion()
fig = plt.figure()
# الحلقة
for j in range(nb_images):
coords = []
# Affichage
plt.imshow(img[j], cmap="gray")
plt.draw()
# ربط الدالة onclick بالشكل
cid = fig.canvas.mpl_connect('button_press_event', onclick)
# انتظار النقرة
plt.show()
print(coords[0][0], coords[0][1])
# تحرير الشكل بعد الانتهاء من النقر
plt.close()
بهذا التعديل، سيتم إنشاء الشكل مرة واحدة قبل الحلقة، ثم يتم استخدامه في كل تكرار من الحلقة. ستتمكن من النقر على الصورة في كل مرة والحصول على الإحداثيات بدون مشاكل.
المزيد من المعلومات
بالطبع، سأوفر لك المزيد من المعلومات حول الكود والطريقة التي يتم فيها استخدامه للحصول على إحداثيات نقر الماوس على الصور.
الكود الذي قدمته يبدو أنه يستخدم مكتبة matplotlib في Python لعرض صور والسماح للمستخدم بالنقر عليها للحصول على إحداثيات النقر. الهدف من الكود هو عرض سلسلة من الصور (عدد الصور محدد مسبقًا بواسطة nb_images
) وتسجيل إحداثيات النقر على كل صورة.
لفهم الكود بشكل أعمق، إليك شرح لكل جزء:
-
تعريف الدالة
onclick
: هذه الدالة تقوم بتسجيل إحداثيات النقر عندما ينقر المستخدم على الصورة. تستخدم متغيرات عالمية لتخزين إحداثيات النقر وقائمةcoords
لتخزين جميع النقرات. -
تهيئة الشكل: يتم تهيئة الشكل الرسومي باستخدام
plt.figure()
مرة واحدة قبل دخول الحلقة. هذا يضمن أن يتم إنشاء الشكل مرة واحدة فقط ويتم إعادة استخدامه في كل تكرار من الحلقة. -
الحلقة: يتم استخدام حلقة
for
للتكرار عبر كل الصور المراد عرضها. داخل كل تكرار، يتم عرض الصورة باستخدامplt.imshow()
ومن ثم ربط الدالةonclick
بحدث النقر على الصورة باستخدامfig.canvas.mpl_connect()
. -
انتظار النقرة والإخراج: بمجرد عرض الصورة، ينتظر الكود حدوث النقرة على الصورة. بعد النقرة، يتم طباعة إحداثيات النقرة وإغلاق الشكل.
باستخدام هذا الكود، يمكنك الآن عرض الصور والحصول على إحداثيات النقر عليها بسهولة. يمكنك أيضًا توسيع الكود لتنفيذ المزيد من الإجراءات بناءً على إحداثيات النقر مثل تحليل الصورة أو الرسم عليها أو أي استخدام آخر يناسب احتياجاتك.