Pygtk寫法比較
最近因為修改程式的緣由,接觸了一些高手對於pygtk的程式碼。小弟將他們的寫作風格作一整理放在下面。
這是來自pygtk的範例原始碼:
簡單來說,這個範例裡面使用物件導向的方式來寫。01 #!/usr/bin/env python
02
03 # example helloworld.py
04
05 import pygtk
06pygtk.require('2.0')
07import gtk
08
09 class HelloWorld:
10
11 def hello(self, widget, data=None):
12print "Hello World"
13
14 def delete_event(self, widget, event, data=None):
15
16 print "delete event occurred"
17
18 return False
19
20 def destroy(self, widget, data=None):
21print "destroy signal occurred"
22gtk.main_quit()
23
24 def __init__(self):
25self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
26![]()
27self.window.connect("delete_event", self.delete_event)
28![]()
29self.window.connect("destroy", self.destroy)
30![]()
31self.window.set_border_width(10)
32![]()
33self.button = gtk.Button("Hello World")
34![]()
35self.button.connect("clicked", self.hello, None)
36![]()
37self.button.connect_object("clicked", gtk.Widget.destroy, self.window)
38![]()
39self.window.add(self.button)
40![]()
41self.button.show()
42![]()
43self.window.show()
44
45 def main(self):
46gtk.main()
47
48 if __name__ == "__main__":
49hello = HelloWorld()
50hello.main()
51
先定義幾個callback function
1def hello(self, widget, data=None):
2print "Hello World"
然後呼叫並用window和button承接gtk的Window和Button method執行結果
1
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
2
self.button = gtk.Button("Hello World")
![](http://www.dotblogs.com.tw/Providers/BlogEntryEditor/FCKeditor/editor/dialog/InsertCode/codeimages/InBlock.gif)
2
![](http://www.dotblogs.com.tw/Providers/BlogEntryEditor/FCKeditor/editor/dialog/InsertCode/codeimages/InBlock.gif)
把這些顯示出來的視窗與callback function作連結
1self.button.connect("clicked", self.hello, None)
把按鈕加入到window中
1self.window.add(self.button)
最後把這個視窗顯示出來。
1
self.button.show()
2
self.window.show()
![](http://www.dotblogs.com.tw/Providers/BlogEntryEditor/FCKeditor/editor/dialog/InsertCode/codeimages/InBlock.gif)
2
![](http://www.dotblogs.com.tw/Providers/BlogEntryEditor/FCKeditor/editor/dialog/InsertCode/codeimages/InBlock.gif)
但是Python的物件導向,是選用的。亦及我們不一定要用OO的方式來寫
以下為參考自Lazybuntu的一段程式碼
01def noseeing_yes_no():
02
03 msg="請問您是否要安裝無蝦米輸入法?"
04dlg = gtk.MessageDialog \
05(None, gtk.DIALOG_MODAL, \
06gtk.MESSAGE_QUESTION, \
07gtk.BUTTONS_YES_NO, msg)
08
09 ret = dlg.run ()
10dlg.destroy ()
11if ret == gtk.RESPONSE_YES:
12os.system( 'scripts/noseeing-inst' )
這邊的範例中完全沒有使用物件的方式來寫,只寫了一個方法
用dlg承接gtk.MessageDialog執行的結果
1dlg = 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就好了,非常方便!
如果要複雜一點,這邊還有另外一段程式碼。
01def user_scope (selected_cin):
02dlg = gtk.MessageDialog \
03(None, gtk.DIALOG_MODAL, \
04gtk.MESSAGE_QUESTION, \
05gtk.BUTTONS_OK)
06dlg.set_markup ('請選擇您的輸入法設定要套用的使用者範圍:')
07
08 currectuser_btn=gtk.RadioButton (None, '只套用到我自己')
09dlg.vbox.pack_start (currectuser_btn, False, True, 2)
10alluser_btn =gtk.RadioButton (currectuser_btn ,'套用到所有使用者')
11dlg.vbox.pack_start (alluser_btn, False, True, 2)
12seluser_btn =gtk.RadioButton (currectuser_btn ,'選擇套用的使用者')
13dlg.vbox.pack_start (seluser_btn, False, True, 2)
14
15 dlg.vbox.show_all ()
16
17 ret = dlg.run ()
18currectuser = currectuser_btn.get_active()
19alluser = alluser_btn.get_active()
20seluser = seluser_btn.get_active()
21
22 dlg.destroy ()
23if ret != gtk.RESPONSE_OK:
24return False
25while gtk.events_pending ():
26gtk.main_iteration ()
27
28 if currectuser:
29print "套用輸入法設定到當前使用者..."
30ims_cmd = "su -c \"im-switch -s %s\" %s" % (selected_cin, os.environ['REAL_USER'])
31os.system(ims_cmd)
32
33 elif alluser:
34print "套用輸入法設定到所有使用者..."
35ims_cmd = "sudo im-switch -s %s" % (selected_cin)
36os.system(ims_cmd)
37elif seluser:
38sel_users(selected_cin)
這段程式碼一樣,dlg承接gtk.MessageDialog執行結果後
1
dlg = gtk.MessageDialog \
2
(None, gtk.DIALOG_MODAL, \
3
gtk.MESSAGE_QUESTION, \
4
gtk.BUTTONS_OK)
![](http://www.dotblogs.com.tw/Providers/BlogEntryEditor/FCKeditor/editor/dialog/InsertCode/codeimages/InBlock.gif)
2
![](http://www.dotblogs.com.tw/Providers/BlogEntryEditor/FCKeditor/editor/dialog/InsertCode/codeimages/InBlock.gif)
3
![](http://www.dotblogs.com.tw/Providers/BlogEntryEditor/FCKeditor/editor/dialog/InsertCode/codeimages/InBlock.gif)
4
![](http://www.dotblogs.com.tw/Providers/BlogEntryEditor/FCKeditor/editor/dialog/InsertCode/codeimages/InBlock.gif)
新增一些Radio button
1currectuser_btn=gtk.RadioButton (None, '只套用到我自己')
2dlg.vbox.pack_start (currectuser_btn, False, True, 2)
3alluser_btn =gtk.RadioButton (currectuser_btn ,'套用到所有使用者')
4dlg.vbox.pack_start (alluser_btn, False, True, 2)
5.....
建構出相應的按鈕,最後使用
1currectuser = currectuser_btn.get_active()
收集按鈕被按下的狀況,並且執行相對應的指令。
另外也要注意,官網範例的寫法是當按鈕按下的時候就會執行,而後面的範例則是在點下"YES"的同時才會抓取狀態來跑。
參考以上的範例可以了解,pygtk不一定要與官網範例相同寫成物件導向。當然物件導向有其便利性所在,但如果只是小程式的話,寫成function也是很棒的選擇。希望大家也可以開心的用簡單的方式來寫pygtk!