[โค้ดพร้อมใช้] มาสร้างแอปจับเวลาด้วย Python กันเถอะ! (ใช้งานโมดูล time)
"จะเริ่มเขียนโปรแกรมจากตรงไหนดี?" "อ่านหนังสือแล้วก็เจอแต่ข้อผิดพลาดจนท้อใจ..."
เมื่อไม่กี่เดือนก่อน ผมก็รู้สึกแบบเดียวกันเป๊ะๆ เลยครับ ผมเริ่มจากความรู้เป็นศูนย์ ลองผิดลองถูกโดยใช้ AI ช่วย จนตอนนี้สามารถสร้างเว็บไซต์ 2 แห่งได้ด้วยตัวเองแล้ว
ในบทความนี้ เป้าหมายหลักของผมคือการให้ทุกคนได้สัมผัสกับความสนุกของการ "ทำให้มันทำงานได้" จากมุมมองของคนที่เป็นมือใหม่เหมือนกัน ครั้งนี้เราจะใช้ "พ่อมดแห่งเวลา" ที่มีมาให้ใน Python อยู่แล้ว นั่นคือโมดูล `time` เพื่อสร้างแอปจับเวลาและนาฬิกาปลุกที่ง่ายอย่างน่าทึ่ง
เรื่องทฤษฎียากๆ เอาไว้ทีหลัง! ก่อนอื่นลองคัดลอกโค้ดไปวาง แล้วสัมผัสประสบการณ์ที่คอมพิวเตอร์ของคุณจะกลายเป็นเครื่องจับเวลาได้เลย!
ขั้นตอนที่ 1: มาลองสัมผัสด้วยตัวเอง! โปรแกรมสุดง่ายที่รอแค่ 3 วินาที
สิบปากว่าไม่เท่าตาเห็น ก่อนอื่นเรามาลองสั่งให้คอมพิวเตอร์ "รอแค่ 3 วินาที" ด้วยโปรแกรมจับเวลาที่ง่ายที่สุดในโลกกันดีกว่า คัดลอกโค้ดด้านล่างแล้วลองรันในสภาพแวดล้อม Python ของคุณได้เลย
# คาถาสำหรับใช้ 'เวทมนตร์แห่งเวลา'
import time
print("เริ่มจับเวลา")
# หยุดการทำงานของโปรแกรมเป็นเวลา 3 วินาที
time.sleep(3)
print("ผ่านไป 3 วินาทีแล้ว! ทำได้ดีมาก")
เมื่อรันโปรแกรม จะมีข้อความ "เริ่มจับเวลา" แสดงขึ้นมา จากนั้นจะหยุดไปชั่วครู่ แล้วข้อความ "ผ่านไป 3 วินาทีแล้ว!" ก็จะปรากฏขึ้น แค่นี้เอง! นี่แหละคือพื้นฐานของการจับเวลา
- `import time`: เป็นเหมือนคาถาที่บอก Python ว่า "ฉันจะใช้ฟังก์ชันเกี่ยวกับเวลานะ!" เป็นการโหลดกล่องเครื่องมือที่ชื่อว่า `time` ซึ่งเต็มไปด้วยเวทมนตร์ (ฟังก์ชัน) ต่างๆ ที่เกี่ยวกับเวลา
- `time.sleep(3)`: นี่คือหัวใจของการจับเวลา เป็นเวทมนตร์ที่ชื่อ `sleep` (หลับ) จากกล่องเครื่องมือ `time` ที่จะหยุดการทำงานของโปรแกรมชั่วคราวตามจำนวนวินาทีที่ระบุไว้ในวงเล็บ
เป็นไงบ้างครับ? ง่ายกว่าที่คิดไว้เยอะเลยใช่ไหม? นี่คือประสบการณ์ของการ "ทำให้มันทำงานได้" ความสำเร็จเล็กๆ น้อยๆ แบบนี้แหละที่เป็นเชื้อเพลิงที่ดีที่สุดในการเรียนเขียนโปรแกรมต่อไป
ขั้นตอนที่ 2: ทำให้เป็นของคุณ! มาตั้งค่าวินาทีได้อย่างอิสระกันเถอะ
การจับเวลาแค่ 3 วินาทีก็ดีอยู่หรอก แต่ไหนๆ ก็ทำแล้ว เรามาทำให้มันตั้งเวลาตามใจชอบได้ดีกว่า จะได้เอาไปใช้ตอนทำอาหารหรืออ่านหนังสือได้จริงไหม? ต่อไปเราจะมาดัดแปลงให้โปรแกรมถามว่า "จะให้รออีกกี่วินาที?" ทุกครั้งที่รันกัน
และนี่คือเวทมนตร์ที่จะปรากฏตัวขึ้นมา นั่นคือ `input()` ที่ใช้รับข้อมูลตัวอักษรจากผู้ใช้นั่นเอง
import time
# รับข้อมูลจากผู้ใช้ด้วย input()
input_seconds_str = input("ต้องการให้แจ้งเตือนในอีกกี่วินาที? กรุณาป้อนตัวเลข: ")
# [จุดสำคัญ!] แปลง 'สตริง' ที่ป้อนเข้ามาให้เป็น 'จำนวนเต็ม'
seconds = int(input_seconds_str)
print(f"ตั้งเวลาไว้ที่ {seconds} วินาทีแล้ว")
time.sleep(seconds)
print(f"ครบ {seconds} วินาทีแล้ว! หมดเวลา!")
เมื่อรันโปรแกรมนี้ โปรแกรมจะหยุดทำงานชั่วคราวและมีเคอร์เซอร์กะพริบขึ้นมา ลองพิมพ์จำนวนวินาทีที่ต้องการ (เช่น `10`) แล้วกด Enter ดูสิครับ ข้อความจะแสดงขึ้นมาหลังจากที่รอตามจำนวนวินาทีที่คุณป้อน
⚠️ กับดักที่มือใหม่ทุกคนต้องเจอ: `input()` จะรับค่าเป็น "สตริง" เสมอ
ตรงนี้ผมขอแชร์จุดที่สำคัญมากๆ ที่ผมเคยพลาดมาก่อน นั่นคือกฎที่ว่า ข้อมูลที่รับมาจาก `input()` ไม่ว่าเราจะพิมพ์ตัวเลขเข้าไปก็ตาม มันจะถูกมองว่าเป็น "สตริง" (ข้อความ) ทั้งหมด
แต่ `time.sleep()` จะรับค่าได้เฉพาะ "ตัวเลข" วินาทีเท่านั้น ถ้าเราพยายามส่ง "สตริง" `"10"` เข้าไป โปรแกรมจะโกรธแล้วแจ้งข้อผิดพลาดว่า "นี่มันไม่ใช่ตัวเลขนะ!"
ดังนั้น บรรทัด `seconds = int(input_seconds_str)` จึงจำเป็นมาก มันคือการนำสตริงมาใส่ในเวทมนตร์ `int()` เพื่อแปลงร่างให้กลายเป็น "จำนวนเต็ม (integer)" ที่คอมพิวเตอร์สามารถคำนวณได้ การ "แปลงชนิดข้อมูล" แบบนี้เป็นแนวคิดพื้นฐานที่สำคัญสุดๆ ที่เจอได้ในทุกสถานการณ์ของการเขียนโปรแกรมเลยครับ จำไว้ให้ดีนะ!
ขั้นตอนที่ 3: ทำให้หน้าตาดูดีขึ้น! การสร้างฟังก์ชันนับถอยหลัง
ระหว่างที่นาฬิกาจับเวลากำลังทำงาน คุณเคยรู้สึกกังวลไหมว่ามันยังทำงานอยู่จริงรึเปล่า? เรามาเพิ่มฟังก์ชันนับถอยหลังเพื่อแสดงเวลาที่เหลือกันดีกว่า จะได้รู้ว่า "เหลืออีกกี่วินาที"
ในขั้นตอนนี้ เราจะใช้เวทมนตร์แห่งการ "ทำซ้ำ" นั่นคือ `for` loop และจะใช้เทคนิคเล็กๆ น้อยๆ เพื่อให้ตัวเลขที่แสดงผลอยู่บนบรรทัดเดียวและอัปเดตไปเรื่อยๆ
import time
seconds = 10 # กำหนดค่าไว้ที่ 10 วินาทีเพื่อให้เข้าใจง่าย
# วนซ้ำตั้งแต่ 10 ถึง 1 โดยลดค่าทีละ 1
for i in range(seconds, 0, -1):
# แสดงผลสวยงามด้วย f-string และ end="\r" คือคาถาวิเศษ!
print(f"เวลาที่เหลือ: {i} วินาที", end="\r")
# รอ 1 วินาที
time.sleep(1)
# ข้อความหลังจากนับถอยหลังเสร็จ
# เทคนิคคือใส่ช่องว่างข้างหลังเพื่อลบข้อความเดิม
print("หมดเวลาแล้ว! ")
ลองรันดูสิครับ เป็นอย่างไรบ้าง? คุณน่าจะเห็นตัวเลข `10, 9, 8...` ลดลงเรื่อยๆ ที่ตำแหน่งเดิมในเทอร์มินัล เหมือนแอปจับเวลาของจริงเลยใช่ไหมล่ะ!
- `for i in range(seconds, 0, -1):`: เราใช้ `range(start, stop, step)` เพื่อสร้างการทำงานซ้ำแบบ "เริ่มจาก `seconds` (10) ไปจนถึง 1 (ไม่รวม 0) โดยลดค่าลงทีละ -1" โดยตัวแปร `i` จะรับค่าที่นับได้ในแต่ละรอบ (10, 9, 8...) ไปโดยอัตโนมัติ
- `print(..., end="\r")`: นี่คือเทคนิคสำคัญของครั้งนี้ ปกติแล้ว `print` จะขึ้นบรรทัดใหม่หลังจากแสดงผล แต่การเพิ่ม `end="\r"` เข้าไปจะเปลี่ยนการทำงานเป็น "ไม่ขึ้นบรรทัดใหม่ แต่ให้ย้ายเคอร์เซอร์ไปที่ต้นบรรทัด" ทำให้ `print` ครั้งต่อไปเขียนทับข้อความเดิม เราจึงเห็นเหมือนมีแค่ตัวเลขที่เปลี่ยนไป
ขั้นตอนที่ 4: ในที่สุดก็สำเร็จ! นาฬิกาจับเวลาของจริงพร้อมเสียงปลุก
มาถึงขั้นตอนสุดท้ายแล้วครับ เราจะมาเพิ่มฟังก์ชันปลุกด้วย "เสียง" จริงๆ ไม่ใช่แค่แสดงข้อความเมื่อหมดเวลา
ไม่ต้องใช้ไลบรารีพิเศษอะไรเลยครับ คอมพิวเตอร์ส่วนใหญ่ (ในเทอร์มินัล) มีฟังก์ชันที่ซ่อนอยู่ คือเมื่อเราสั่งให้แสดง "อักขระพิเศษ" บางตัว จะมี "เสียงบี๊บ" ดังขึ้นมา อักขระตัวนั้นก็คือ `\a` นั่นเอง
นี่คือโค้ดเวอร์ชันสมบูรณ์ที่รวมทุกฟังก์ชันที่เราทำมาทั้งหมด แถมยังเพิ่มการจัดการข้อผิดพลาดเมื่อผู้ใช้ป้อนข้อมูลที่ไม่ใช่ตัวเลขเข้าไปด้วย!
# นำเข้าโมดูล time
import time
# ใช้ try...except เพื่อดักจับข้อผิดพลาดที่อาจเกิดขึ้น
try:
# รับค่าจำนวนวินาทีจากผู้ใช้
input_seconds_str = input("ต้องการให้ปลุกในอีกกี่วินาที? กรุณาป้อนตัวเลข: ")
# แปลงสตริงที่รับเข้ามาเป็นจำนวนเต็ม (int)
seconds = int(input_seconds_str)
print(f"เริ่มนับถอยหลัง {seconds} วินาที")
# วนลูปตั้งแต่จำนวนวินาทีที่กำหนดจนถึง 1
for i in range(seconds, 0, -1):
# ใช้ f-string เพื่อแสดงผลเวลาที่เหลือให้สวยงาม
# end="\r" ทำให้การ print ครั้งต่อไปเขียนทับบรรทัดเดิม
print(f"เวลาที่เหลือ: {i} วินาที ", end="\r")
# รอ 1 วินาที
time.sleep(1)
# เมื่อลูปจบ (หมดเวลา) ให้แสดงข้อความ
# \a คืออักขระพิเศษที่ทำให้เทอร์มินัลส่งเสียงบี๊บ (Alert)
print("หมดเวลา! เสียงปลุกดังแล้ว! \a")
except ValueError:
# การจัดการกรณีที่ป้อนค่าอื่นที่ไม่ใช่ตัวเลข (int() จะเกิดข้อผิดพลาด)
print("ข้อผิดพลาด: กรุณาป้อนตัวเลขที่ถูกต้อง")
except KeyboardInterrupt:
# การจัดการกรณีที่ผู้ใช้หยุดโปรแกรมด้วย Ctrl+C
print("\nหยุดการจับเวลาแล้ว")
เพียงเท่านี้ คอมพิวเตอร์ของคุณก็กลายเป็นแอปจับเวลาพร้อมนาฬิกาปลุกอย่างสมบูรณ์แล้ว แถมยังฉลาดขึ้นเล็กน้อย เพราะถ้าเราป้อนตัวอักษรอื่นที่ไม่ใช่ตัวเลข (เช่น `abc`) โปรแกรมก็จะแสดงข้อความแจ้งข้อผิดพลาดแล้วจบการทำงานอย่างถูกต้อง
ข้อควรระวัง: เสียงบี๊บจาก `\a` อาจไม่ดังขึ้นอยู่กับการตั้งค่าของระบบปฏิบัติการหรือเทอร์มินัลที่คุณใช้ แต่ถึงจะไม่ได้ยินเสียง ก็ไม่ต้องกังวลนะครับ เพราะการทำงานของโปรแกรมยังคงถูกต้อง
สรุป: ความสำเร็จเล็กๆ น้อยๆ จากการ 'ทำให้มันทำงานได้!' คือพลังอันยิ่งใหญ่สำหรับอนาคต
お疲れ様でした!今回は`time`モジュールという、Pythonの基本的な機能を組み合わせるだけで、実用的なタイマーアプリが作れることを体験してもらいました。
- ทำให้โปรแกรมรอด้วย `time.sleep()`
- รับคำสั่งจากผู้ใช้ด้วย `input()`
- แปลงสตริงเป็นตัวเลขด้วย `int()` (สำคัญมาก!)
- ทำซ้ำด้วย `for` loop
- ทำให้การแสดงผลดูดีขึ้นด้วย `print(end="\r")`
- ส่งเสียงปลุกด้วย `\a`
- เตรียมพร้อมรับมือกับข้อผิดพลาดด้วย `try...except`
แต่ละฟังก์ชันอาจดูเรียบง่าย แต่ความสนุกของการเขียนโปรแกรมคือการนำสิ่งเหล่านี้มารวมกันเพื่อสร้าง "เครื่องมือที่มีประโยชน์" ขึ้นมาได้จริงๆ ความสำเร็จเล็กๆ ที่คุณได้สัมผัสในวันนี้ ไม่ว่าจะเป็นการ "คัดลอกโค้ดมาแล้วรันได้!" หรือ "ดัดแปลงเองได้!" จะเป็นแรงผลักดันที่สำคัญที่สุดให้คุณสร้างสรรค์สิ่งที่ซับซ้อนและน่าสนใจยิ่งขึ้นในอนาคต
ลองนำโค้ดนี้ไปต่อยอดดูสิครับ อาจจะดัดแปลงให้รับค่าเป็น "นาที" ได้ หรือจะลองทำเป็นนาฬิกาจับเวลาแบบ Pomodoro (ทำงาน 25 นาที พัก 5 นาที) ก็ได้ ขอให้สนุกกับการทดลองนะครับ!
[ของแถม] HTML สำหรับทดลองโค้ดทั้งหมดในบทความนี้
คุณสามารถคัดลอกโค้ด Python เวอร์ชันสมบูรณ์ที่นำเสนอในบทความนี้จากบล็อกโค้ดด้านล่าง แล้วบันทึกเป็นไฟล์ชื่อ `timer.py` ในคอมพิวเตอร์ของคุณ เพื่อนำไปรันและทดลองได้ทุกเมื่อ ลองเอาไปรันบนเครื่องของคุณดูนะครับ
<!-- บันทึกเป็น timer.py แล้วรันได้เลย -->
# นำเข้าโมดูล time
import time
# ใช้ try...except เพื่อดักจับข้อผิดพลาดที่อาจเกิดขึ้น
try:
# รับค่าจำนวนวินาทีจากผู้ใช้
input_seconds_str = input("ต้องการให้ปลุกในอีกกี่วินาที? กรุณาป้อนตัวเลข: ")
# แปลงสตริงที่รับเข้ามาเป็นจำนวนเต็ม (int)
seconds = int(input_seconds_str)
print(f"เริ่มนับถอยหลัง {seconds} วินาที")
# วนลูปตั้งแต่จำนวนวินาทีที่กำหนดจนถึง 1
for i in range(seconds, 0, -1):
# ใช้ f-string เพื่อแสดงผลเวลาที่เหลือให้สวยงาม
# end="\r" ทำให้การ print ครั้งต่อไปเขียนทับบรรทัดเดิม
print(f"เวลาที่เหลือ: {i} วินาที ", end="\r")
# รอ 1 วินาที
time.sleep(1)
# เมื่อลูปจบ (หมดเวลา) ให้แสดงข้อความ
# \a คืออักขระพิเศษที่ทำให้เทอร์มินัลส่งเสียงบี๊บ (Alert)
print("หมดเวลา! เสียงปลุกดังแล้ว! \a")
except ValueError:
# การจัดการกรณีที่ป้อนค่าอื่นที่ไม่ใช่ตัวเลข (int() จะเกิดข้อผิดพลาด)
print("ข้อผิดพลาด: กรุณาป้อนตัวเลขที่ถูกต้อง")
except KeyboardInterrupt:
# การจัดการกรณีที่ผู้ใช้หยุดโปรแกรมด้วย Ctrl+C
print("\nหยุดการจับเวลาแล้ว")
ขั้นตอนต่อไป
เมื่อสร้างนาฬิกาจับเวลาได้แล้ว ต่อไปมาลองสร้างเกมทายตัวเลขแข่งกับคอมพิวเตอร์ดูไหม? การใช้โมดูล `random` เพื่อจัดการกับเลขสุ่มจะเปิดประตูสู่ความสนุกอีกระดับของการเขียนโปรแกรม