سويت آله حاسبه ، كالعاده (للجولات ، الكومبيوترات ، اللابتوبات)

الكود :

from turtle import Turtle ,Screen
from math import sqrt
from time import sleep

window = Screen ()
window.setup (690,820)
window.title ('calculator')
window.tracer (0)
window.bgpic ('calculator.png')

sam = Turtle ('circle')
sam.hideturtle ()
sam.penup ()
sam.goto (-290,290)

y_n = False 
numbers = ""

def clear ():
  sam.clear ()
  sam .write ("".join(numbers),font = ('Arial',15,'normal'))
  window.update ()

def press_on (presses):
  global numbers 
  numbers += presses
  clear ()

def equal ():
  global numbers 
  length = 0
  new_numbers = ""
  if numbers :
    for number in numbers :
      if length > 0:
        length -= 1
        continue 
      if number == '×':
        new_numbers += '*'
      elif number == '÷':
        new_numbers += '/'
      elif number == '^':
        new_numbers += '**'
      elif number == '√':
        if numbers [-2] == '√':
          new_numbers += 'error'
          break 
        numb = ""
        dis = False 
        for n in numbers [numbers.index(number)+1::]:
          try:
            numb += str ( int (n))
          except:
            if dis:
              break 
            dis = True 
        length = len(numb)+1
        numb = float (numb)
        new_numbers += str (sqrt (numb))
      else :
        new_numbers += (number)  
    try:
      numbers = str(eval(new_numbers))
    except :
      numbers = "error"
    clear ()

def clicked ( x, y):
  global sam
  global numbers 
  global y_n
  if numbers == 'error':
    numbers = ""
    clear ()
  if -200 > x > -350 and 150 > y > 0:
    press_on ('1')

  elif -50 > x > -200 and 150 > y > 0:
    press_on ('2')

  elif 100 > x > -50 and 150 > y > 0:
    press_on ('3')

  elif -200 > x > -350 and 0 > y > -150:
    press_on ('4')

  elif -50 > x > -200 and 0 > y > -150:
    press_on ('5')

  elif 100 > x > -50 and 0 > y > -150:
    press_on ('6')

  elif -200 > x > -350 and -150 > y > -300:
    press_on ('7')

  elif -50 > x > -200 and -150 > y > -300:
    press_on ('8')

  elif 100 > x > -50 and -150 > y > -300:
    press_on ('9')

  elif -50 > x > -200 and -300 > y > -450:
    press_on ('0')

  elif -200 > x > -350 and -300 > y > -450:
    press_on ('.')

  elif 100 > x > -50 and -300 > y > -450:
    if numbers :
      if not y_n:
        y_n = True 
        deleted = ''
        if numbers [-1] == ' ':
          for x in range (len(numbers)-3):
            deleted += numbers [x]
        else :
          for x in range (len(numbers)-1):
            deleted += numbers [x]
        numbers = deleted
        clear ()
      
      else :
        numbers = ""
        clear ()
      sleep (0.5)
    y_n = False

  elif 200 > x > 100 and 150 > y > 0:
    press_on (' + ')

  elif 300 > x > 200 and 150 > y > 0:
    press_on (' - ')

  elif 200 > x > 100 and 0 > y > -150:
    press_on (' × ')

  elif 300 > x > 200 and 0 > y > -150:
    press_on (' ÷ ')

  elif 200 > x > 100 and -150 > y > -300:
    press_on (' ^ ')

  elif 300 > x > 200 and -150 > y > -300:
    press_on (' √ ')

  elif 200 > x > 150 and -300 > y > -450:
    press_on (')')

  elif 150 > x > 100 and -300 > y > -450:
    press_on ('(')

  elif 300 > x > 200 and -300 > y > -450:
    equal ()

window.onscreenclick (clicked)
window.mainloop ()

الصوره المستعمله :

صور للآله :




8 إعجابات

اللهم بارك كالعادة فنان

3 إعجابات

ممكن شرح للكود من فضلك
الارقام الموجوده في اخر فاكشن ممكن شرحها

4 إعجابات

ماشاء الله عليك,دائما مبدع… لكن ال method mainloop اللي في النهاية ماهي و ماهو دورها؟

3 إعجابات

علي ما أذكر ال mainloop تشبه exitonclick لكن هي تجعل البرنامج شغال حتى وإن ضغط علي الشاشة

4 إعجابات

الأخ أحمد عمل رائع جدا ولكن ظهر عندي هذا الخطأ عندما شغلت الكود

_tkinter.TclError: couldn’t open “calculator.png”: no such file or directory

أظن لأن ملف الصورة ليس عندي؟

3 إعجابات

ياريت تكتب #comment عند كل جزء من الكود تخبر فيه عن الوظيفة التي سيقوم بها هذا الجزء. لكي يكون الكود واضح

3 إعجابات

جميل جداا
\\\\\\

إعجابَين (2)

تحت الكود على طول مكتوب «الصوره المستخدمه» : اضغط عليها مطولا واختار (تنزيل الصوره) ، افتح الصوره (بعد تنزيلها) واضغط على الثلاث نقاط بالاعلى واختر (فتح بستخدام) ثم (نسخ الى التخزين الداخلى) ثم (لصق) وشغل البرنامج وإن شاء الله يشتغل

3 إعجابات

للاسف انا طريقه كتابتى في الكود ما هى افضل شيء لدرجه انى احيانا اخذ بعض الوقت حتى افهم اللي انا كاتبه بس بحاول اكون منظم فى الاكواد القادمه إن شاء الله ولو في شيء بالتحديد بدك اشرحه خبرنى :heart:

إعجابَين (2)

جميل عمل رائع وفنان دائما مبدع نحن بانتظار ابداعاتك القادمة :smiling_face_with_three_hearts:
اتمنى لك اخي احمد التوفيق :rose:

إعجابَين (2)

ما شاء الله رائعة :heart:
ممكن بس تذكرلنا اي هي الميثودز يلي استخدمتها و ما ذكرها مستر ابراهيم بعد لنحاول وحدنا نعملها و جزاك الله خيرا مسبقا

3 إعجابات

اكيد، هذى هى الاشياء اللي انا استخدمتها وما شرحها استاذ إبراهيم

اولا فانكشن (eval)
فانكشن eval مخصصه لحساب الstr

مثال :

math_problem = '54*5//6.5-3'
print (eval (math_problem)) # الناتج :38.0

ويمكنك فهمها اكثر عن طريق هذه الاله الحاسبه المبسطه

from os import system 
while True :
  system ('clear')
  math_problem = input ('Enter a math problem:\n')
  print (f'{math_problem} = {eval (math_problem)}')
  input ('press enter to try again : ')

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

كلمه (try) و (except) هتان الكلمتان من الكلمات الكلمات المحجوزه فى بايثون
وتستخدم try لتجربه شيئ ما وإذا حدث خطأ تنتقل الى except
مثل if و elif و else

مثال :

number = input ('Enter a number')
try :
  print (float(number)*2)
except (ValueError):
  print('this is not a number')

طريقه آخرى:

number = input ('enter a number')
try :
  print (float(number)*2)
except Exception as E:
  print (f'error:{E}')

التعديل على الاله الحاسبه المبسطه

from os import system 
while True :
  system ('clear')
  math_problem = input ('Enter a math problem:\n')
  try :
    print (f'{math_problem} = {eval (math_problem)}')
  except :
    print ('error in math problem !!')
  input ('press enter to try again : ')

ثالثا : الجزر التربيعي
فانكشن (sqrt) من مكتبه (math)
تستخدم فانكشن sqrt لايجاد الجزر التربيعي للرقم

مثال

from math import sqrt
try :
  number = float (input ('enter a number :'))
  print (f'Square root of the number {number} is {sqrt (number)}')
except :
  print ('sorry, but this is not a number ')

رابعا mainloop من مكتبه turtle
يستخدم لبقاء الشاشه مفتوحه دائما الا اذا تم الخروج من البرنامج

مثال :

from turtle import Screen 
window = Screen ()
window.mainloop ()

خامسا وأخيرا (onscreenclick) من مكتبه turtle
تستخدم onscreenclick للتحثث من مكان الضغط بالإصبع او زر الماوس الأيمن وتضع داخلها فانكشن فتعطيهم إحداثيات الضغط بالاكس والواى

وقريبا إن شاء الله بسوي شرح مفصل لهذه الفانكشن على هذا المنتدى

مثال :

from turtle import Turtle ,Screen
 
window = Screen ()
sam = Turtle ()
sam.penup ()
sam.hideturtle ()
sam.goto (0,200)
sam.write ('green',align='center',font=('Ariel',20,'normal'))
sam.goto (0,-200)
sam.write ('red',align='center',font=('Ariel',20,'normal'))

def check (x,y): # فانكشن تاخذ إحداثيّات الإكس و الواي
  if y > 0: # نرى اذا ضغط في نصف الشاشه العلوي
    window.bgcolor ('green')
  elif y < 0: # والا نري اذا ضغط في نصف الشاشه السفلي
    window.bgcolor ('red')

window.onscreenclick (check)
window.mainloop ()

اتمنى تكون فهمت من الشرح ، بالتوفيق

إعجابَين (2)

هذه الارقام هى التى تحدد مكان الضغط بالإصبع او زر الماوس الأيمن عن طريق فانكشن onscreenclick او onclick
مثال :

from turtle import Turtle ,Screen
 
window = Screen ()
sam = Turtle ()
sam.penup ()
sam.hideturtle ()
sam.goto (0,200)
sam.write ('green',align='center',font=('Ariel',20,'normal'))
sam.goto (0,-200)
sam.write ('red',align='center',font=('Ariel',20,'normal'))

def check (x,y): # فانكشن تاخذ إحداثيّات الإكس و الواي
  if y > 0: # نرى اذا ضغط في نصف الشاشه العلوي
    window.bgcolor ('green')
  elif y < 0: # والا نري اذا ضغط في نصف الشاشه السفلي
    window.bgcolor ('red')

window.onscreenclick (check)

while True :
# كود اللعب
  window.update ()

window.exitonclick ()
إعجابَين (2)

شكرا جزيلا لزوقك اخى الكريم :rose:

إعجابَين (2)

شكرا جزيلا اخي بدر دائما تدعم من حولك :rose::tulip:

إعجابَين (2)

شرحك جمييل جدا جزاك الله خيرا
عن جد شكرا لك من اعماق القلب :heart:

3 إعجابات

عفوا اخي الكريم فنحن هنا لنساعد بعضنا بعضا :tulip::heart::tulip:

إعجاب واحد (1)