PDA

View Full Version : ตอน : การแสดงข้อความภาษาไทย บน TkInter ต้องถอดรหัสก่อนเสมอ !



nprotech
09-05-2005, 01:28 PM
จากที่เพื่อน ๆ ในบอร์ดได้เคยติดปัญหาไม่สามารถเขียนภาษาไทย บนตัว TkInter ได้ ดังนั้น วันนี้เราจะไปพบวิธีการแก้ปัญหา กันครับ..

หัวใจอยู่ที่คำสั่ง decode ครับขอให้พิจารณาตัวอยางต่อไปนี้
mytext = "สวัสดีประเทศไทย"
mytext = mytext.decode('cp874')

เมื่อเราต้องการวาดอักษรภาษาไทยลงบน TkInter สามารถทำได้ตามปกติ เพราะเราได้ถอดรหัสเป็น cp874 (ตรงตามข้อกำหนดของไพธอนเปิดอ่านคู่มือได้นะครับ)
>>> from Tkinter import Label
>>> widget = Label(None,text="สวัสดี".decode('cp874'))
>>> widget.pack()
>>> widget.mainloop()

นอกจากนั้นแล้ว การเข้ารหัสแบบนี้ยังสามารถนำไปใช้ในการเขียนข้อความลงบนภาพกราฟิกได้อีกด้วย..
ผมหมายถึงพวก .jpg, .gif, .bmp อื่น ๆ ที่สนับสนุนโดยโมดูล PIL (Python Image Library) ครับ..

หวังว่าความรู้นี้ จะทำให้ท่านสามารถต่อยอดงานของท่านได้อย่างไม่เสียเวลา..
และเกิด productivity เยอะ ๆ นะครับ.. สำหรับวันนี้ขอกล่าวคำว่า สวัสดีครับ !!

Anonymous
10-05-2005, 05:57 PM
ผมมีวิธีอื่นที่ดีกว่านะครับ

วิธีแรกคือการพิมพ์ 2 บรรทัดนี้เอาไว้ที่หัวของทุกไฟล็ .py
(ความจริงแล้วที่จำเป็นคือบรรทัดที่ 2 แต่บรรทัดแรกเป็นธรรมเนียมนิยม
ของชาว unix, ยังไงก็ตาม ห้ามให้อยู่เกินบรรทัดที่ 2)

#!/usr/bin/env python
# -*- coding: cp874 -*-

จากนั้น string literal ในโปรแกรมที่เป็นภาษาไทยให้ใช้ unicode
โดยใส่ u ไว้ข้างหน้า quote(")

>>> widget = Label(None,text=u"สวัสดี")

เท่านี้ก็เรียบร้อย



วิธีที่สองวุ่นหน่อย ไม่ค่อยแนะนำ แต่บางครั้งก็จำเป็นสำหรับโปรแกรม
เก่าๆที่ไม่ได้เขียนไว้ support unicode เต็มที่ อย่างเช่น zope 2

คือการไปเพิ่มไฟล์ชื่อ sitecustomize.py ที่ directory:
python/Lib/site-packages

โดยในไฟล็นั้นจะเป็น code ดังนี้

import sys
sys.setdefaultencoding('cp874')

จากนั้นก็สามารถเขียน code ได้ตามปกติเลย

>>> widget = Label(None,text="สวัสดี")

Anonymous
10-05-2005, 06:14 PM
ลืมบอกไปอีกอย่างคือถ้าเราเกิดอยากเขียน code ที่มีสาระพัดภาษา
ไทย จีน อังกฤษ เกาหลี ก็ทำได้ด้วยการใช้ editor ที่เก็บเป็น utf-8 ได้
อย่างเช่น JEdit แล้วใช้วิธีแรกแต่เปลี่ยนหัวเป็น

#!/usr/bin/env python
# -*- coding: utf-8 -*-