Mais conteúdo relacionado Semelhante a Python GTK (Hacking Camp) (20) Python GTK (Hacking Camp)2. 請先安裝
● sudo apt-get install python-pywapi glade
3. Yuren Ju
● Yuren's Info Area
● Hacking Thursday
9. 別人怎麼說…
● 適合初學者,但也適合進階開發者
● 高度彈性:從大型專案到小型專案都適合使用
● you can get the job done
Source: What is Python and Why Python
18. 數值指定
不需要宣告形態
● String ● Boolean
●
var = "this is String" ●
var = True
● Integer ● Float
●
var = 1 ●
var = 0.1
String var = "this is String";
int var = 1;
boolean var = true;
float var = 0.1;
20. list
● actors = ["Neo", "Smith", "Trinity", "Oracle"]
● mixed = ["hi", "apple", 0, 0.1, False]
● print actors[1]
● actors.append ("Morpheus")
● del actors[1]
● actors.remove ("Oracle")
● actors[-1]
● actors[:2]
● [1,2,3] + [4,5,6]
23. list (cont.)
for a in actors:
print a
for a in actors[2:]:
print a
print sorted (actors)
del actors[2:]
24. dict
person = {"name": "Yuren Ju",
"website": "http://yure...",
"birthday": "yyyy/mm/dd"}
print person["name"]
print person["website"]
25. dict
for k in person:
print "%s: %s" % (k, person[k])
if person.has_key ("age"):
print "no age attribute"
26. File Access
● f = open('your_file')
●
Open file
● readline()
● readlines()
33. 流程
● 下載 google docs 的 csv 檔案
● 開啟檔案
● 讀取內容
● 切割字串
● 產生 HTML 網頁
http :/ / j.m p / p yg tk-c osc up
36. 奇技淫巧
● newlist = [n for n in oldlist if n > 50]
● function return tuple
38. 建議
● Geany
● Gedit
● eclipse
● Of cause~ vim!
40. line 1
Python String
Byte String Unicode String
預設 # -*- coding: utf-8 -*-
44. #!/usr/bin/env python
# -*- coding: utf-8 -*-
from urllib2 import urlopen
from urllib import urlencode
import simplejson
import sys
def translate(text):
sl="zh-tw"
tl="en"
langpair='%s|%s'%(tl,sl)
base_url = 'http://ajax.googleapis.com/ajax/services/language/translate?'
data = urlencode({'v':1.0,'ie': 'UTF8', 'q': text,
'langpair':langpair})
url = base_url+data
urlres = urlopen(url)
json = simplejson.loads(urlres.read())
result = json['responseData']['translatedText']
return result
if __name__ == "__main__":
print translate (sys.argv[1])
https://gist.github.com/801339
45. tw-weather.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pywapi
cities = pywapi.get_cities_from_google('tw', 'zh-tw')
for c in cities:
print "%s: " % (cities.index(c)+1),
print c['name']
num = int (raw_input ("type: "))
city = cities[num-1]
weather = pywapi.get_weather_from_google(',,,%s,%s' % (city['latitude_e6'],
city['longitude_e6']), 'zh-tw')
print "天氣:%s" % weather['current_conditions']['condition'].encode ('utf-8')
print "濕度:%s" % weather['current_conditions']['humidity'].encode ('utf-8')
print "現在溫度:%s" % weather['current_conditions']['temp_c'].encode ('utf-8')
https://gist.github.com/801493
46. Class/Object
#!/usr/bin/env python class FirstClass {
private String[] data;
# -*- coding: utf-8 -*-
public FirstClass() {
class FirstClass: String[] data = {"a", "b", "c"};
this.data = data;
def __init__(self): }
self.data = ["a", "b", "c"]
public void printData() {
for (int i = 0; i < data.length; i++) {
def print_data(self): System.out.println (data[i]);
print self.data }
}
if __name__ == "__main__": public static void main (String[] args) {
f = FirstClass() FirstClass f = new FirstClass();
f.print_data() f.printData();
}
}
48. GTK+
Qt wxWidgets Windows Form
Android
MFC Swing/AWT
View/Widget/Layout
51. GTK+
C/C++ Python Perl Ruby C# PHP ...
Linux Windows Mac
56. #!/usr/bin/env python
import pygtk
pygtk.require ('2.0')
import gtk
def destroy (window):
gtk.main_quit ()
def hello (button):
print "Hello World"
if __name__ == "__main__":
window = gtk.Window ()
window.connect ("destroy", destroy)
window.show ()
button = gtk.Button ("hello");
button.connect ("clicked", hello)
button.show ()
window.add (button)
gtk.main ()
gtk reference - gtk.Button
57. Keep state, using class/object
#!/usr/bin/env python
import pygtk
pygtk.require ('2.0')
import gtk
class HelloWorld:
def __init__ (self):
window = gtk.Window ()
window.connect ("destroy", self.destroy)
window.show ()
button = gtk.Button ("hello");
button.connect ("clicked", self.hello)
button.show ()
window.add (button)
self.position = 0
def destroy (self, window):
gtk.main_quit ()
def hello (self, button):
print "Hello World, position: %d" % self.position
self.position += 1
if __name__ == "__main__":
hello = HelloWorld ()
gtk.main ()
https://gist.github.com/801496
64. window = gtk.Window ()
hbox = gtk.HBox()
vbox1 = gtk.VBox()
vbox2 = gtk.VBox()
hbox.pack_start(vbox1)
hbox.pack_start(vbox2)
label = gtk.Label ("Text: ")
vbox1.pack_start (label)
textview = gtk.TextView ()
vbox1.pack_start (textview)
button_ok = gtk.Button ("OK")
vbox2.pack_end (button_ok)
button_cancel = gtk.Button ("Cancel")
vbox2.pack_end (button_cancel)
hbox.show_all()
window.add(hbox)
window.show()
66. window = gtk.Window ()
hbox = gtk.HBox()
vbox1 = gtk.VBox()
vbox2 = gtk.VBox()
hbox.pack_start(vbox1)
hbox.pack_start(vbox2, expand=False)
label = gtk.Label ("Text: ")
label.set_property('xalign', 0.0)
textview = gtk.TextView ()
vbox1.pack_start (label, expand=False)
vbox1.pack_start (textview)
button_ok = gtk.Button ("OK")
button_cancel = gtk.Button ("Cancel")
vbox2.pack_end (button_ok, expand=False)
vbox2.pack_end (button_cancel, expand=False)
hbox.show_all()
window.add(hbox)
window.show()
69. Gtk Builder
builder = gtk.Builder ()
builder.add_from_file ("layout.glade")
window = builder.get_object ("window1")
window.show ()
builder.connect_signals (self)
70. 翻譯軟體 – GTK 版本
● 拉 UI (glade)
● 事件分配 (glade)
● 事件分配 (python)
71. gtk.TextView
顯示文字內容
gtk.TextView
操作文字:
gtk.TextBuffer - insert
- delete
77. Thread
def translate(text):
...
...
class TransThread (Thread):
def __init__(self, text, obj):
self.text = text
Thread.__init__(self)
def run(self):
try:
self.result =
translate(self.text)
except:
self.result = "error"
79. 概念
● 繼承 gobject 或 gtk.Object
● 註冊一個信號 (signal)
● 連接此 signal
● 當 Thread 結束後射出 (emit) 此 signal
80. 步驟
●
gobject.type_register (Translation)
●
gobject.signal_new("thread-complete",
Translation,
gobject.SIGNAL_RUN_FIRST,
gobject.TYPE_NONE, ())
●
self.connect ("thread-complete",
self.thread_complete)
●
self.obj.emit("thread-complete")
gtk-gtr2.py
82. View Model
TreeView ListStore
TreeViewColumn TreeStore
CellRendererText
84. Weather
產生城市列表 取得城市天氣
selected_city __init__ load-cities-completed load-weather-completed
Create
CitiesThread
Create
WeatherThread
85. __init__
def __init__(self):
self.__gobject_init__()
self.builder = gtk.Builder()
self.builder.add_from_file ("weather.glade")
self.builder.connect_signals(self)
win = self.builder.get_object("window1")
win.show_all()
self.register_signals()
self.cities_thread = CitiesThread(self)
self.cities_thread.start()
self.tree = self.builder.get_object("treeview_cities")
col_name = gtk.TreeViewColumn("city name")
self.tree.append_column(col_name)
cell = gtk.CellRendererText()
col_name.pack_start(cell, True)
col_name.add_attribute(cell, 'text', 0)
self.tree.connect("cursor-changed", self.selected_city)
86. CitiesThread
class CitiesThread(Thread):
def __init__(self, obj):
self.obj = obj
Thread.__init__(self)
def run(self):
self.cities = pywapi.get_cities_from_google('tw', 'zh-tw')
gtk.gdk.threads_enter()
self.obj.emit("load-cities-completed")
gtk.gdk.threads_leave()
87. WeatherThread
class WeatherThread(Thread):
def __init__(self, obj, latitude, longitude):
self.obj = obj
self.latitude = latitude
self.longitude = longitude
Thread.__init__(self)
def run(self):
weather = pywapi.get_weather_from_google(',,,%s,%s' %
(self.latitude, self.longitude),
'zh-tw')
self.weather = {"condition": weather['current_conditions']['condition'],
"humidity": weather['current_conditions']['humidity'],
"temp_c": weather['current_conditions']['temp_c']}
gtk.gdk.threads_enter()
self.obj.emit("load-weather-completed")
gtk.gdk.threads_leave()
89. load-weather-completed
def load_weather_completed(self, obj):
weather = self.weather_thread.weather
self.builder.get_object("label_temperature")
.set_markup ("<span size='xx-large'>溫度:%s</span>"
% weather['temp_c'])
self.builder.get_object("label_current")
.set_label ("現在天氣:%s" % weather['condition'])
self.builder.get_object("label_humidity")
.set_label ("濕度:%s" % weather['humidity'])
90. selected_city
def selected_city(self, tree):
selection = self.tree.get_selection()
(model, iter) = selection.get_selected()
name = model.get_value(iter, 0)
latitude = model.get_value(iter, 1)
longitude = model.get_value(iter, 2)
print "%s (%s, %s)" % (name, latitude, longitude)
self.weather_thread = WeatherThread(self, latitude, longitude)
self.weather_thread.start()
92. 釣竿
● Dive Into Python 中文版
● PyGTK 2.0 Tutorial
● PyGTK 2.0 Reference Manual
● google "python gtk < 問題關鍵字 >"
● 在 stackoverflow.com 上面找答案