สวัสดีครับทุกท่าน บทความนี้จะพาทุกท่านไปเขียนโปรแกรมแปลภาษา dictionary บน Python เวชั่น 3 กันครับ หลาย ๆ ท่านคงเคยใช้งาน longdo เว็บ dictionary ไทยกันมาบ้างแล้ว ผมเลยเกิดความคิดที่จะเขียนโปรแกรมแปลภาษา dictionary แบบไม่ต้องต่ออินเทอร์เน็ตบ้างครับ
เว็บ longdo ได้ใช้ฐานข้อมูลคำศัพท์ของ LEXiTRON เป็น Xml ผมแปลงมาเป็น Sql ไม่ถูก ผมเลยได้ไปค้นมาจากอินเทอร์เน็ตมา
พบผู้ใจดีได้ทำการแปลง LEXiTRON เป็น Sqlite3 ท่าน Ake Exorcist จาก akexorcist.com ครับ จากบทความนี้ [Android Code] แจก SQLite สำหรับ Dictionary ของ Lexitron
จะมี 8 คอลัมน์ด้วยกันดังนี้ _id, esearch, eentry, tentry, ecat, ethai, esyn และ eant ในตารางข้อมูล eng2thai
ขอขอบคุณ คุณ Ake Exorcist มา ณ ที่นี้ครับ
ผมได้โหลดไฟล์ฐานข้อมูลที่แปลงเป็น Sqlite3 จาก lexitron [Google Drive] แล้วผมได้บันทึกเป็นชื่อ lexitron.db (ไฟล์ฐานข้อมูลของ Sqlite3 ต้องเป็น .db นะครับ)
บทความนี้จะแปลจากภาษาอังกฤษเป็นภาษาไทยครับ ส่วนไทยเป็นอังกฤษลองไปพัฒนาต่อครับ
เสร็จแล้วเรามาลองมือเขียนกัน!!!
import sqlite3 conn = sqlite3.connect('lexitron.db') word = input("คำค้นหา:") c = conn.cursor() a = c.execute("SELECT * FROM eng2thai WHERE esearch='%s'" % (word,)) for row in a: print ("คำค้นหา = ", row[1]) print ("eentry = ", row[2]) print ("คำแปล = ", row[3]) print ("ลักษณะคำ = ", row[4]) print ("ความหมายเหมือน = ", row[5]) print ("esyn = ", row[6]) print ("eant = ", row[7],"\n")
ตัวอย่างข้างบนผมได้เขียนแบบไม่ได้ใช้ GUI ครับ
import sys import sqlite3 from tkinter import * conn = sqlite3.connect('lexitron.db') mGui = Tk() mGui.geometry('450x450+200+200') mGui.title('โปรแกรมแปลภาษา Mark 1') #ชื่อหัวโปรแกรม Label(text='โปรแกรมแปลภาษา',fg = "light green",bg = "dark green",font = "Helvetica 16 bold italic").pack() Label(text='จัดทำโดย วรรณพงษ์ ภัททิยไพบูลย์',fg = "light green",bg = "dark green",font = "Helvetica 16 bold italic").pack() word = input("คำค้นหา:") c = conn.cursor() a = c.execute("SELECT * FROM eng2thai WHERE esearch='%s'" % word) for row in a: t1 = (row[1]) t2 = (row[2]) t3 = (row[3]) t4 = ("ลักษณะคำ = ", row[4]) t5 = ("ความหมายเหมือน = ", row[5]) t6 = ("esyn = ", row[6]) t7 = ("eant = ", row[7],"\n") Label(text="คำค้นหา: %s" % (t1,),fg = "light green",bg = "dark green",font = "Helvetica 16 bold italic").pack() a2 = Label(text="%s" % (t2,),fg = "light green",bg = "dark green",font = "Helvetica 16 bold italic").pack() a3 = Label(text="คำแปล: %s" % (t3,),fg = "light green",bg = "dark green",font = "Helvetica 16 bold italic").pack() a4 = Label(text="=========================",fg = "light green",font = "Helvetica 16 bold italic").pack()ผลลัพธ์
import sys import sqlite3 from tkinter import * conn = sqlite3.connect('lexitron.db') mGui = Tk() aaa = "" mGui.geometry('450x450+200+200') mGui.title('Mark 1') #ชื่อหัวโปรแกรม def aa(): aaa = ment.get() return ment = StringVar() bb = Button(mGui,text='OK',command = aa,fg='red',bg='blue').pack() Entry(mGui,textvariable=ment).pack() c = conn.cursor() a = c.execute("SELECT * FROM eng2thai WHERE esearch='%s'" % (aaa,)) for row in aaa: t1 = (row[1]) t2 = (row[2]) t3 = (row[3]) t4 = ("1 = ", row[4]) t5 = ("2 = ", row[5]) t6 = ("3 = ", row[6]) t7 = ("4 = ", row[7],"\n") Label(text="1: %s" % (t1,),fg = "light green",bg = "dark green",font = "Helvetica 16 bold italic").pack() Label(text="%s" % (t2,),fg = "light green",bg = "dark green",font = "Helvetica 16 bold italic").pack() Label(text="3: %s" % (t3,),fg = "light green",bg = "dark green",font = "Helvetica 16 bold italic").pack() Label(text="=========================",fg = "light green",font = "Helvetica 16 bold italic").pack()
หลังจากที่เขียน From รับค่าที่เป็น Entry แล้วทำปุ่ม Button ต้องมีการอ้างอิงคาลาสแบบ OOP ข้างบนอีกด้วย เท่ากับว่า ผมไม่สามารถเขียนโค้ดโดยหลังจากกรอกข้อมูลกดปุ่ม ค้นหา ผมไม่สามารถใช้โค้ดเดิมต่อไปได้ ผมคิดไม่ออก ผมเลยได้สอบถามพี่ใบบอนครับ ระหว่างหาทางแก้ผมได้ไปเจอ http://stackoverflow.com/questions/11963224/python-sqlite3-tkinter-display-multible-rows ผมเลยได้ลองแก้ไขโค้ดดู พบว่าสามารถทำงานได้ตามที่ต้องการครับ
import sys import sqlite3 from tkinter import * conn = sqlite3.connect('lexitron.db') mGui = Tk() aaa = "" ment = StringVar() def aa(): aaa = ment.get() c = conn.cursor() search = c.execute("SELECT * FROM eng2thai WHERE esearch='%s'" % (ment.get(),)) for row in search: t1 = (row[1]) t2 = (row[2]) t3 = (row[3]) t4 = ("ลักษณะคำ = ", row[4]) t5 = ("ความหมายเหมือน = ", row[5]) t6 = ("esyn = ", row[6]) t7 = ("eant = ", row[7],"\n") Label(text="คำค้นหา: %s" % (t1,),fg = "light green",bg = "dark green",font = "Helvetica 16 bold italic").pack() a2 = Label(text="%s" % (t2,),fg = "light green",bg = "dark green",font = "Helvetica 16 bold italic").pack() a3 = Label(text="คำแปล: %s" % (t3,),fg = "light green",bg = "dark green",font = "Helvetica 16 bold italic").pack() a4 = Label(text="=========================",fg = "light green",font = "Helvetica 16 bold italic").pack() mGui.geometry('450x450+200+200') mGui.title('โปรแกรมแปลภาษา Mark 1') #ชื่อหัวโปรแกรม Label(text='โปรแกรมแปลภาษา',fg = "light green",bg = "dark green",font = "Helvetica 16 bold italic").pack() Label(text='จัดทำโดย วรรณพงษ์ ภัททิยไพบูลย์',fg = "light green",bg = "dark green",font = "Helvetica 16 bold italic").pack() Entry(mGui,textvariable=ment).pack() bb = Button(mGui,text='ค้นหา',command = aa,fg='light green',bg='dark green').pack() mGui.mainloop()ผลลัพธ์
แนวทางการนำไปพัฒนาต่อ
จากโปรแกรมที่ผมเขียนเป็นตัวอย่างไป ท่านสามารถนำไปพัฒนาต่อเป็นแปลงจากภาษาไทยเป็นภาษาอังกฤษ เป็นต้นครับ และอย่าลืมอ่านข้อตกลงการใช้งาน License ของ LEXiTRON ด้วยนะครับ http://lexitron.nectec.or.th/2009_1/index.php?q=common_manager/faqsไฟล์ตัวอย่าง https://db.tt/ZDITGceZ
ขอบคุณครับ
สามารถนำไปประยุกต์ใช้กับ Qt เช่น PyQt Pyside ได้ครับ
ตอบลบทำเป็น .exe ยังไงคะ หนูทำแล้วมันไม่สามารถค้นหาได้คะ
ตอบลบลองตรวจสอบดูนะครับว่าได้บรรจุไฟล์ LEXiTRON ไปด้วยไหมครับ
ลบ