Calculator GUI by Python

ผู้เขียนบทความ : นายพงศกร บุปผา COE#12

1. ความเป็นมา

เครื่องคิดเลขเป็นแอปพลิเคชั่นที่เราใช้กันในชีวิตประจำวัน จึงอยากรู้ว่าเราสามารถสร้างเครื่องคิดเลขได้ด้วยตัวเองได้มั้ย จึงเกิดโปรเจ็คนี้ขึ้นมา

2. วัตถุประสงค์

เพื่อศึกษาและพัฒนาการสร้างเครื่องคิดเลขโดยใช้ภาษา Python

3. ขอบเขต

3.1 สามารถใช้คิดเลขได้
3.2 ฟังก์ชั่น san cos tan สามารถคิดได้แค่แบบ degree ไม่สามารถคิดแบบ radiant ได้

4. ประโยชน์ที่สามารถได้รับ

4.1 ได้ความรู้ในการนำภาษา Python มาประยุกต์ใช้งาน
4.2 ได้ความรู้เกี่ยวกับการใช้โมดูล Tkinter

5. ความรู้ที่เกี่ยวข้อง

5.1 การ import โมดูลTkinter และฟังก์ชั่น san cos tan

Tkinter คือ utility ที่นิยมใช้มากที่สุดเป็นหนึ่งในวิธีที่เร็วและง่ายที่สุดในการสร้างแอปพลิเคชัน GUI ยิ่งไปกว่านั้น Tkinter ยังข้ามแพลตฟอร์มดังนั้นรหัสเดียวกันจึงทำงานบน macOS, Windows และ Linux

from tkinter import *
import parser
from math import sin, cos, tan

5.2 การ Mapping Button กับ Function การใช้งาน

ฟังก์ชัน (Function) คือ โค้ดหรือโปรแกรมที่ทำงานเพื่อวัตถุประสงค์บางอย่าง ในภาษา Python ในการเขียนโปรแกรมเรามักจะแยกโค้ดที่มีการทำงานเหมือนๆ กันเป็นฟังก์ชันเอาไว้ และเรียกใช้ฟังก์ชันนั้นซ้ำๆ ในรูปแบบของการประกาศฟังก์ชันในภาษา Python นั้นจะใช้คำสั่ง def และหลังจากนั้นตามด้วย function_name เป็นชื่อของฟังก์ชัน และวงเล็บ () เป็นการกำหนดพารามิเตอร์ของฟังก์ชัน พารามิเตอร์ของฟังก์ชันนั้นสามารถมีจำนวนเท่าไหร่ก็ได้หรือไม่มีก็ได้
โดยการแมปปุ่มกับฟังก์ชันนั้น เราต้องสร้างปุ่มขึ้นมาก่อนโดยใช้คำสั่ง Button(root, text=”/”, command=lambda: Function_name(“/”),bd=5).grid(row=1, column=3, sticky = “news”) คำสั่ง comnad=lambda:Function_name จะเป็นการเรียกใช้งานฟังก์ชัน หลังจากนั้นเราก็ไปสร้างฟังก์ชันการใช้งานสำหรับปุ่มต่างๆ ของโปรแกรม

6. ผลการดำเนินงาน

ระยะที่ 1 ศึกษาหาความรู้เกี่ยวกับการสร้างเครื่องคิดเลข
ระยะที่ 2 เป็นการเขียนโปรแกรมสร้างเครื่องคิดเลขตอนมีขั้นตอนดังนี้   

ขั้นตอนที่ 1 นำเข้าโมดูลที่จำเป็น
ในการใช้ Tkinter เราต้องนำเข้าโมดูล Tkinter และเราจะนำเข้าฟังก์ชั่น san cos tan จากโมดูลคณิตศาสตร์

code:

from tkinter import *
import parser
from math import sin, cos, tan

ขั้นตอนที่ 2 สร้างหน้าต่าง GUI ของเครื่องคิดเลข
ขั้นตอนนี้เราจะสร้างหน้าต่างสำหรับเครื่องคิดเลขของเราซึ่งจะรองรับปุ่มต่างๆ

code:

root = Tk()
root.title('Calculator by Python')
root.option_add("*font" , "consolas 30")

ขั้นตอนที่ 3 เป็นการออกแบบปุ่มต่างๆ
ขั้นตอนนี้เรามาออกแบบปุ่มสำหรับเครื่องคิดเลขของเราและวางไว้บนหน้าต่างแอปพลิเคชันของเรา

code:

display=Entry(root)
display.grid(row=0, column=0, columnspan=6, sticky = "news")

Button(root, text="AC", command=clear,bd=5).grid(row=1, column=0, sticky = "news")
Button(root, text="<-", command=undo,bd=5).grid(row=1, column=1, sticky = "news")
Button(root, text="%", command=lambda: get_operation("%"),bd=5).grid(row=1, column=2, sticky = "news")
Button(root, text="/", command=lambda: press("/"),bd=5).grid(row=1, column=3, sticky = "news")
Button(root, text="(", command=lambda: press("("),bd=5).grid(row=1, column=4, sticky = "news")
Button(root, text=")", command=lambda: press(")"),bd=5).grid(row=1, column=5, sticky = "news")
Button(root, text="7", command=lambda: press("7"),bd=5).grid(row=2, column=0, sticky = "news")
Button(root, text="8", command=lambda: press("8"),bd=5).grid(row=2, column=1, sticky = "news")
Button(root, text="9", command=lambda: press("9"),bd=5).grid(row=2, column=2, sticky = "news")
Button(root, text="*", command=lambda: press("*"),bd=5).grid(row=2, column=3, sticky = "news")
Button(root, text="^2", command=lambda: press("**2"),bd=5).grid(row=2, column=4, sticky = "news")
Button(root, text="^", command=lambda: press("**"),bd=5).grid(row=2, column=5, sticky = "news")
Button(root, text="4", command=lambda: press("4"),bd=5).grid(row=3, column=0, sticky = "news")
Button(root, text="5", command=lambda: press("5"),bd=5).grid(row=3, column=1, sticky = "news")
Button(root, text="6", command=lambda: press("6"),bd=5).grid(row=3, column=2, sticky = "news")
Button(root, text="-", command=lambda: press("-"),bd=5).grid(row=3, column=3, sticky = "news")
Button(root, text="pi", command=lambda: press("*3.14"),bd=5).grid(row=3, column=4, sticky = "news")
Button(root, text="sin", command=lambda: get_operation("sin("),bd=5).grid(row=3, column=5, sticky = "news")
Button(root, text="1", command=lambda: press("1"),bd=5,padx=15).grid(row=4, column=0, sticky = "news")
Button(root, text="2", command=lambda: press("2"),bd=5,padx=15).grid(row=4, column=1, sticky = "news")
Button(root, text="3", command=lambda: press("3"),bd=5,padx=15).grid(row=4, column=2, sticky = "news")
Button(root, text="+", command=lambda: press("+"),bd=5,padx=15).grid(row=4, column=3, sticky = "news")
Button(root, text="exp", command=lambda: press("10**"),bd=5,padx=15).grid(row=4, column=4, sticky = "news")
Button(root, text="cos", command=lambda: get_operation("cos("),bd=5,padx=15).grid(row=4, column=5, sticky = "news")
Button(root, text="0", command=lambda: press("0"),bd=5).grid(row=5, column=0,sticky = "news")
Button(root, text="00", command=lambda: press("00"),bd=5).grid(row=5, column=1, sticky = "news")
Button(root, text=".", command=lambda: press("."),bd=5).grid(row=5, column=2, sticky = "news")
Button(root, text="=", command=lambda: equal(),bg="gold",bd=5).grid(row=5, column=3, columnspan=2, sticky = "news")
Button(root, text="tan", command=lambda: get_operation("tan("),bd=5).grid(row=5, column=5, sticky = "news")
ในโปรแกรมเครื่องคิดเลขนี้ใน python ฟังก์ชัน“ Entry” ช่วยในการสร้างช่องป้อนข้อความและเราใช้วิธีการ. กริด () เพื่อกำหนดตำแหน่งที่เกี่ยวข้องกับปุ่มหรือช่องป้อนข้อมูล เราใช้วิธีการกดปุ่มเพื่อแสดงปุ่มบนหน้าต่างแอปพลิเคชันของเรา

 

root – ชื่อที่เราอ้างถึงในหน้าต่างของเรา
text – ข้อความที่จะแสดงบนปุ่ม
row – ดัชนีแถวของกริด
colum – ดัชนีคอลัมน์ของกริด
columnspan – ขยายหรือรวมจำนวนคอลัมน์
sticky – หากเซลล์ผลลัพธ์มีขนาดใหญ่กว่าวิดเจ็ต Sticky จะกำหนดวิธีการขยายวิดเจ็ต การรวมกันของค่าคงที่ที่ใช้ S, N, E และ W หรือ NW, NE, SW และ SE นั้นคล้ายคลึงกับทิศทางในเข็มทิศ N + E + W + S หมายความว่าควรขยายวิดเจ็ตในทุกทิศทาง 

 

 

ขั้นตอนที่ 4 การแมปฟังก์ชั่นให้กับปุ่ม
1. การแมปฟังก์ชั่นตัวเลข

code:

def press(num):
   global i
   display.insert(i, num)
    i+=1

ฟังก์ชัน press () รับตัวเลขเป็นพารามิเตอร์ ตัวเลขจะถูกแทรกลงในช่องป้อนข้อมูลด้วยเมธอด. insert () ที่มีพารามิเตอร์ “i” และ “num” ตัวแปรส่วนกลาง i จะเพิ่มขึ้นทุกครั้งเพื่อรับการอัปเดตตำแหน่งเพื่อแทรกตัวเลขถัดไปหรือตัวดำเนินการถัดไป

i – ตำแหน่งที่จะแทรกตัวเลข

num – ตัวเลข

2. การแมปฟังก์ชั่นตัวดำเนินการ

code:

def get_operation(operator):
   global i
   length = len(operator)
   display.insert(i,operator)
   i+=length

ฟังก์ชัน get_operation () รับตัวดำเนินการเป็นพารามิเตอร์ซึ่งจะถูกแทรกลงในช่องข้อความที่ตำแหน่งของเครื่องคำนวณ python

3. การแมปฟังก์ชั่นปุ่ม clear

code:

def clear():
   display.delete(0,END)

เราใช้เมธอด .delete() เพื่อลบอักขระในช่องข้อความ ยอมรับตำแหน่งเริ่มต้นและสิ้นสุดเป็นพารามิเตอร์
0 – ตำแหน่งเริ่มต้น
END – ตำแหน่งสิ้นสุด

4. การแมปฟังก์ชั่นปุ่ม undo

code:

def undo():
   delete = display.get()
   if len(delete):
       undo = delete[:-1]
       clear()
       display.insert(0,undo)
   else:
       clear()
       display.insert(0,"Error")

เราใช้เมธอด .get () เพื่อดึงสตริงที่มีอยู่ในช่องป้อนข้อมูล หากมีสตริงอยู่จริงๆเราจะตัดอักขระสุดท้ายออกล้างช่องป้อนข้อมูลและดันสตริงใหม่กลับไปที่ช่องป้อนข้อมูลซึ่งไม่มีอักขระสุดท้าย

5. การแมปฟังก์ชั่นปุ่ม “=”

code:

def equal():
   equal = display.get()
   try:
       a = parser.expr(equal).compile()
       result = eval(a)
       clear()
       display.insert(0,result)
   except Exception:
       clear()
       display.insert(0,"Error")

เราดึงสตริงที่มีอยู่ในช่องป้อนข้อมูลโดยใช้เมธอด. get () ตอนนี้เราใช้โมดูลแยกวิเคราะห์เพื่อสแกนสตริงโดยใช้วิธี. expr () ซึ่งยอมรับสตริงเป็นพารามิเตอร์ โดยทั่วไปเราจะปล่อยให้ตัวแยกวิเคราะห์สร้างโครงสร้างไวยากรณ์นามธรรมของสตริงซึ่งประเมินโดยใช้ฟังก์ชัน eval ()

ระยะที่ 3 ผลการทดลอง
เมื่อรันโปรแกรมเครื่องคิดเลขนี้ใน python คุณจะได้หน้าจอต่อไปนี้

7. สรุปผลและข้อเสนอแนะ

ตัวโปรแกรมเป็นไปตามที่ผู้ศึกษาต้องการ สามารถใช้งานได้ปกติอาจจะมีข้อผิดพลาดเล็กน้อย และตัวโปรแกรมสามารถนำไปพัฒนาต่อไปได้อีก สามารถนำไปเพิ่มฟังก์ชั่นต่างๆ ได้อีก

8. ข้อมูลอ้างอิง

-website ที่ใช้ในการศึกษาอ้างอิง

https://data-flair.training/blogs/python-calculator-project/

Share

You may also like...

1 Response

  1. คฑาธร ลาภวงศ์ พูดว่า:

    เป็นโปรแกรมที่มีประโยชน์มากๆ

ใส่ความเห็น