برنامه دخل و خرج: اولین برنامه جدی که نوشتم

۱۴۰۳/۸/۷ ۵ دقیقه پایتون

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

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

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

برنامه مدیریت دخل و خرج

سالها گذشت و سال ۹۶ بود. تازه شروع به تدریس کرده بودم. کنجکاو بودم که ببینم که چقدر درآمد دارم و چقدر خرج می کنم.

هدف من این بود برنامه ای بنویسم که بتونم در اون دسته بندی های مختلف برای درآمد و مخارج داشته باشم. و همچنین نموداری داشته باشم که نشون بده که هر دسته بندی چند درصد از موجودی رو مصرف کرده.

برنامه به صورت کلی از دو بخش اصلی تشکیل شده بود:

  • واسط گرافیکی:‌ ظاهر برنامه بخشی که به من اجازه میداد داده ها رو وارد کنم.
  • دیتا بیس: بخشی که به من اجازه میداد داده های وارد شده ذخیره و از اونها استفاده بکنم.

صفحه اول برنامه

صفحه اول برنامه

در شکل بالا صفحه اول برنامه رو می بینیم. در این صفحه یک سری اطلاعاتی رو وارد می کنیم و بعد از فشردن دکمه Save اطلاعات در دیتابیس ذخیره میشه. افزودن درآمد باعث میشه تا موجودی افزایش پیدا کنه.

پکیج Tkinter

پایتون یک پکیج داره به نام Tkinter. این پکیج به شما اجازه میده برنامه ‌های گرافیکی باهاش پیاده سازی کنید. برنامه گرافیکی یا Graphical User Interface (GUI) به برنامه هایی گفته میشه که واسط کاربری اونها به صورت گرافیکی هست. این برنامه ها معمولا دارای منو، دکمه، لیست باکس و سایر ویجیت های گرافیکی هستن. این پکیج به همراه پایتون روی کامپیوتر شما نصب میشه و لازم نیست جداگانه نصب بشه.

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

فراموش نکنیم وقتی داشتم این برنامه رو می نوشتم چیزی به نام ChatGPT وجود نداشت.

ماژول sqlite

برای اینکه اطلاعات رو در دیتابیس ذخیره کنم از ماژول sqlite استفاده کردم. الان که دارم بهش فکر می کنم میبینم که حتی نیازی به دیتابیس نبود می تونستم از فایل csv یا حتی json استفاده کنم. واسه کارهای ساده واقعا نیازی به استفاده از دیتابیس نیست میشه از فایل استفاده کرد مخصوصا که پروژه یک پروژه شخصی بود. قرار نبود که اپلیکشن وب چندین میلیون دلاری بشه.

هر چند باید اینجا به این نکته اشاره کنم که sqlite اصلا دیتابیس واقعی نیست. بلکه ماژولی هست که به صورت فایل اطلاعات رو ذخیره میکنه. یعنی در نهایت شما باز فایل دارید. هر چند فایل در فرمت باینری هست نه در فرمت متنی مثل csv یا json ولی در نهایت یک فایل هست. sqlite به ما اجازه میده که ساختار دیتابیس یعنی جدول و ارتباط بین جداول رو داشته باشیم اما اطلاعات در قالب فایل مدیریت میشه که باعث میشه پرفورمنس پایینی داشته باشیم. گفته میشه که sqlite برای انجام دادن پروژه های بزرگ مناسب نیست اما برای کارهای ساده کار راه انداز هست.

فرآیند نوشتن برنامه

وقتی شروع کردم به نوشتن برنامه کدهای خیلی کثیف و تکراری نوشتم ولی هر چقدر که جلو می رفتم بیشتر یاد می گرفتم و برنامه شبیه برنامه میشد و کارهایی که می خواستم رو انجام میداد و رفته رفته پیشرفته میشد. در اون لحظه اصلا به این فکر نمی کردم که کد خوبی بنویسم به این فکر نمی کردم که دیگران چی فکر می کنن یک هدف بیشتر نداشتم و اون این بود که برنامه ای بنویسم تا کارهایی که می خوام رو انجام بده.

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

یکی از جذابترین بخش های این پروژه این بود که باید حساب می کردم که هر دسته بندی چند درصد از کل هزینه‌ها رو به خودش اختصاص داده. و همینطور این درصدها باید به صورت نمودار هم به نمایش در می اومد. که می تونیم تو شکل زیر ببینیم.

نمایش درصد از درآمد هر بخش

نمایش درصد از درآمد هر بخش

جمع بندی

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

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

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

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

کد برنامه در گیت هاب