FA-TOOLS — Header Component

ساخت ماشین‌حساب با پایتون — کد آماده کامل

سلام رفیق برنامه‌نویس! دنبال یه پروژه پایتونی جذاب و کاربردی می‌گردی که هم مهارت‌های پایتونیت رو تقویت کنه و هم یه ابزار خفن بسازی؟ عالیه! ساخت یه ماشین‌حساب با پایتون دقیقاً همون چیزیه که به دردت می‌خوره. این پروژه نه تنها مفاهیم پایه‌ای پایتون رو برات جا میندازه، بلکه یه دید کلی هم از ساخت رابط کاربری (GUI) بهت می‌ده. آماده‌ای که با هم کدش رو بنویسیم و ببینیم چه چالش‌هایی در انتظارمونه؟

نقشه راه: ساخت ماشین‌حساب پایتونی

ساخت ماشین‌حساب با پایتون — کد آماده کامل — تصویر 1

۱. شروع با اصول ✨

ماشین‌حساب ساده خط فرمان (CLI)

۲. ارتقا به GUI 🖥️

استفاده از Tkinter برای رابط گرافیکی

۳. مدیریت خطاها 🛡️

جلوگیری از کرش برنامه و پیام‌های دوستانه

۴. بهبود و توسعه 🚀

ویژگی‌های پیشرفته و زیباسازی

این مقاله یه نقشه کامل برای ساخت ماشین‌حساب پایتونیه. قدم به قدم با هم پیش می‌ریم.

چرا پایتون برای ساخت ماشین‌حساب؟

ساخت ماشین‌حساب با پایتون — کد آماده کامل — تصویر 2

پایتون به خاطر سادگی و خوانایی بالاش، بهترین انتخاب برای شروع پروژه‌های برنامه‌نویسی محسوب میشه. فرقی نمیکنه تازه‌کار باشی یا یه توسعه‌دهنده باتجربه، پایتون ابزارهای قدرتمندی برای ساخت انواع اپلیکیشن‌ها، از اسکریپت‌های کوچک گرفته تا سیستم‌های پیچیده، در اختیار ما قرار میده. ساخت ماشین‌حساب با پایتون هم یه راه عالیه تا هم با مفاهیم پایه‌ای مثل ورودی/خروجی، عملگرها، توابع و شرط‌ها آشنا بشی و هم بتونی نتیجه کارت رو خیلی سریع ببینی. علاوه بر این، می‌تونی برای طراحی‌های بهتر سراغ کدهای CSS هم بری و از قابلیت‌های جاوااسکریپت در وب استفاده کنی.

قدم اول: ساخت یک ماشین‌حساب ساده (CLI)

ساخت ماشین‌حساب با پایتون — کد آماده کامل — تصویر 3

قبل از اینکه وارد دنیای پرزرق و برق رابط‌های کاربری گرافیکی بشیم، بیا یه ماشین‌حساب خیلی ساده بسازیم که توی خط فرمان کار کنه. اینجوری با منطق اصلی عملیات‌ها آشنا میشیم. این بخش بهت کمک می‌کنه تا مفاهیم ورودی گرفتن، انجام عملیات و نمایش نتیجه رو به خوبی درک کنی.

ورودی گرفتن از کاربر

اولین کاری که باید انجام بدیم اینه که از کاربر عددها و نوع عملیات رو بگیریم. برای این کار از تابع input() پایتون استفاده می‌کنیم. یادت باشه که ورودی input() همیشه از نوع رشته (String) هست و باید اون رو به عدد تبدیل کنیم.

انجام عملیات محاسباتی

بعد از گرفتن ورودی‌ها، باید بر اساس عملیاتی که کاربر خواسته (+, -, *, /)، محاسبه رو انجام بدیم. اینجا از ساختار شرطی if/elif/else استفاده می‌کنیم.

کد ماشین‌حساب خط فرمان


def calculator_cli():
    print("ماشین حساب ساده پایتون")
    print("---------------------")

    while True:
        try:
            num1 = float(input("عدد اول را وارد کنید: "))
            operator = input("عملیات (+, -, *, /) را وارد کنید: ")
            num2 = float(input("عدد دوم را وارد کنید: "))

            result = 0
            if operator == '+':
                result = num1 + num2
            elif operator == '-':
                result = num1 - num2
            elif operator == '*':
                result = num1 * num2
            elif operator == '/':
                if num2 == 0:
                    print("خطا: تقسیم بر صفر مجاز نیست!")
                    continue
                result = num1 / num2
            else:
                print("خطا: عملگر نامعتبر است.")
                continue

            print(f"نتیجه: {result}")

        except ValueError:
            print("خطا: لطفاً فقط اعداد معتبر وارد کنید.")
        except Exception as e:
            print(f"خطای ناشناخته: {e}")

        again = input("آیا می‌خواهید دوباره محاسبه کنید؟ (بله/خیر): ").lower()
        if again != 'بله':
            break

# برای اجرا کردن ماشین‌حساب در خط فرمان:
# calculator_cli()

این کد یه ماشین‌حساب پایه رو بهت میده که عملیات جمع، تفریق، ضرب و تقسیم رو انجام میده و خطاهای ساده‌ای مثل تقسیم بر صفر یا ورودی نامعتبر رو هم مدیریت می‌کنه. با فراخوانی تابع calculator_cli() می‌تونی اون رو تست کنی.

قدم دوم: ساخت ماشین‌حساب گرافیکی با Tkinter

حالا که منطق اصلی ماشین‌حساب رو داریم، وقتشه که یه رابط کاربری گرافیکی (GUI) براش بسازیم تا کار کردن باهاش راحت‌تر و جذاب‌تر باشه. Tkinter کتابخانه استاندارد پایتون برای ساخت GUI هست و کار کردن باهاش خیلی ساده‌س. این بخش واقعاً بهت کمک می‌کنه تا بتونی رابط کاربری اپلیکیشن‌های بعدی خودت رو طراحی کنی.

معرفی Tkinter

Tkinter یه فریم‌ورک سبک و کاربردی برای ساخت پنجره‌ها، دکمه‌ها، فیلدهای متنی و سایر عناصر بصریه. یادگیریش آسونه و برای پروژه‌های کوچیک تا متوسط کاملاً مناسبه.

طراحی رابط کاربری و ویجت‌ها

ما به یک فیلد نمایشگر برای اعداد و نتایج، و چندین دکمه برای اعداد (0-9)، عملگرها (+, -, *, /)، اعشار (.), مساوی (=) و پاک کردن (C) نیاز داریم. برای چیدمان ویجت‌ها، از grid استفاده می‌کنیم که شبیه به یک جدول، عناصر رو مرتب می‌کنه. برای اطلاعات بیشتر در مورد طراحی‌های وب ریسپانسیو و همینطور ساختار HTML، می‌تونی به صفحه اصلی ما سر بزنی.

مدیریت رویدادها (Event Handling)

هر بار که کاربر یه دکمه رو فشار میده، یه رویداد اتفاق میفته. ما باید توابعی بنویسیم که به این رویدادها پاسخ بدن و عملیات لازم رو انجام بدن. مثلاً وقتی دکمه “5” فشرده میشه، عدد 5 باید به فیلد نمایشگر اضافه بشه.

کد کامل ماشین‌حساب با Tkinter


import tkinter as tk

class Calculator:
    def __init__(self, master):
        self.master = master
        master.title("ماشین‌حساب پایتونی")
        master.geometry("300x400") # اندازه اولیه پنجره
        master.resizable(False, False) # عدم قابلیت تغییر اندازه
        master.configure(bg='#ecf0f1') # رنگ پس‌زمینه پنجره

        self.expression = ""
        self.input_text = tk.StringVar()

        # فیلد نمایشگر
        self.input_field = tk.Entry(master, textvariable=self.input_text, font=('Arial', 20, 'bold'),
                                    bd=10, insertwidth=4, width=14, borderwidth=4, justify='right',
                                    bg='#ffffff', fg='#2c3e50')
        self.input_field.grid(row=0, column=0, columnspan=4, padx=10, pady=10, ipady=10)
        self.input_field.focus_set()

        # دکمه‌ها
        self.create_buttons()

    def create_buttons(self):
        buttons = [
            '7', '8', '9', '/',
            '4', '5', '6', '*',
            '1', '2', '3', '-',
            'C', '0', '.', '+',
            '='
        ]
        
        # استایل دکمه‌ها
        button_style = {
            'font': ('Arial', 15),
            'width': 5,
            'height': 2,
            'bd': 3,
            'fg': '#2c3e50',
            'bg': '#ffffff',
            'activebackground': '#bdc3c7',
            'relief': 'raised'
        }
        
        # استایل دکمه‌های عملگر
        operator_style = button_style.copy()
        operator_style['fg'] = '#ffffff'
        operator_style['bg'] = '#3498db'
        operator_style['activebackground'] = '#2980b9'

        # استایل دکمه مساوی
        equal_style = button_style.copy()
        equal_style['fg'] = '#ffffff'
        equal_style['bg'] = '#27ae60'
        equal_style['activebackground'] = '#2ecc71'
        equal_style['width'] = 11 # دکمه مساوی دو ستون اشغال میکنه

        # استایل دکمه پاک کردن
        clear_style = button_style.copy()
        clear_style['fg'] = '#ffffff'
        clear_style['bg'] = '#e74c3c'
        clear_style['activebackground'] = '#c0392b'

        row_val = 1
        col_val = 0

        for button_text in buttons:
            if button_text == 'C':
                btn = tk.Button(self.master, text=button_text, command=self.btn_clear, **clear_style)
            elif button_text == '=':
                btn = tk.Button(self.master, text=button_text, command=self.btn_equal, **equal_style)
                btn.grid(row=row_val, column=col_val, columnspan=2, padx=5, pady=5, sticky="nsew") # دو ستون
                col_val += 1 # فقط یک بار برای دکمه =
            elif button_text in ('/', '*', '-', '+'):
                btn = tk.Button(self.master, text=button_text, command=lambda btn=button_text: self.btn_click(btn), **operator_style)
            else:
                btn = tk.Button(self.master, text=button_text, command=lambda btn=button_text: self.btn_click(btn), **button_style)
            
            if button_text != '=': # دکمه = جداگانه مدیریت میشه
                btn.grid(row=row_val, column=col_val, padx=5, pady=5, sticky="nsew")

            col_val += 1
            if col_val > 3:
                col_val = 0
                row_val += 1
                
        # اطمینان از اینکه دکمه مساوی در جای درست قرار گیرد (در ردیف آخر و دو ستون)
        if '=' in buttons:
            equal_btn = self.master.grid_slaves(row=row_val-1, column=2) # پیدا کردن دکمه مساوی قبلی
            if equal_btn and equal_btn[0].cget("text") == '=': # اگر دکمه مساوی پیدا شد
                equal_btn[0].grid_forget() # حذف آن
            
            # بازسازی دکمه مساوی در موقعیت صحیح
            tk.Button(self.master, text='=', command=self.btn_equal, **equal_style).grid(
                row=row_val-1, column=2, columnspan=2, padx=5, pady=5, sticky="nsew"
            )

        # تنظیمات برای ریسپانسیو کردن شبکه
        for i in range(5): # 5 ردیف (0 تا 4)
            self.master.grid_rowconfigure(i, weight=1)
        for i in range(4): # 4 ستون (0 تا 3)
            self.master.grid_columnconfigure(i, weight=1)

    def btn_click(self, item):
        self.expression = self.expression + str(item)
        self.input_text.set(self.expression)

    def btn_clear(self):
        self.expression = ""
        self.input_text.set("")

    def btn_equal(self):
        try:
            result = str(eval(self.expression))
            self.input_text.set(result)
            self.expression = result
        except ZeroDivisionError:
            self.input_text.set("خطا: تقسیم بر صفر!")
            self.expression = ""
        except SyntaxError:
            self.input_text.set("خطا: ورودی نامعتبر!")
            self.expression = ""
        except Exception:
            self.input_text.set("خطا!")
            self.expression = ""

# برای اجرای ماشین‌حساب گرافیکی:
# root = tk.Tk()
# my_calculator = Calculator(root)
# root.mainloop()

این کد یه ماشین‌حساب کاملاً کاربردی با Tkinter بهت می‌ده. کافیه کد رو توی یه فایل پایتون ذخیره کنی و قسمت پایینی (کامنت شده) رو از حالت کامنت خارج کنی تا بتونی اجراش کنی. طراحی دکمه‌ها و استایل‌ها به گونه‌ای هست که حتی در نمایشگرهای مختلف مثل موبایل، تبلت، لپ‌تاپ و حتی تلویزیون (البته با تنظیمات مناسب) هم زیبا و قابل استفاده باشه.

مدیریت خطاها و افزایش پایداری

یه برناامه خوب، برنامه‌ایه که در مقابل خطاهای کاربر مقاوم باشه و به راحتی از کار نیفته. توی ماشین‌حسابمون، چند نوع خطای رایج وجود داره که باید مدیریتشون کنیم:

  • تقسیم بر صفر: این یه خطای ریاضیه که باید جلوی کرش کردن برنامه رو بگیریم و یه پیام مناسب به کاربر نشون بدیم.
  • ورودی نامعتبر: اگه کاربر به جای عدد، حروف یا کاراکترهای عجیب غریب وارد کنه، برنامه باید بتونه تشخیص بده و اخطار بده.
  • خطاهای سینتکسی: مثلاً اگه عبارت “++5” رو وارد کنیم، eval() نمی‌تونه اون رو تفسیر کنه.

توی کد Tkinter از بلوک try-except استفاده کردیم تا این خطاها رو مدیریت کنیم. این کار باعث میشه تجربه کاربری بهتری داشته باشیم و ماشین‌حسابمون پایدارتر عمل کنه.

جدول: مقایسه ماشین‌حساب CLI و GUI

ویژگی ماشین‌حساب CLI
رابط کاربری متنی (خط فرمان)
پیچیدگی توسعه بسیار ساده
کاربرپسندی پایین (نیاز به تایپ دستورات)
قابلیت حمل بالا (فقط نیاز به پایتون)
امکانات بصری صفر

این جدول نشون میده که هر کدوم از این رویکردها مزایا و معایب خودشون رو دارن و انتخاب بینشون به نیاز پروژه بستگی داره.

پیشرفت‌های احتمالی و ویژگی‌های بیشتر

ماشین‌حسابی که با هم ساختیم یه پایه قوی داره. حالا می‌تونیم کلی قابلیت‌های دیگه بهش اضافه کنیم تا پیشرفته‌تر بشه:

  • عملیات‌های پیشرفته: اضافه کردن توابع مثلثاتی (sin, cos, tan)، لگاریتم، توان و ریشه.
  • تاریخچه محاسبات: نگهداری لیستی از محاسبات قبلی تا کاربر بتونه بهشون دسترسی داشته باشه.
  • پشتیبانی از پرانتز: برای محاسبات پیچیده‌تر.
  • حالت علمی: تغییر چیدمان و اضافه کردن دکمه‌های مخصوص حالت علمی.
  • تنظیمات شخصی‌سازی: امکان تغیر رنگ، فونت و اندازه پنجره.
  • پشتیبانی از صفحه کلید: تا کاربر بتونه با استفاده از دکمه‌های کیبورد هم با ماشین‌حساب کار کنه.

این ایده‌ها می‌تونه پروژه ماشین‌حساب شما رو به یه سطح جدید ببره و کدهای آماده و اسنیپت‌های شما رو کامل‌تر کنه.

عیب‌یابی سریع (Troubleshooting)

طبیعیه که توی مسیر کدنویسی به مشکل بخوریم. اینجا چند تا از مشکلات رایج و راه‌حل‌هاشون رو برات آوردم:

مشکل ۱: برنامه Tkinter اجرا نمی‌شود.

علت احتمالی: ماژول tkinter نصب نیست یا به درستی ایمپورت نشده.

راه‌حل:

  • مطمئن شو که پایتون رو با Tkinter نصب کردی. در ویندوز معمولاً خودش نصب میشه. در لینوکس ممکنه نیاز به sudo apt-get install python3-tk داشته باشی.
  • مطمئن شو که خطوط root = tk.Tk()، my_calculator = Calculator(root) و root.mainloop() از حالت کامنت خارج شده‌اند.
  • چک کن که import tkinter as tk در ابتدای فایل وجود داشته باشد.

مشکل ۲: دکمه‌ها در جای خودشان قرار نمی‌گیرند یا اندازه مناسبی ندارند.

علت احتمالی: مشکل در چیدمان grid یا تنظیمات weight.

راه‌حل:

  • مقادیر row، column، columnspan و rowspan را با دقت بررسی کن.
  • مطمئن شو که sticky="nsew" را برای دکمه‌ها تنظیم کرده‌ای تا در سلول خود گسترش یابند.
  • خطوط self.master.grid_rowconfigure(i, weight=1) و self.master.grid_columnconfigure(i, weight=1) را چک کن. اینها برای ریسپانسیو بودن مهم هستند.

مشکل ۳: محاسبات نادرست یا خطای SyntaxError.

علت احتمالی: رشته self.expression به درستی تشکیل نشده یا تابع eval() نمی‌تواند آن را تفسیر کند.

راه‌حل:

  • وقتی دکمه‌ها را می‌فشاری، محتویات self.expression را با یک دستور print() بررسی کن تا ببینی درست تشکیل می‌شود یا نه.
  • مطمئن شو که عملگرها و اعداد به ترتیب صحیح اضافه می‌شوند.
  • ممکن است کاربر عبارتی نامعتبر وارد کرده باشد (مثلاً 5*/2). مدیریت این موارد در except SyntaxError انجام می‌شود.

حرف آخر و یه پیشنهاد دوستانه

ساخت یه ماشین‌حساب با پایتون، چه از نوع خط فرمان و چه گرافیکی، یه پروژه عالی برای یادگیری و تقویت مهارت های برنامه‌نویسیه. این پروژه بهت نشون می‌ده که چطور میشه یه ایده ساده رو از مفهوم اولیه تا یه محصول کاربردی توسعه داد. یادت باشه که بهترین راه برای یادگیری، تمرین و تجربه کردن چیزهای جدیدیه. پس اگه تو هم به ساخت سایت وردپرسی و یا سایر اسنیپت‌های برنامه‌نویسی علاقه داری، همین الان دست به کار شو!

اگه سوالی داری یا نیاز به راهنمایی بیشتری داری، دریغ نکن. می‌تونی با ما تماس بگیری: 09202232789

منتظر چی هستی؟

همین الان کدها رو امتحان کن و پروژه ماشین‌حسابت رو شروع کن!
برای دیدن ابزارهای برنامه‌نویسی و اسنیپت‌های بیشتر، به fa-tools.ir سر بزن.

همین حالا از ابزارهای ما دیدن کن!

Table of Contents

آخرین نوشته‌ها