星期六, 十二月 20, 2008

Pygtk寫作風格探討

0 意見

最近因為修改程式的緣由,接觸了一些高手對於pygtk的程式碼。小弟將他們的寫作風格作一整理放在下面。(註:由於此處筆者未設定好,造成無法突顯python程式碼重要之縮排特性,僅此致歉。)


這是來自pygtk的範例原始碼:


#!/usr/bin/env python

# example helloworld.py

import pygtk
pygtk.require('2.0')
import gtk

class HelloWorld:

def hello(self, widget, data=None):
print "Hello World"

def delete_event(self, widget, event, data=None):

print "delete event occurred"

return False

def destroy(self, widget, data=None):
print "destroy signal occurred"
gtk.main_quit()

def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)

self.window.connect("delete_event", self.delete_event)

self.window.connect("destroy", self.destroy)

self.window.set_border_width(10)

self.button = gtk.Button("Hello World")

self.button.connect("clicked", self.hello, None)

self.button.connect_object("clicked", gtk.Widget.destroy, self.window)

self.window.add(self.button)

self.button.show()

self.window.show()

def main(self):
gtk.main()

if __name__ == "__main__":
hello = HelloWorld()
hello.main()

簡單來說,這個範例裡面使用物件導向的方式來寫。
先定義幾個callback function

def hello(self, widget, data=None):
print "Hello World"
然後呼叫並用window和button承接gtk的Window和Button method執行結果

self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.button = gtk.Button("Hello World")
把這些顯示出來的視窗與callback function作連結

self.button.connect("clicked", self.hello, None)
把按鈕加入到window中

self.window.add(self.button)
最後把這個視窗顯示出來。

self.button.show()
self.window.show()
但是Python的物件導向,是選用的。亦及我們不一定要用OO的方式來寫
以下為參考自Lazybuntu的一段程式碼

def noseeing_yes_no():
   msg="請問您是否要安裝無蝦米輸入法?"
dlg = gtk.MessageDialog \
(None, gtk.DIALOG_MODAL, \
gtk.MESSAGE_QUESTION, \
gtk.BUTTONS_YES_NO, msg)

ret = dlg.run ()
dlg.destroy ()
if ret == gtk.RESPONSE_YES:
os.system( 'scripts/noseeing-inst' )

這邊的範例中完全沒有使用物件的方式來寫,只寫了一個方法
用dlg承接gtk.MessageDialog執行的結果dlg = gtk.MessageDialog (None, gtk.DIALOG_MODAL, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, msg )

來建構視窗,然後簡單的用dlg.run()讓他跑出來。收集傳回值ret來執行相對應的程式碼。
附帶一提,如果希望按鈕只有YES而不是YES與NO,那麼把gtk.BUTTONS_YES_NO更換為gtk.BUTTONS_YES就好了,非常方便!

如果要複雜一點,這邊還有另外一段程式碼。
def user_scope (selected_cin):
dlg = gtk.MessageDialog \
(None, gtk.DIALOG_MODAL, \
gtk.MESSAGE_QUESTION, \
gtk.BUTTONS_OK)
dlg.set_markup ('請選擇您的輸入法設定要套用的使用者範圍:')

currectuser_btn=gtk.RadioButton (None, '只套用到我自己')
dlg.vbox.pack_start (currectuser_btn, False, True, 2)
alluser_btn =gtk.RadioButton (currectuser_btn ,'套用到所有使用者')
dlg.vbox.pack_start (alluser_btn, False, True, 2)
seluser_btn =gtk.RadioButton (currectuser_btn ,'選擇套用的使用者')
dlg.vbox.pack_start (seluser_btn, False, True, 2)

dlg.vbox.show_all ()

ret = dlg.run ()
currectuser = currectuser_btn.get_active()
alluser = alluser_btn.get_active()
seluser = seluser_btn.get_active()

dlg.destroy ()
if ret != gtk.RESPONSE_OK:
return False
while gtk.events_pending ():
gtk.main_iteration ()

if currectuser:
print "套用輸入法設定到當前使用者..."
ims_cmd = "su -c \"im-switch -s %s\" %s" % (selected_cin, os.environ['REAL_USER'])
os.system(ims_cmd)

elif alluser:
print "套用輸入法設定到所有使用者..."
ims_cmd = "sudo im-switch -s %s" % (selected_cin)
os.system(ims_cmd)
elif seluser:
sel_users(selected_cin)
這段程式碼一樣,dlg承接gtk.MessageDialog執行結果後

currectuser_btn=gtk.RadioButton (None, '只套用到我自己')
dlg.vbox.pack_start (currectuser_btn, False, True, 2)
alluser_btn =gtk.RadioButton (currectuser_btn ,'套用到所有使用者')
dlg.vbox.pack_start (alluser_btn, False, True, 2)
.....

建構出相應的按鈕,最後使用

currectuser = currectuser_btn.get_active()


收集按鈕被按下的狀況,並且執行相對應的指令。

另外也要注意,官網範例的寫法是當按鈕按下的時候就會執行,而後面的範例則是在點下"YES"的同時才會抓取狀態來跑。

參考以上的範例可以了解,pygtk不一定要與官網範例相同寫成物件導向。當然物件導向有其便利性所在,但如果只是小程式的話,寫成function也是很棒的選擇。希望大家也可以開心的用簡單的方式來寫pygtk!


深入閱讀......

星期六, 十二月 13, 2008

連署支持公視

4 意見

小弟相當喜歡觀看公視的節目,如有話好說,獨立特派員,以及公視新聞等。公視雖是政府資助,但由於政府需編列預算,且不能介入營運,因此始終可以針對政府疏失針砭時政。且如有話好說節目,來賓常為社會運動者或學者,對於問題的本質更能深入探討。在新聞方面,公視常常報導商業媒體不願報導之新聞,對於市井小民之生活常有極大幫助。也常常看到公視前往採訪弱勢團體,替弱勢團體發聲。

但最近國民黨籍立委以公視"過綠"之由,凍結公視預算,小弟深感不齒。若有週遭朋友喜歡觀賞公視優質節目者,可來底下連結連署支持公共電視。

http://www.pts.org.tw/php/petition/index.php

深入閱讀......

2008 酷學園群英會 - " Green IT !! "

0 意見


又到了重要時刻,期待已久的 酷學園群英會 來了
今年的主題是目前正夯的
"Green IT"
堅強的師資及豐富的議程,絕對讓大家不虛此行
廢話不多說,快去報名吧!



地點:國立臺灣大學工學院應用力學研究所國際會議廳
   106 台北市羅斯福路4段1號

地理位置/交通路線:
應力所交通公車資料
開車交通資訊
應力所位置地圖下載

主辦單位:酷學園

贊助單位:巨匠電腦

友情贊助:台灣科技大學資訊工程系學會,光華 - 益大書局
鳥哥的 Linux 私房菜魔力門三秒練功房FTUGJerry_IT 資訊技術手札

費用: 0 -

活動報名網址:
http://registrano.com/events/2008-study-area

本次活動,有報名者優先入席,當天報名者則需工作人員視情況開放進場
唯當天報名者不保證有座位,若人數過多現場可能將採人數管制



深入閱讀......

企鵝不會暈到死-投影片

0 意見

上次應ubuntu-tw之邀到台中與台南分享Linux的學習經驗,此為該講之投影片。
茲提供於此,希望有興趣學習Linux的朋友可以參考。

以下分別為odp格式與pdf格式的投影片:
odp pdf
深入閱讀......