
سلحفاة بايثون الرسم الحر باستخدام الفأرة كود بايثون جاهز
سلحفاة بايثون الرسم الحر باستخدام الفأرة كود بايثون جاهز
سلحفاة بايثون الرسم الحر باستخدام الفأرة في هذا الكود سوف نستخدم مكتبة turtle للرسم الحر وحفظ احداثيات الرسم في ملف للاستخدام لاحقاً او للتعديل.
سوف اشرح الدوال الرئيسية لتتمكن من التعديل علية
في البداية قمنا بتفعيل تتبع حركة الفأرة وتتبع النقرات كالتالي
screen.onmouseover(tt)
screen.onmovemode('false')
screen.onclick(startd)
screen.listen()
turtle.done()
دالة onmouseover ليست موجودة في مكتبة turtle الاصلية ولكنها موجوده في نظامنا وهي لتفعيل وضع تتبع حركة الماوس وارجاع الاحداثيات مع كل حركة.
دالة onmovemode ايضاً موجودة في نظامنا فقط قمنا باضافتها لتفعيل وايقاف وضع تتبع احداثيات الفأرة وتاخذ براميتر واحد من النوع النصي ، لبداء ارجاع احداثيات الفأرة تكون القيمة 'true' ولايقاف تتبع الحركة تكون القيمة 'false'.
ودالة onclick هي اساسية في مكتبة turtle وهي لتتبع نقرات الفأرة ودالة listen اساسية ايضاً وهي لبداء الاستماع او تتبع الحركة والازرار.
بعد ان قمنا باعداد تتبع الاحداث كلما تحرك الماوس داخل منطقة الرسم سوف يتم ارسال الاحداثيات x, y الي الدالة StartToEnd وهي مسؤلة عن بداء الرسم مع حركة الماوس تبعاً للاحداثيات الواردة من دالة onmouseover.
def StartToEnd(x, y):
global part
if drawnow:
part.append([x,y])
turtle.goto(x, y)
داخل الدالة StartToEnd قمت بالتصريح عن المتغير العام part لتخزين احداثيات المسار ثم التحقق اذا كان متح لنا الرسم ام لا من خلال متغير drawnow اذا كانت قيمة المتغير True تبداء السلحفاة بملاحقة الماوس ورسم خط ، وتخزين الاحداثيات في القائمة part.
سوف نتحكم في بداء ,وتشغيل الدالة والرسم من خلال نقرات الفأرة عند النقر يبداء الرسم وعند النقر مرة اخري ينتهي الرسم وهذه هي وظيفة الدالة start:
def start(x, y):
global drawnow
global part
if candraw:
if drawnow:
screen.onmovemode('false')
drawnow = False
turtle.penup()
savepart(part)
#drawpart(part, "green")
part = []
else:
drawnow = True
screen.onmovemode('true')
turtle.goto(x,y)
turtle.pendown()
في بداية الدالة صرحت عن المتغيرين العالميين drawnow , part حتي نستطيع تعديل قيمتهم من داخل الدالة. دالة الشرط الاولي تستخدم فقط مع السطر المعلق # يمكنك ازالة التعليق لتعرف كيف يعمل.
دالة الشرط الثانية اذا كانت قيمة متغير drawnow = True : هذا يعني انها النقرة الثانية ولذلك سوف نقوم بايقاف تتبع حركة الفأرة ثم تعديل قيمة متغير drawnow الي False.
ثم رفع قلم السلحفاة استعداد لنقطة البداية الجديدة ثم ارسال قائمة الاحداثيات part الي الدالة savepart وهي المسؤلة عن حفظ الاجزاء داخل الملف parts.js في صورة نص json ثم تفريق قيمة القائمة part استعداد للاجزاء الجديدة.
اذا كانت قيمة متغير drawnow = False : هذا يعني انها النقرة الاولي للماوس لذلك سوف نجعل قيمة المتغير drawnow = True ، ثم تفعيل وضع تتبع الحركة ثم ارسال السلحفاة الي احداثيات النقرة ثم انزال القلم وسوف تبداء دالة StartToEnd في عملها.
لاحظ انه يجب النقر لتفعيل الرسم والنقر مرة اخري لانهاء الرسم.
دالة savepart
def savepart(part):
try:
loadf = json.loads(open('parts.js', 'r').read())
except:
loadf = {}
loadf[len(loadf)+1] = part
savef = json.dumps(loadf)
f = open('parts.js', 'w')
f.write(savef)
f.close()
تمتلك الدالة براميتر واحد وهو part وهو من نوع القائمة list [] احدي انواع التسلسل.
في البداية نحاول فتح الملف وتحويلة الي object كائن بايثون وفي حالة حدوث خطأ يتم انشاء كائن فارغ {}.
بعد ذلك نقوم باضافة القائمة الجديدة الي الكائن مع رقم فهرس اكبر من اخر رقم فهرس برقم واحد : loadf[len(loadf)+1] = part .
ثم نقوم بتحويل كائن بايثون الي نص json ثم نفتح الملف للكتابة ونقوم بكتابة نص json بداخلة ثم نغلق الملف.
بعد ذلك يمكن استخدام دالة drawfromfile لرسم الاجزاء في اي وقت من الملف parts.js
def drawfromfile():
screen.bgpic("https://img.freepik.com/free-vector/vector-black-minimal-aesthetic-grid-pattern-background_53876-117155.jpg?w=740&t=st=1670639867~exp=1670640467~hmac=06085cd7558bec8799105db479e31904a4e4a86ba44f034413b5b50d72317511")
try:
f = json.loads(open('parts.js', 'r').read())
except:
f = {}
turtle.speed(9999999999999)
for i in range(1, len(f)+1):
part = f[str(i)]
turtle.goto(part[0][0], part[0][1])
turtle.pendown()
for y in range(1, len(part), 10):
turtle.tracer(1)
turtle.goto(part[y][0], part[y][1])
turtle.update()
turtle.penup()
#drawfromfile()
بعد رسم الاجزاء قم بتفعيل السطر الاخير drawfromfile() ثم اعد التشغيل.