في البداية، يشرفني أن أساعدك في تطوير وتحسين الكود الخاص بك في استخدام مكتبة Tkinter في لغة Python 3.5. سأقوم بتوجيهك عبر خطوات إجرائية لتحقيق الأهداف التي ذكرتها في استفسارك.
لتحقيق حركة الكرات بسرعات مختلفة وأحجام متنوعة، يمكنك تحديد سرعة وحجم عشوائي لكل كرة أثناء إنشاء القائمة self.balls
. يمكنك استخدام وظيفة random.uniform
للحصول على قيم عشوائية بين نطاقين. على سبيل المثال:
pythonspeed = random.uniform(1, 5) # قيم سرعة عشوائية بين 1 و 5
size = random.randint(10, 30) # حجم عشوائي بين 10 و 30
self.balls.append([ballObjectId, x1, y1, speed, size])
ثم، يمكنك تكييف دورة الرسم (animate
) لتحديث إحداثيات الكرات بناءً على السرعة، وضبط حجم الكرة بناءً على الحجم:
pythondef animate(self):
for i in range(1000):
for i in range(len(self.balls)):
self.myCanvas.delete(self.balls[i][0])
self.balls[i][1] += random.randint(-2, 2)
self.balls[i][2] += self.balls[i][3] # تحديث بناءً على السرعة
x1, y1 = self.balls[i][1], self.balls[i][2]
x2, y2 = x1 + self.balls[i][4], y1 + self.balls[i][4] # تحديث بناءً على الحجم
self.balls[i][0] = (self.myCanvas.create_oval(x1, y1, x2, y2, fill=''))
self.myCanvas.update()
بالقيام بهذه التغييرات، ستلاحظ أن الكرات الآن تتحرك بسرعات مختلفة وتظهر بأحجام متنوعة. لتحقيق عودة الكرات من الأعلى إلى الأسفل، يمكنك تحديد حد أدنى لإحداثيات y وإعادة تعيين الكرة إلى الأسفل عندما تتجاوز هذا الحد:
pythondef animate(self):
for i in range(1000):
for i in range(len(self.balls)):
self.myCanvas.delete(self.balls[i][0])
self.balls[i][1] += random.randint(-2, 2)
self.balls[i][2] += self.balls[i][3]
# إعادة تعيين الكرة للأسفل عندما تتجاوز الحد الأدنى
if self.balls[i][2] > 400:
self.balls[i][2] = random.randint(-30, -10)
x1, y1 = self.balls[i][1], self.balls[i][2]
x2, y2 = x1 + self.balls[i][4], y1 + self.balls[i][4]
self.balls[i][0] = (self.myCanvas.create_oval(x1, y1, x2, y2, fill=''))
self.myCanvas.update()
بهذه الطريقة، يمكنك تحقيق الحركة المستمرة للكرات من الأعلى إلى الأسفل. أتمنى أن يساعدك ذلك في تحسين البرنامج وتحقيق المتطلبات التي طلبتها.
المزيد من المعلومات
بالطبع، دعنا نستكشف بعض المفاهيم والتفاصيل الإضافية المتعلقة بالكود الخاص بك وكيفية تطويره بشكل أفضل.
أولاً، يمكننا مناقشة بعض التحسينات في هيكل الكود وكتابته. لتحسين قابلية الصيانة والقراءة، يمكنك تنظيم الكود بشكل أفضل وتقسيمه إلى وظائف فرعية. على سبيل المثال، يمكنك إنشاء وظيفة لإضافة الكرات ووظيفة لتحديث حركتها. هذا يمكن أن يجعل الكود أكثر تنظيمًا وفهمًا. إليك مثال:
pythonimport time
import random
from tkinter import *
class Box(Frame):
def __init__(self):
Frame.__init__(self)
self.pack()
self.master.title("Canvas animation")
self.master.geometry("400x400") # size in pixels
label = Label(self, text=" Bubbles ")
label.grid(row=1, column=1)
self.myCanvas = Canvas(self)
self.myCanvas.grid(row=2, column=1)
self.myCanvas.config(bg='cyan', height=350, width=350)
self.balls = [] # list of balls belongs to the Box
self.add_balls()
self.animate()
def add_balls(self):
for i in range(35):
x1, y1 = random.randint(35, 315), random.randint(35, 315)
speed = random.uniform(1, 5)
size = random.randint(10, 30)
ball_object_id = self.myCanvas.create_oval(x1, y1, x1 + size, y1 + size, fill='')
self.balls.append([ball_object_id, x1, y1, speed, size])
def update_ball_position(self, ball):
self.myCanvas.delete(ball[0])
ball[1] += random.randint(-2, 2)
ball[2] += ball[3]
if ball[2] > 400:
ball[2] = random.randint(-30, -10)
x1, y1 = ball[1], ball[2]
x2, y2 = x1 + ball[4], y1 + ball[4]
ball[0] = self.myCanvas.create_oval(x1, y1, x2, y2, fill='')
def animate(self):
for _ in range(1000):
for ball in self.balls:
self.update_ball_position(ball)
self.myCanvas.update()
def main():
Box().mainloop()
if __name__ == "__main__":
main()
هذا الشكل يجعل الكود أكثر هيكلة ويجعله أسهل للصيانة والفهم.
ثانيًا، يمكنك تحسين المظهر البصري للكرات عن طريق تعيين ألوان مختلفة أو استخدام صور للكرات بدلاً من أشكال دائرية بسيطة. يمكنك أيضًا استكشاف خيارات إضافية في مكتبة Tkinter لتحسين الرسومات والتفاعلية.
أتمنى أن تكون هذه الإضافات مفيدة لك، وإذا كنت بحاجة إلى أي مساعدة إضافية أو استفسارات، فلا تتردد في طرحها!