آموزش ساخت ساعت عقربهای آنالوگ با زبان پایتون و کتابخانه Tkinter
آموزش ساخت ساعت عقربهای آنالوگ با زبان پایتون و کتابخانه Tkinter
آیا تا به حال فکر کردهاید که چگونه یک ساعت عقربهای آنالوگ را با زبان برنامهنویسی پایتون طراحی کنید؟ در این آموزش عملی، قصد داریم به شما نشان دهیم که با استفاده از کتابخانه قدرتمند Tkinter (ابزار استاندارد ساخت رابط کاربری گرافیکی در پایتون) یک ساعت کامل آنالوگ طراحی کنید. این پروژه برای هنرجویان سطح متوسط پایتون بسیار مناسب است و مفاهیم مهمی مانند رسم اشکال گرافیکی، محاسبات ریاضی (مختصات قطبی) و کار با زمان سیستمی را پوشش میدهد.
در آموزشگاه کامپیوتر راهکار تبریز، ما بر این باوریم که بهترین روش یادگیری برنامهنویسی، انجام پروژههای عملی و ملموس است.
چرا پروژه ساعت عقربهای برای یادگیری پایتون مفید است؟
· آشنایی با مفاهیم گرافیکی و GUI: یادگیری نحوه کار با Canvas در Tkinter برای رسم خطوط، دایرهها و متون.
· کاربرد توابع مثلثاتی: تبدیل زاویه عقربهها به مختصات x و y با استفاده از sin و cos.
· مدیریت زمان و حلقه رویداد: استفاده از متد after برای بهروزرسانی پویای صفحه بدون متوقف کردن برنامه.
· ساختار ماژولار: آموزش نحوه کدنویسی تمیز و قابل فهم با استفاده از توابع.
· کاربرد توابع مثلثاتی: تبدیل زاویه عقربهها به مختصات x و y با استفاده از sin و cos.
· مدیریت زمان و حلقه رویداد: استفاده از متد after برای بهروزرسانی پویای صفحه بدون متوقف کردن برنامه.
· ساختار ماژولار: آموزش نحوه کدنویسی تمیز و قابل فهم با استفاده از توابع.
حل رایجترین مشکل پروژه ساعت: ماندن اثر عقربهها روی صفحه
یکی از چالشهایی که اکثر برنامهنویسان مبتدی در این پروژه با آن مواجه میشوند، باقی ماندن رد عقربههای قبلی روی صفحه است. در تصویر زیر کد مشکلدار را میبینید که با هر تیک ثانیه، یک عقربه جدید رسم میشود بدون اینکه عقربه قبلی پاک شود.
راهکار طلایی راهکار تبریز:
برای حل این مشکل، باید به جای رسم عقربه جدید روی عقربه قبلی، هر بار تمام اجزای متغیر ساعت را کاملاً پاک کرده و دوباره رسم کنیم. دو روش استاندارد برای این کار وجود دارد:
روش حرفهای (ذخیره شناسه آیتمها):
شناسه (ID) هر عقربه را در یک لیست ذخیره کرده و در هر بهروزرسانی، همه آنها را یکجا حذف میکنیم.
import tkinter as tk
import math
from datetime import datetime
WIDTH = 400
HEIGHT = 400
CENTER_X = WIDTH // 2
CENTER_Y = HEIGHT // 2
RADIUS = 150
root = tk.Tk()
root.title("ساعت عقربهای")
canvas = tk.Canvas(root, width=WIDTH, height=HEIGHT, bg="white")
canvas.pack()
# متغیرهای نگهداری شناسه عقربهها
hand_ids = []
def draw_clock_face():
canvas.create_oval(
CENTER_X - RADIUS, CENTER_Y - RADIUS,
CENTER_X + RADIUS, CENTER_Y + RADIUS,
width=4
)
for i in range(1, 13):
angle = math.radians(i * 30 - 90)
x = CENTER_X + int((RADIUS - 25) * math.cos(angle))
y = CENTER_Y + int((RADIUS - 25) * math.sin(angle))
canvas.create_text(x, y, text=str(i), font=("Arial", 14, "bold"))
def draw_hand(angle_deg, length, width, color):
angle = math.radians(angle_deg - 90)
x = CENTER_X + int(length * math.cos(angle))
y = CENTER_Y + int(length * math.sin(angle))
return canvas.create_line(CENTER_X, CENTER_Y, x, y, fill=color, width=width)
def update_clock():
global hand_ids
# پاک کردن عقربههای قبلی
for hid in hand_ids:
canvas.delete(hid)
hand_ids.clear()
now = datetime.now()
hour = now.hour % 12
minute = now.minute
second = now.second
hour_angle = (hour + minute / 60) * 30
minute_angle = (minute + second / 60) * 6
second_angle = second * 6
# رسم عقربهها و ذخیره شناسه آنها
h1 = draw_hand(hour_angle, RADIUS * 0.5, 6, "black")
h2 = draw_hand(minute_angle, RADIUS * 0.75, 4, "blue")
h3 = draw_hand(second_angle, RADIUS * 0.9, 2, "red")
center_dot = canvas.create_oval(CENTER_X - 5, CENTER_Y - 5, CENTER_X + 5, CENTER_Y + 5, fill="black")
hand_ids = [h1, h2, h3, center_dot]
root.after(1000, update_clock)
draw_clock_face()
update_clock()
root.mainloop()