รายการ

python กับ GUI

สำหรับการเขียน python แม้ว่าตัวภาษาจะดูเรียบง่าย แต่สำหรับการเขียน python script กับ GUI แล้วล่ะก็เป็นของแสลงสำหรับหลาย ๆ คน
เพราะถึงแม้ว่าจะมี GUI Toolkit ที่รองรับมากมาย หากลองเข้าไปดูใน http://wiki.python.org/moin/GuiProgramming ก็จะมี GUI หลาย ๆ ตัว
ที่เรารวบรวมไว้ ตัวผมเองก็ไม่มีโอกาสได้ลองใช้งานทั้งหมด เพราะแม้ว่าหลายคนจะเขียน python พื้นฐานได้ แต่การนำไปใช้งานร่วมกับ GUI ก็ต้องทำการ
อ่านเอกสารของเขานั้นอย่างละเอียด และรูปแบบคำสั่งการเรียกใช้งาน เช่น event , form ก็จะต่างกันออกไป เช่น คนที่เขียน pygtk และ ปรับไปใช้ wxpython หรือ pyQt ก็ต้องมานั่งอ่านเอกสารกันตาเปียก แต่สำหรับบางคนก็ไม่มีปัญหาอย่างว่ามานะครับ

เรามาลองดูกันว่า GUI tookit หรือ GUI framework สำหรับ python (จริง ๆ แล้วเขาก็ทำรองรับกับภาษาอื่น ๆ ด้วยนะ) มีอะไรกันบ้าง

  • PyGtk base on Gtk Bindings for pango, atk, gtk and libglade  สำหรับสาวก gnome ส่วนตัวแล้วผมชอบ GTK มากกว่า ถึงแม้มันจะยากกว่า GUI ตัวอื่นก็ตามที หรือแม้ว่าพอนำ code ไป run บน window แล้วมันจะน่าเกลียดน่าชังขนาดไหน (ถ้านึกไม่ออกก็ลองดู GUI ของ GIMP หรือ Inkscape ที่ RUN บน Window) เหตุผลคือ มันสามารถ combine กับ GTK ได้เกือบร้อยเปอร์เซ็นต์ การเรียกใช้งาน Library มีความรวดเร็ว เสถียรกว่า ไม่ค่อยเจอกับ Bug และมี Document ที่อ่านง่าย เข้าใจง่าย (หรือเปล่า?) มีCommunity ที่ให้คำตอบของปัญหาเยอะพอสมควร (ไม่ได้ค่าโฆษณานะครับ) มันเหมาะกับงานที่ต้องการความเสถียรภาพสักหน่อย แต่ข้อเสียคือ อย่างว่ามาคือยาก และทำcross platform แล้วอาจจะไม่ค่อยถูกใจกับหลายคน (ลองอ่านตัวอย่างเอกสารที่ผมทำขึ้นมาครับ เอกสารเกี่ยวกับ GTK)
  • PyQt  base on Qt Python bindings for the Qt application development framework เป็น cross platform เช่นกัน มีเครื่องมือสำหรับเขียนโปรแกรมเรียกว่า designer ที่ใกล้เคียงกับ VB มากที่สุด (ในความเห็นผมนะ) แต่มันก็คงเทียบเท่าไม่ได้ เพราะโครงสร้างมันต่างกัน สำหรับคนที่คุ้นเคยกับการเขียนโปรแกรมบน window แล้วอยากลองมาเขียน python บน Linux PyQt น่าจะเป็นทางออกให้ และการนำ code มา RUN บน window ก็กลมเกลือนกับ OS ได้เป็นอย่างดี รับรองดูไม่ออกมาเขียนด้วย Qt Library
  • Jythonbase on Java เป็นการ implement JAVA กับ python เข้าด้วยกัน (ติดค้างไว้ก่อน ยังไม่มีเวลาทดลอง)
  • IronPython base on .NET/Mono  เป็นการ implement  MS.net กับ python เข้าด้วยกัน เป็นอย่างไรก็ไม่เคยลอง เพราะไม่ได้เขียน MS.net
  • TkInter base on Tk Python’s “standard” GUI library เป็น toolkit ที่ได้รับความนิยมมากตัวหนึ่ง สามารถใช้งานได้หลาย platform ตัว Tk จริง ๆ แล้วผมก็ชอบอย่างหนึ่งเพราะมีเอกสารและ widget ให้ใช้งานมากมาย และ สามารถเข้ากับ window ได้ดี แต่พอมา run บน Linux ก็จะได้อารมณ์ GUI แบบย้อนยุคสักหน่อย
  • WxPython base on WxWidgets รองรับทั้ง Windows/Unix/Linux/Mac เหมาะมากสำหรับคนที่ต้องการเขียน python ครั้งเดียวแล้ว run ได้หลาย OS ตัวนี้ ส่วนตัวแล้วผมว่าเป็นมิตรกับทุก ๆ OS มากที่สุด ถ้าเปรียบเทียบก็เหมือนกับ กิ้งก่า ไปอยู่ที่ไหน GUI ก็กลมกลืนไปกับเขาได้หมดดูแล้วก็แยกไม่ออกว่าใช้ Tookit ตัวไหนทำ WxWidget เป็น toolkit ที่มีความสามารถตัวหนึ่ง ซึ่งได้รับความนิยมมากพอสมควร มี ตัวอย่าง demo code ที่มากมายและสวยงาม ตัว widget library ก็ต้องการพื้นที่ไม่มาก จุดเด่นคือ ความง่ายใน การจัดเรียง widget บน form และ ลูกเล่นมากมาย เหมาะสำหรับผู้เริ่มต้นครับ
  • Kivy ตัวนี้รองรับมากมายหลาย platform เช่นกัน เป็น Toolkit ที่ออกแบบมาสำหรับ multitouch  มี widget ที่รองรับพอสมควร ที่สำคัญสามารถใช้งานบน android ได้ด้วย สำหรับคนที่อยากเขียน python บน android ก็ลองดูได้ (ตัวผมเองยังไม่ได้ลองครับ)
  • Scripting Layer for Android (SL4A)  เป็น python interpreter สำหรับ มือถือตระกูล Android คือ ต้องลงโปรแกรมบนมือถือก่อน จากนั้นก็เขียน python script บนและแก้ไขได้ทันทีเลย รองรับการเข้าถึงข้อมูลบนโทรศัพท์ได้มากอยู่ครับ ส่วนตัวผมทดสอบแล้วก็สามารถใช้งานได้ แต่มันไม่ค่อยเหมาะกับการนำ code ไปให้ใช้งาน เหมือนกับพวก file .apk เพราะต้องลงเจ้า SL4A ก่อนนี่แหละ ซึ่งก็ต้องรอดูอนาคต python บน Android ต่อไปว่ามันจะ combind เข้ากับระบบได้ดีขนาดไหน น่าติดตามครับ

การเลือกใช้งาน GUI นั้น ๆ ขึ้นอยู่กับรูปแบบของงานแต่ละงาน ความถนัดของโปรแกรมเมอร์ และความชอบของแต่ละคน และระบบ OS ที่จะรองรับเป็นสำคัญ ในส่วนที่แนะนำก็เป็น GUI ที่เป็น Opensource (เกือบทั้งหมด) ซึ่งมีความสามารถ ข้อดี ข้อเด่นแตกต่างกันไป ที่สำคัญ แม้ GUI จะสวยงามมากแค่ไหน หากแต่ใช้ทรัพยากรของระบบมากก็ไม่ดีในระยะยาว ในโลกของ opensource แล้วส่วนตัวผมอยากให้ลองพยายามเลือกใช้ version ที่ไม่เก่าและไม่ใหม่จนเกินไป เพราะหากเป็น version ใหม่มาก ๆ อาจจะดูดี และก็ต้องผจญกับ Bug ที่ติดสอยห้อยตามมา และการ support ทาง web community อาจจะมีไม่มาก ณ ขณะนั้น งานเราอาจจะเสียหายและเสียเวลาไปโดยเปล่าประโยชน์ก็ได้ ก็ต้องเลือกดูให้ดี

การ import python module

การนำเข้า Module หรือ Library สามารถนำเข้ามาได้ด้วยคำสั่ง import ซึ่งประกาศไว้ตอนหัวของ code
เราสามารถนำเข้า Python standard library หรือ เป็น library ที่เราเขียนเองก็ได้ ซึ่งมีรูปแบบดังตัวอย่างข้างล่าง

import re
import string
import sys
import os

การนำเข้า Library ไม่ได้มีลำดับเจาะจงเพียงแต่คุณต้องนำเข้า ก่อนที่จะเรียกใช้ใช้งาน function ใน Module หรือ library นั้น ๆ และยังสามารถ import โดยใช้บรรทัดเดียวได้ดังนี้

import re, string, sys, os

บางครั้งการนำเข้า module เราอาจจะไม่ต้องนำเข้าทั้งหมดเพียงแต่เลือกเฉพาะ function ที่เราจำเป็นต้องใช้งาน เช่น

from posix import environ

ในกรณีที่เราอยากทราบว่า module หรือ library ที่เรานำเข้ามามี function อะไรอยู่บ้างก็สามารถใช้คำสั่ง dir() เพื่อเรียกดูเช่น

>>>import string
>>>dir(string)
['Template', '_TemplateMetaclass', '__builtins__', '__doc__', '__file__', '__name__', '_float', '_idmap', '_idmapL', '_int', '_long', '_multimap', '_re', 'ascii_letters','ascii_lowercase', 'ascii_uppercase', 'atof', 'atof_error', 'atoi', 'atoi_error', 'atol', 'atol_error', 'capitalize', 'capwords', 'center', 'count', 'digits', 'expandtabs', 'find','hexdigits', 'index', 'index_error', 'join', 'joinfields', 'letters', 'ljust', 'lower', 'lowercase', 'lstrip', 'maketrans', 'octdigits', 'printable', 'punctuation', 'replace', 'rfind','rindex', 'rjust', 'rsplit', 'rstrip', 'split', 'splitfields', 'strip', 'swapcase', 'translate', 'upper', 'uppercase', 'whitespace', 'zfill']

เป็นต้น

กรณีที่เราเขียน python มากกว่า 1 file และต้องการที่จะ share ค่าตัวแปร หรือส่งผ่านข้อมูลเข้าหากันสามารถทำการ import ได้ดังตัวอย่าง
- สร้าง python script ขึ้นมา 2 file คือ import_example.py,mylib.py

#!/bin/local/python
#Example 1 [import_example.py]
import mylib
print "count = ",mylib.count

และ

#!/bin/local/python
#Example 2
#Code mylib.py for test import by other module
count = 20 # กำหนดค่า count ไว้เท่ากับ 20

หลังจากทำการ save เป็นที่เรียบร้อย
ทำการ run script import_example.py ใช้คำสั่ง

$ python import_example.py

จะได้ผลลัพธ์เป็น

count = 20

การ install python 2.7 บน window 7

การติดตั้ง python บน window นั้นไม่ได้มีข้อแตกต่างจากการติดตั้งโปรแกรมทั่วไป

เพียงแต่หลังจากติดตั้งแล้ว เพื่อสะดวกในการใช้งาน เราจะทำการ set PATH เพื่อให้สามารถเรียกใช้งาน python

ได้ทุก ๆ path folder

  1.  ทำการ Download Python version 2.7.2 จาก python.org  หากต้องการใช้งาน version อื่นก็มีลักษณะการลงคล้ายคลึงกัน Click Download Python
  2. สำหรับ window เลือก Windows Installer (Windows binary — does not include source)
  3. หลังจาก Download เสร็จแล้ว ทำการติดตั้ง

คลิ๊ก Next

เลือก Path ของ Python27 หากไม่มีการเปลี่ยนแปลง คลิ๊ก Next

กำลังอยู่ในช่วงติดตั้ง

กด Finish เป็นอันติดตั้งเสร็จเรียบร้อย

ที่ Start MENU จะพบโปรแกรมถูกติดตั้งพร้อมใช้งาน

 

ลองทดสอบการ run python shell โดยเปิด terminal จากเมนู run พิมพ์ cmd เมื่อขึ้น prompt พิมพ์ python

จะพบว่า “python ” is not recognized as an internal or external command, operable program or batch file.

เหตุเพราะเรายังไม่ได้ทำการ SET PATH python จึงจะ Run ได้เฉพาะ Folder C:\Python27 เท่านั้น

 

4 .  ทำการ Set PATH

ทำการ set path python ไปที่  Start -> Computer เลือก property Click ขวาพื้นที่ว่างเลือก property

เลือก Advanced system setting

Tab Advance เลือก Environment Variables…

ที่ System variables ที่  variable เลือก <Path> กด Edit…

พิมพ์ ;C:\Python27 ต่อท้าย ซึ่งหากเราลง python version อื่น ให้ระบุ path ของโปรแกรมให้ถูกต้อง

จากนั้นกด O.k. และ กด O.K. ที่  System property เพื่อยืนยันการเปลี่ยนแปลงอีกครั้ง

สั่ง run python shell อีกครั้งผ่าน terminal

เป็นอันเสร็จสิ้นการติดตั้ง

 

ทำความรู้จักกับ python file extension

.py

หลังจากทำการเขียน python script บน editor แล้วทำการบันทึกเป็น *.py ซึ่ง .py เป็น python extension สามารถทำการ สั่ง run ผ่าน python interpreter ได้ เช่น

root@laptop$ python example.py 

.pyc

เป็นcompiled bytecode ซึ่งถูกสร้างจาก python interpreter โดยอัติโนมัติ ด้วยเหตุผลที่ต้องการความรวดเร็วในการ run script หรือเรียกใช้งาน python library หลังจากที่คุณสั่ง run python file script เช่น example_code.py และทำการ import mylibrary ซึ่งเป็น file library ที่เราเขียนเอง มันจะสร้าง mylibrary.pyc ให้ใน directory เดียวกัน
1.สร้าง file example_code.py

#!/usr/bin/python
import mylibrary
print "Example to import mylibrary and check .pyc"

2.สร้าง file mylibrary.py

#!/usr/bin/python
print "This is my library"

3.ทำการ run example_code.py

root@laptop$ python example_code.py 

จะได้ผลลัพธ์เป็น

This is my library
Example to import mylibrary and check .pyc

หากตัว time stamp ของ File mylibrary.py ไม่ได้ถูกเปลี่ยนแปลง เช่น เราไม่ได้แก้ไขอะไรภายใน mylibrary.py ครั้งต่อไปที่เราใช้คำสั่ง python example.py มันก็จะไปเรียกใช้ mylibrary.pyc ซึ่งถูก compiled bytecode ไว้แล้ว ซึ่งจะมีความรวดร็วมากกว่าการ run .py อีกครั้ง

.pyd

เป็น Python Dynamic Module มีลักษณะการทำงานคล้าย dll ของ window จะถูกเรียกใช้งานเมื่อเราทำการ import library เข้าใน script ของเรา เช่น หากเราต้องการ libsvg.pydเปิด file script พิมพ์

import libsvg

.pyo

เป็น compiled bytecode คล้ายกับ .pyc เพียงแต่เป็นการ optimized code สามารถสร้างได้โดยการใส่ option -O

เช่น python -O example_code.py

หากทำตามตัวอย่างข้างบนตามหัวข้อ .pyc เราจะได้ mylibrary.pyo แทน mylibrary.pyc

.pyw

จะมีลักษณะการทำงานเหมือน .py ทุกประการเพียงแต่หากคุณเขียน python ร่วมกับ GUI และไม่ต้องการให้มีหน้าต่าง console สีดำ ๆ มารบกวนใจก็เปลี่ยน file script เป็น .pyw เสียก็เท่านั้น มีประโยชน์มากในการนำ code มา run winodw แล้วไม่ต้องการให้สะดุดตาผู้ใช้ ด้วย terminal console หน้าต่างดำ ๆ นั่นเอง

การสั่ง run python script

หลังจากที่เราทำการเขียน python script บน editor เช่น

gedit , kedit,vi,nano,notepad,notepad++, หรือ อื่น ๆ เป็นที่เรียบร้อย และทำการ save เป็น file.py

การสั่ง Run Script สามารถทำได้อย่างน้อย 2 ทาง คือ

  1. เปิด terminal พิมพ์  python file.py
  2. เปิด terminal พิมพ์ ./file.py   (บน Unix,Linux)

ในหัวข้อที่ 2 อาจติด user permission ต้องปลดล๊อกให้ file สามารถทำการ execute ได้ก่อน

หากใช้งาน linux ubuntu

$ sudo chmod +x file.py

จากนั้น

$ ./file.py

ในหัวข้อที่ 2 ต้องระวังเรื่อง shebang  ให้ดีหาก path ไม่ถูกต้องก็หมดสิทธิ์ run

ส่วนวิธีการอื่นที่ user สามารถใช้งานง่าย แบบ click เดียว run ได้เลยมีมั้ย

คำตอบคือต้องมีอยู่แล้ว ต้องรอวิธีการทำบน UI ซึ่งจะอธิบายในภายภาคหน้า

ในภาคนี้ขอทรมาณคนที่ไม่ค่อยชอบ command line ไปก่อน +555

การประกาศ encode utf-8 เพื่อให้ python coding รองรับกับภาษาไทย

สำหรับ python 2 ค่า default ของระบบแปลภาษาจะอ่านอักขรตามรูปแบบ ASCII หากเราทะลึ่งดึงดันพิมพ์ภาษาไทยลงบน script ไม่พ้นจะฟ้อง error เป็นแน่แท้

#!/usr/bin/python
print "ฉันรักไพธอน"

ซึ่งทำให้ได้ผลลัพธ์เป็น

File “unicode.py”, line 2
SyntaxError: Non-ASCII character ‘\xe0′ in file unicode.py on line 2,
but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

ทางแก้ไขคือการประกาศให้ python รู้จักรูปแบบอักษรแบบ UTF-8 โดยการแทรก #-*-coding: utf-8 -*- ในบรรทัดที่ 2 (เสมอ)

#!/usr/bin/python
#-*-coding: utf-8 -*-
print "ฉันรักไพธอน"

จะได้ผลลัพธ์
********************
ฉันรักไพธอน
********************

ตามต้องการ

Help Function

การดูคำอธิบาย function ใน python shell

เราสามารถที่ศึกษาการใช้งาน function พื้นฐานของระบบได้จาก คำสั่ง help(function)

ตัวอย่างหากต้องการดู function str() ซึ่งแปลงค่า object เป็น string ให้พิมพ์ help(str)

จากนั้นกด Enter

ใช้ pgup , pgdn เพื่อเลื่อนอ่านข้อมูล

กด q เพื่อออกจาก help

python กับ CSV file

python มี library ที่เกี่ยวกับการจัดการ comma-separated values (CSV) file ได้อย่างง่าย ๆ

และ code ที่ค่อนข้างสั้นกระทัดรัด โดยสามารถทำการ read / write file ได้ดังตัวอย่าง

โดยการสร้าง file.csv ซึ่งมีข้อมูล

————————–

red,blue,green

————————–

จากนั้น save และนำ code ข้างล่างไป run ทดสอบ

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

# Example to read and write csv file format
# Date 17.11.2011
# By natee@pythai.org

import os
import csv
#read csv file format
reader = csv.reader(open("file.csv", "rb"))
#write new file
writer = csv.writer(open("newfile.csv", "wb"))
for row in reader:
    new_r = row[0:3]
    print new_r
    #insert new column with 'Yes'
    new_r.append(' Yes')
    print new_r
    writer.writerow(new_r )

หลังจาก run code จะได้ newfile.csv
ซึ่งมีข้อมูล column ‘Yes’ เพิ่มขึ้นมา

————————–

red,blue,green,Yes

————————–

สามารถนำไปประยุกต์ใช้งานต่อยอดกับระบบฐานข้อมูล import/export ได้

*** ข้อมูลที่อ่าน เขียน แต่ละบรรทัด จะเก็บใน list ครับ ***

การเขียน comment บน python script

สำหรับการ comment โปรแกรมนั้นสามารถใช้สัญลักษณ์ # นำหน้าบรรทัดที่เราไม่ต้องการใช้ถูกคอมไพล์หรือใช้สำหรับการเขียนอ้างอิงทั่ว ๆ ไป สำหรับการใช้ # เป็นการ comment ทีละบรรทัด หากเราต้องการ comment หลายบรรทัดติดกันนั้นต้องใช้ triple-quotes (”’) เช่น จะใช้ double quotes ต่อกันสามอันก็ได้

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

print "This is lesson to comment test"
'''This is about your comment
print "Hello"
python comment in this area example the interpreter will be skip compiles'''
print " ทดสอบ คอมเมนต์"

หรือ

จากรูปเป็นตัวอย่างการ comment หลาย ๆ บรรทัดติดกัน ขึ้นเป็นตัวอักษรสีแดง ขึ้นอยู่กับ IDE ที่ใช้งานและการตั้งค่า

ทดสอบการ RUN python shell

Python shell หลังจากที่ติดตั้ง python เป็นที่เรียบร้อย

เราก็ทำการทดสอบการใช้งานโดยการเปิด terminal บน Linux หรือ เมนู RUN พิมพ์ cmd บน window จากนั้นพิมพ์

root:~$ python

ซึ่งจะแสดง python shell ตามข้างล่างนี้


Python 2.7.2+ (default, Oct 4 2011, 20:03:08)

[GCC 4.6.1] on linux2

Type “help”, “copyright”, “credits” or “license” for more information.

>>>

ตัวอย่างเป็นการ run python shell version 2.7.2 (by ubuntu default)

เป็นอันว่าเราสามารถใช้งาน python ได้แล้ว สำหรับผู้ที่ใช้งาน window

หากต้องการ run python ในทุก ๆ path ต้องทำการ set path ก่อน

การยกเลิกและออกจาก python shell

  • สำหรับ Linux & Unix กด ctrl+d หรือ ctrl+c ใช้ keyboardInterrupt
  • สำหรับ window ctrl+z หากไม่สามารถออกได้ลองใช้ quit() ซึ่งให้ผลเหมือนกันคือออกจากโปรแกรม

ทดสอบการเขียนโปรแกรม

>>> msg = ‘Hello pythai’

>>> print msg

Hello pythai

>>>