SlideShare a Scribd company logo
1 of 92
Download to read offline
Python-GTK Tutorial
   Yuren Ju <yurenju@gmail.com>
請先安裝
●   sudo apt-get install python-pywapi glade
Yuren Ju
●   Yuren's Info Area
●   Hacking Thursday
本份投影片……
●   假設你學過任何一種程式語言
    ●
        特別有可能是 Java
+
Python       GTK+
Python GTK (Hacking Camp)
TIOBE 程式語言社群指標




  Source: TIOBE Software index
?
Source: "Why?", Mike Luckovich, Pulitzer-Winning Political Cartoonist (1 of 4), cc-by-deed
別人怎麼說…
●   適合初學者,但也適合進階開發者
●   高度彈性:從大型專案到小型專案都適合使用
●   you can get the job done




          Source: What is Python and Why Python
Python GTK (Hacking Camp)
對我來說的 Python 優點
●   短小精簡
●   程式碼簡潔
●   快速驗證想法
●   處理工作雜事
    ●
        e.g. 產生報表、字串置換等
Python
Start!




將程式碼寫於檔案中            打開終端機直接鍵入程式
打開你的終端機!




$ python
python command-line
print "Hello World!!"
資料型態
str, int, float, bool, list, dict
數值指定
                          不需要宣告形態

●   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;
list & dict
●   list => 陣列
●   dict => hash table
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]
If, else, for, while
開頭原本是用括號的地方改用冒號
4 個空白或是一個 tab



 if first == True:
     print "Mr. Anderson."
 else:
     print "Welcome back, we missed you."




    結尾不需要括號
list (cont.)
for a in actors:
   print a


for a in actors[2:]:
   print a


print sorted (actors)
del actors[2:]
dict


person = {"name": "Yuren Ju",
         "website": "http://yure...",
          "birthday": "yyyy/mm/dd"}

print person["name"]
print person["website"]
dict


for k in person:
    print "%s: %s" % (k, person[k])

if person.has_key ("age"):
    print "no age attribute"
File Access
●   f = open('your_file')
    ●
        Open file
●   readline()
●   readlines()
來處理些瑣事吧!
COSCUP
●   前天系統爆炸了
●   我發起了一個紀錄爆炸過程的小活動
Python GTK (Hacking Camp)
Python GTK (Hacking Camp)
無法閱讀
Python 上場!
目標
輸出成 HTML 方便閱讀
流程
●   下載 google docs 的 csv 檔案
●   開啟檔案
●   讀取內容
●   切割字串
●   產生 HTML 網頁




             http :/ / j.m p / p yg tk-c osc up
Gen.py
function


def func (arg1, arg2):
    #Do something...
    return ret
奇技淫巧
●   newlist = [n for n in oldlist if n > 50]
●   function return tuple
Editor




將程式碼寫於檔案中
建議
●   Geany
●   Gedit
●   eclipse
●   Of cause~ vim!
Hello-world.py



# -*- coding: utf-8 -*-
print "你好世界!"
line 1


              Python String




Byte String                    Unicode String

  預設                          # -*- coding: utf-8 -*-
gedit
翻譯
http://ajax.googleapis.com/ajax/services/language/translate?
v=1.0&ie=utf8&q=test&langpair=en|zh-tw

http://j.mp/dXYwLT
#!/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
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
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();
                                          }
                                      }
GTK+
GTK+


    Qt               wxWidgets      Windows Form




Android
                            MFC           Swing/AWT
View/Widget/Layout
Python GTK (Hacking Camp)
Cross Platform

         crossing the line, Jkönig, CC BY-NC-SA 2.0
GTK+

C/C++           Python   Perl       Ruby   C#   PHP   ...


        Linux                   Windows         Mac
使用 GTK 的軟 / 硬體




      Nokia n900
#!/usr/bin/env python

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

if __name__ == "__main__":
    window = gtk.Window ();
    window.show ()

    gtk.main ()
Event Handler
widget.connect("signal-name", callback)
#!/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
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
Layout.
layouts, Kemeny_x, CC BY-NC 2.0
GTK+ Layout – box packing
HBox




VBox
Python GTK (Hacking Camp)
HBox   VBox   VBox
pack_start / pack_end


hbox = gtk.HBox()
vbox1 = gtk.VBox()
vbox2 = gtk.VBox()
hbox.pack_start(vbox1)
hbox.pack_start(vbox2)
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()
layout




expand=True   expand=True   expand=False
fill=True     fill=False    fill=False
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()
用程式刻 UI 累了嗎?

 Tired Joy!, Tambako the Jaguar, by-nd
Gtk Builder
Gtk Builder



builder = gtk.Builder ()
builder.add_from_file ("layout.glade")
window = builder.get_object ("window1")
window.show ()

builder.connect_signals (self)
翻譯軟體 – GTK 版本
        ●   拉 UI (glade)
        ●   事件分配 (glade)
        ●   事件分配 (python)
gtk.TextView

                 顯示文字內容
gtk.TextView


                 操作文字:
gtk.TextBuffer   - insert
                 - delete
UI Freeze
Frozen Moment, drinksmachine, by-nc-nd
English   中文




UI Freeze
費時的操作




 UI Freeze
Thread



  嘿 Neo, 又是我
費時的操作




 Thread




          UI update
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"
Communication?




UI part         ?     Thread part
概念
●   繼承 gobject 或 gtk.Object
●   註冊一個信號 (signal)
●   連接此 signal
●   當 Thread 結束後射出 (emit) 此 signal
步驟
●
    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
範例
View               Model
TreeView           ListStore
TreeViewColumn     TreeStore
CellRendererText
Glade




        ListStore
Weather
                                    產生城市列表                   取得城市天氣
selected_city    __init__        load-cities-completed   load-weather-completed


                     Create



                  CitiesThread


        Create


  WeatherThread
__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)
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()
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()
load-cities-completed

def load_cities_completed(self, obj):
    self.cities = self.cities_thread.cities
    self.liststore = self.builder.get_object("cities")
    for city in self.cities:
        self.liststore.append 
            ([city['name'],
            long(city['latitude_e6']),
            long(city['longitude_e6'])])
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'])
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()
gtk-weather.py




 https://gist.github.com/800513
釣竿
●   Dive Into Python 中文版
●   PyGTK 2.0 Tutorial
●   PyGTK 2.0 Reference Manual
●   google "python gtk < 問題關鍵字 >"
●   在 stackoverflow.com 上面找答案

More Related Content

What's hot

Qt Memory Management & Signal and Slots
Qt Memory Management & Signal and SlotsQt Memory Management & Signal and Slots
Qt Memory Management & Signal and SlotsJussi Pohjolainen
 
ClojureScript for the web
ClojureScript for the webClojureScript for the web
ClojureScript for the webMichiel Borkent
 
OpenGurukul : Language : PHP
OpenGurukul : Language : PHPOpenGurukul : Language : PHP
OpenGurukul : Language : PHPOpen Gurukul
 
Gtk development-using-glade-3
Gtk development-using-glade-3Gtk development-using-glade-3
Gtk development-using-glade-3caezsar
 
Concurrent applications with free monads and stm
Concurrent applications with free monads and stmConcurrent applications with free monads and stm
Concurrent applications with free monads and stmAlexander Granin
 
The Ring programming language version 1.5.3 book - Part 25 of 184
The Ring programming language version 1.5.3 book - Part 25 of 184The Ring programming language version 1.5.3 book - Part 25 of 184
The Ring programming language version 1.5.3 book - Part 25 of 184Mahmoud Samir Fayed
 
Untitled presentation(4)
Untitled presentation(4)Untitled presentation(4)
Untitled presentation(4)chan20kaur
 
4Developers 2018: Evolution of C++ Class Design (Mariusz Łapiński)
4Developers 2018: Evolution of C++ Class Design (Mariusz Łapiński)4Developers 2018: Evolution of C++ Class Design (Mariusz Łapiński)
4Developers 2018: Evolution of C++ Class Design (Mariusz Łapiński)PROIDEA
 
OpenGurukul : Language : Python
OpenGurukul : Language : PythonOpenGurukul : Language : Python
OpenGurukul : Language : PythonOpen Gurukul
 
Do you Promise?
Do you Promise?Do you Promise?
Do you Promise?jungkees
 
Hey Kotlin, How it works?
Hey Kotlin, How it works?Hey Kotlin, How it works?
Hey Kotlin, How it works?Chang W. Doh
 
Apache Commons - Don\'t re-invent the wheel
Apache Commons - Don\'t re-invent the wheelApache Commons - Don\'t re-invent the wheel
Apache Commons - Don\'t re-invent the wheeltcurdt
 
Integrazione QML / C++
Integrazione QML / C++Integrazione QML / C++
Integrazione QML / C++Paolo Sereno
 
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6Dmitry Soshnikov
 

What's hot (20)

G T K+ 101
G T K+ 101G T K+ 101
G T K+ 101
 
Qt Memory Management & Signal and Slots
Qt Memory Management & Signal and SlotsQt Memory Management & Signal and Slots
Qt Memory Management & Signal and Slots
 
ClojureScript for the web
ClojureScript for the webClojureScript for the web
ClojureScript for the web
 
OpenGurukul : Language : PHP
OpenGurukul : Language : PHPOpenGurukul : Language : PHP
OpenGurukul : Language : PHP
 
Gtk development-using-glade-3
Gtk development-using-glade-3Gtk development-using-glade-3
Gtk development-using-glade-3
 
Concurrent applications with free monads and stm
Concurrent applications with free monads and stmConcurrent applications with free monads and stm
Concurrent applications with free monads and stm
 
The Ring programming language version 1.5.3 book - Part 25 of 184
The Ring programming language version 1.5.3 book - Part 25 of 184The Ring programming language version 1.5.3 book - Part 25 of 184
The Ring programming language version 1.5.3 book - Part 25 of 184
 
Untitled presentation(4)
Untitled presentation(4)Untitled presentation(4)
Untitled presentation(4)
 
4Developers 2018: Evolution of C++ Class Design (Mariusz Łapiński)
4Developers 2018: Evolution of C++ Class Design (Mariusz Łapiński)4Developers 2018: Evolution of C++ Class Design (Mariusz Łapiński)
4Developers 2018: Evolution of C++ Class Design (Mariusz Łapiński)
 
OpenGurukul : Language : Python
OpenGurukul : Language : PythonOpenGurukul : Language : Python
OpenGurukul : Language : Python
 
Do you Promise?
Do you Promise?Do you Promise?
Do you Promise?
 
Hey Kotlin, How it works?
Hey Kotlin, How it works?Hey Kotlin, How it works?
Hey Kotlin, How it works?
 
Apache Commons - Don\'t re-invent the wheel
Apache Commons - Don\'t re-invent the wheelApache Commons - Don\'t re-invent the wheel
Apache Commons - Don\'t re-invent the wheel
 
Full Stack Clojure
Full Stack ClojureFull Stack Clojure
Full Stack Clojure
 
Integrazione QML / C++
Integrazione QML / C++Integrazione QML / C++
Integrazione QML / C++
 
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
 
OpenGL SC 2.0 Quick Reference
OpenGL SC 2.0 Quick ReferenceOpenGL SC 2.0 Quick Reference
OpenGL SC 2.0 Quick Reference
 
Vulkan 1.1 Reference Guide
Vulkan 1.1 Reference GuideVulkan 1.1 Reference Guide
Vulkan 1.1 Reference Guide
 
Vulkan 1.0 Quick Reference
Vulkan 1.0 Quick ReferenceVulkan 1.0 Quick Reference
Vulkan 1.0 Quick Reference
 
Hadoop + Clojure
Hadoop + ClojureHadoop + Clojure
Hadoop + Clojure
 

Similar to Python GTK (Hacking Camp)

โปรแกรมย่อยและฟังชั่นมาตรฐาน ม.6 1
โปรแกรมย่อยและฟังชั่นมาตรฐาน ม.6 1โปรแกรมย่อยและฟังชั่นมาตรฐาน ม.6 1
โปรแกรมย่อยและฟังชั่นมาตรฐาน ม.6 1Little Tukta Lita
 
Lies Told By The Kotlin Compiler
Lies Told By The Kotlin CompilerLies Told By The Kotlin Compiler
Lies Told By The Kotlin CompilerGarth Gilmour
 
Cluj.py Meetup: Extending Python in C
Cluj.py Meetup: Extending Python in CCluj.py Meetup: Extending Python in C
Cluj.py Meetup: Extending Python in CSteffen Wenz
 
Hack Like It's 2013 (The Workshop)
Hack Like It's 2013 (The Workshop)Hack Like It's 2013 (The Workshop)
Hack Like It's 2013 (The Workshop)Itzik Kotler
 
All I know about rsc.io/c2go
All I know about rsc.io/c2goAll I know about rsc.io/c2go
All I know about rsc.io/c2goMoriyoshi Koizumi
 
Go 1.10 Release Party - PDX Go
Go 1.10 Release Party - PDX GoGo 1.10 Release Party - PDX Go
Go 1.10 Release Party - PDX GoRodolfo Carvalho
 
A Few of My Favorite (Python) Things
A Few of My Favorite (Python) ThingsA Few of My Favorite (Python) Things
A Few of My Favorite (Python) ThingsMichael Pirnat
 
Hands on Session on Python
Hands on Session on PythonHands on Session on Python
Hands on Session on PythonSumit Raj
 
Introduction to Griffon
Introduction to GriffonIntroduction to Griffon
Introduction to GriffonJames Williams
 
Global Interpreter Lock: Episode III - cat &lt; /dev/zero > GIL;
Global Interpreter Lock: Episode III - cat &lt; /dev/zero > GIL;Global Interpreter Lock: Episode III - cat &lt; /dev/zero > GIL;
Global Interpreter Lock: Episode III - cat &lt; /dev/zero > GIL;Tzung-Bi Shih
 
Golang basics for Java developers - Part 1
Golang basics for Java developers - Part 1Golang basics for Java developers - Part 1
Golang basics for Java developers - Part 1Robert Stern
 
Final Project SkeletonCipherClient.javaFinal Project SkeletonC.docx
Final Project SkeletonCipherClient.javaFinal Project SkeletonC.docxFinal Project SkeletonCipherClient.javaFinal Project SkeletonC.docx
Final Project SkeletonCipherClient.javaFinal Project SkeletonC.docxvoversbyobersby
 
PyCon KR 2019 sprint - RustPython by example
PyCon KR 2019 sprint  - RustPython by examplePyCon KR 2019 sprint  - RustPython by example
PyCon KR 2019 sprint - RustPython by exampleYunWon Jeong
 
Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Guillaume Laforge
 
Swift for tensorflow
Swift for tensorflowSwift for tensorflow
Swift for tensorflow규영 허
 

Similar to Python GTK (Hacking Camp) (20)

Python tour
Python tourPython tour
Python tour
 
โปรแกรมย่อยและฟังชั่นมาตรฐาน ม.6 1
โปรแกรมย่อยและฟังชั่นมาตรฐาน ม.6 1โปรแกรมย่อยและฟังชั่นมาตรฐาน ม.6 1
โปรแกรมย่อยและฟังชั่นมาตรฐาน ม.6 1
 
Lies Told By The Kotlin Compiler
Lies Told By The Kotlin CompilerLies Told By The Kotlin Compiler
Lies Told By The Kotlin Compiler
 
Cluj.py Meetup: Extending Python in C
Cluj.py Meetup: Extending Python in CCluj.py Meetup: Extending Python in C
Cluj.py Meetup: Extending Python in C
 
Golang
GolangGolang
Golang
 
Hack Like It's 2013 (The Workshop)
Hack Like It's 2013 (The Workshop)Hack Like It's 2013 (The Workshop)
Hack Like It's 2013 (The Workshop)
 
All I know about rsc.io/c2go
All I know about rsc.io/c2goAll I know about rsc.io/c2go
All I know about rsc.io/c2go
 
Qt Workshop
Qt WorkshopQt Workshop
Qt Workshop
 
Go 1.10 Release Party - PDX Go
Go 1.10 Release Party - PDX GoGo 1.10 Release Party - PDX Go
Go 1.10 Release Party - PDX Go
 
A Few of My Favorite (Python) Things
A Few of My Favorite (Python) ThingsA Few of My Favorite (Python) Things
A Few of My Favorite (Python) Things
 
Hands on Session on Python
Hands on Session on PythonHands on Session on Python
Hands on Session on Python
 
Introduction to Griffon
Introduction to GriffonIntroduction to Griffon
Introduction to Griffon
 
Python for Penetration testers
Python for Penetration testersPython for Penetration testers
Python for Penetration testers
 
C# 6.0 Preview
C# 6.0 PreviewC# 6.0 Preview
C# 6.0 Preview
 
Global Interpreter Lock: Episode III - cat &lt; /dev/zero > GIL;
Global Interpreter Lock: Episode III - cat &lt; /dev/zero > GIL;Global Interpreter Lock: Episode III - cat &lt; /dev/zero > GIL;
Global Interpreter Lock: Episode III - cat &lt; /dev/zero > GIL;
 
Golang basics for Java developers - Part 1
Golang basics for Java developers - Part 1Golang basics for Java developers - Part 1
Golang basics for Java developers - Part 1
 
Final Project SkeletonCipherClient.javaFinal Project SkeletonC.docx
Final Project SkeletonCipherClient.javaFinal Project SkeletonC.docxFinal Project SkeletonCipherClient.javaFinal Project SkeletonC.docx
Final Project SkeletonCipherClient.javaFinal Project SkeletonC.docx
 
PyCon KR 2019 sprint - RustPython by example
PyCon KR 2019 sprint  - RustPython by examplePyCon KR 2019 sprint  - RustPython by example
PyCon KR 2019 sprint - RustPython by example
 
Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008
 
Swift for tensorflow
Swift for tensorflowSwift for tensorflow
Swift for tensorflow
 

More from Yuren Ju

捷克之旅
捷克之旅捷克之旅
捷克之旅Yuren Ju
 
Ksdg customize-your-firefoxos
Ksdg customize-your-firefoxosKsdg customize-your-firefoxos
Ksdg customize-your-firefoxosYuren Ju
 
GNOME3 延伸套件教學
GNOME3 延伸套件教學GNOME3 延伸套件教學
GNOME3 延伸套件教學Yuren Ju
 
Ibus pinyin
Ibus pinyinIbus pinyin
Ibus pinyinYuren Ju
 
Ibus pinyin
Ibus pinyinIbus pinyin
Ibus pinyinYuren Ju
 
Javascript in Linux Desktop
Javascript in Linux DesktopJavascript in Linux Desktop
Javascript in Linux DesktopYuren Ju
 

More from Yuren Ju (6)

捷克之旅
捷克之旅捷克之旅
捷克之旅
 
Ksdg customize-your-firefoxos
Ksdg customize-your-firefoxosKsdg customize-your-firefoxos
Ksdg customize-your-firefoxos
 
GNOME3 延伸套件教學
GNOME3 延伸套件教學GNOME3 延伸套件教學
GNOME3 延伸套件教學
 
Ibus pinyin
Ibus pinyinIbus pinyin
Ibus pinyin
 
Ibus pinyin
Ibus pinyinIbus pinyin
Ibus pinyin
 
Javascript in Linux Desktop
Javascript in Linux DesktopJavascript in Linux Desktop
Javascript in Linux Desktop
 

Recently uploaded

Extra-120324-Visite-Entreprise-icare.pdf
Extra-120324-Visite-Entreprise-icare.pdfExtra-120324-Visite-Entreprise-icare.pdf
Extra-120324-Visite-Entreprise-icare.pdfInfopole1
 
Q4 2023 Quarterly Investor Presentation - FINAL - v1.pdf
Q4 2023 Quarterly Investor Presentation - FINAL - v1.pdfQ4 2023 Quarterly Investor Presentation - FINAL - v1.pdf
Q4 2023 Quarterly Investor Presentation - FINAL - v1.pdfTejal81
 
Technical SEO for Improved Accessibility WTS FEST
Technical SEO for Improved Accessibility  WTS FESTTechnical SEO for Improved Accessibility  WTS FEST
Technical SEO for Improved Accessibility WTS FESTBillieHyde
 
Planetek Italia Srl - Corporate Profile Brochure
Planetek Italia Srl - Corporate Profile BrochurePlanetek Italia Srl - Corporate Profile Brochure
Planetek Italia Srl - Corporate Profile BrochurePlanetek Italia Srl
 
Trailblazer Community - Flows Workshop (Session 2)
Trailblazer Community - Flows Workshop (Session 2)Trailblazer Community - Flows Workshop (Session 2)
Trailblazer Community - Flows Workshop (Session 2)Muhammad Tiham Siddiqui
 
Emil Eifrem at GraphSummit Copenhagen 2024 - The Art of the Possible.pptx
Emil Eifrem at GraphSummit Copenhagen 2024 - The Art of the Possible.pptxEmil Eifrem at GraphSummit Copenhagen 2024 - The Art of the Possible.pptx
Emil Eifrem at GraphSummit Copenhagen 2024 - The Art of the Possible.pptxNeo4j
 
Stobox 4: Revolutionizing Investment in Real-World Assets Through Tokenization
Stobox 4: Revolutionizing Investment in Real-World Assets Through TokenizationStobox 4: Revolutionizing Investment in Real-World Assets Through Tokenization
Stobox 4: Revolutionizing Investment in Real-World Assets Through TokenizationStobox
 
Top 10 Squarespace Development Companies
Top 10 Squarespace Development CompaniesTop 10 Squarespace Development Companies
Top 10 Squarespace Development CompaniesTopCSSGallery
 
GraphSummit Copenhagen 2024 - Neo4j Vision and Roadmap.pptx
GraphSummit Copenhagen 2024 - Neo4j Vision and Roadmap.pptxGraphSummit Copenhagen 2024 - Neo4j Vision and Roadmap.pptx
GraphSummit Copenhagen 2024 - Neo4j Vision and Roadmap.pptxNeo4j
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfCheryl Hung
 
Patch notes explaining DISARM Version 1.4 update
Patch notes explaining DISARM Version 1.4 updatePatch notes explaining DISARM Version 1.4 update
Patch notes explaining DISARM Version 1.4 updateadam112203
 
Explore the UiPath Community and ways you can benefit on your journey to auto...
Explore the UiPath Community and ways you can benefit on your journey to auto...Explore the UiPath Community and ways you can benefit on your journey to auto...
Explore the UiPath Community and ways you can benefit on your journey to auto...DianaGray10
 
EMEA What is ThousandEyes? Webinar
EMEA What is ThousandEyes? WebinarEMEA What is ThousandEyes? Webinar
EMEA What is ThousandEyes? WebinarThousandEyes
 
2024.03.12 Cost drivers of cultivated meat production.pdf
2024.03.12 Cost drivers of cultivated meat production.pdf2024.03.12 Cost drivers of cultivated meat production.pdf
2024.03.12 Cost drivers of cultivated meat production.pdfThe Good Food Institute
 
UiPath Studio Web workshop Series - Day 3
UiPath Studio Web workshop Series - Day 3UiPath Studio Web workshop Series - Day 3
UiPath Studio Web workshop Series - Day 3DianaGray10
 
.NET 8 ChatBot with Azure OpenAI Services.pptx
.NET 8 ChatBot with Azure OpenAI Services.pptx.NET 8 ChatBot with Azure OpenAI Services.pptx
.NET 8 ChatBot with Azure OpenAI Services.pptxHansamali Gamage
 
UiPath Studio Web workshop series - Day 4
UiPath Studio Web workshop series - Day 4UiPath Studio Web workshop series - Day 4
UiPath Studio Web workshop series - Day 4DianaGray10
 
The New Cloud World Order Is FinOps (Slideshow)
The New Cloud World Order Is FinOps (Slideshow)The New Cloud World Order Is FinOps (Slideshow)
The New Cloud World Order Is FinOps (Slideshow)codyslingerland1
 
SIM INFORMATION SYSTEM: REVOLUTIONIZING DATA MANAGEMENT
SIM INFORMATION SYSTEM: REVOLUTIONIZING DATA MANAGEMENTSIM INFORMATION SYSTEM: REVOLUTIONIZING DATA MANAGEMENT
SIM INFORMATION SYSTEM: REVOLUTIONIZING DATA MANAGEMENTxtailishbaloch
 

Recently uploaded (20)

Extra-120324-Visite-Entreprise-icare.pdf
Extra-120324-Visite-Entreprise-icare.pdfExtra-120324-Visite-Entreprise-icare.pdf
Extra-120324-Visite-Entreprise-icare.pdf
 
Q4 2023 Quarterly Investor Presentation - FINAL - v1.pdf
Q4 2023 Quarterly Investor Presentation - FINAL - v1.pdfQ4 2023 Quarterly Investor Presentation - FINAL - v1.pdf
Q4 2023 Quarterly Investor Presentation - FINAL - v1.pdf
 
Technical SEO for Improved Accessibility WTS FEST
Technical SEO for Improved Accessibility  WTS FESTTechnical SEO for Improved Accessibility  WTS FEST
Technical SEO for Improved Accessibility WTS FEST
 
Planetek Italia Srl - Corporate Profile Brochure
Planetek Italia Srl - Corporate Profile BrochurePlanetek Italia Srl - Corporate Profile Brochure
Planetek Italia Srl - Corporate Profile Brochure
 
SheDev 2024
SheDev 2024SheDev 2024
SheDev 2024
 
Trailblazer Community - Flows Workshop (Session 2)
Trailblazer Community - Flows Workshop (Session 2)Trailblazer Community - Flows Workshop (Session 2)
Trailblazer Community - Flows Workshop (Session 2)
 
Emil Eifrem at GraphSummit Copenhagen 2024 - The Art of the Possible.pptx
Emil Eifrem at GraphSummit Copenhagen 2024 - The Art of the Possible.pptxEmil Eifrem at GraphSummit Copenhagen 2024 - The Art of the Possible.pptx
Emil Eifrem at GraphSummit Copenhagen 2024 - The Art of the Possible.pptx
 
Stobox 4: Revolutionizing Investment in Real-World Assets Through Tokenization
Stobox 4: Revolutionizing Investment in Real-World Assets Through TokenizationStobox 4: Revolutionizing Investment in Real-World Assets Through Tokenization
Stobox 4: Revolutionizing Investment in Real-World Assets Through Tokenization
 
Top 10 Squarespace Development Companies
Top 10 Squarespace Development CompaniesTop 10 Squarespace Development Companies
Top 10 Squarespace Development Companies
 
GraphSummit Copenhagen 2024 - Neo4j Vision and Roadmap.pptx
GraphSummit Copenhagen 2024 - Neo4j Vision and Roadmap.pptxGraphSummit Copenhagen 2024 - Neo4j Vision and Roadmap.pptx
GraphSummit Copenhagen 2024 - Neo4j Vision and Roadmap.pptx
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
 
Patch notes explaining DISARM Version 1.4 update
Patch notes explaining DISARM Version 1.4 updatePatch notes explaining DISARM Version 1.4 update
Patch notes explaining DISARM Version 1.4 update
 
Explore the UiPath Community and ways you can benefit on your journey to auto...
Explore the UiPath Community and ways you can benefit on your journey to auto...Explore the UiPath Community and ways you can benefit on your journey to auto...
Explore the UiPath Community and ways you can benefit on your journey to auto...
 
EMEA What is ThousandEyes? Webinar
EMEA What is ThousandEyes? WebinarEMEA What is ThousandEyes? Webinar
EMEA What is ThousandEyes? Webinar
 
2024.03.12 Cost drivers of cultivated meat production.pdf
2024.03.12 Cost drivers of cultivated meat production.pdf2024.03.12 Cost drivers of cultivated meat production.pdf
2024.03.12 Cost drivers of cultivated meat production.pdf
 
UiPath Studio Web workshop Series - Day 3
UiPath Studio Web workshop Series - Day 3UiPath Studio Web workshop Series - Day 3
UiPath Studio Web workshop Series - Day 3
 
.NET 8 ChatBot with Azure OpenAI Services.pptx
.NET 8 ChatBot with Azure OpenAI Services.pptx.NET 8 ChatBot with Azure OpenAI Services.pptx
.NET 8 ChatBot with Azure OpenAI Services.pptx
 
UiPath Studio Web workshop series - Day 4
UiPath Studio Web workshop series - Day 4UiPath Studio Web workshop series - Day 4
UiPath Studio Web workshop series - Day 4
 
The New Cloud World Order Is FinOps (Slideshow)
The New Cloud World Order Is FinOps (Slideshow)The New Cloud World Order Is FinOps (Slideshow)
The New Cloud World Order Is FinOps (Slideshow)
 
SIM INFORMATION SYSTEM: REVOLUTIONIZING DATA MANAGEMENT
SIM INFORMATION SYSTEM: REVOLUTIONIZING DATA MANAGEMENTSIM INFORMATION SYSTEM: REVOLUTIONIZING DATA MANAGEMENT
SIM INFORMATION SYSTEM: REVOLUTIONIZING DATA MANAGEMENT
 

Python GTK (Hacking Camp)

  • 1. Python-GTK Tutorial Yuren Ju <yurenju@gmail.com>
  • 2. 請先安裝 ● sudo apt-get install python-pywapi glade
  • 3. Yuren Ju ● Yuren's Info Area ● Hacking Thursday
  • 4. 本份投影片…… ● 假設你學過任何一種程式語言 ● 特別有可能是 Java
  • 5. + Python GTK+
  • 7. TIOBE 程式語言社群指標 Source: TIOBE Software index
  • 8. ? Source: "Why?", Mike Luckovich, Pulitzer-Winning Political Cartoonist (1 of 4), cc-by-deed
  • 9. 別人怎麼說… ● 適合初學者,但也適合進階開發者 ● 高度彈性:從大型專案到小型專案都適合使用 ● you can get the job done Source: What is Python and Why Python
  • 11. 對我來說的 Python 優點 ● 短小精簡 ● 程式碼簡潔 ● 快速驗證想法 ● 處理工作雜事 ● e.g. 產生報表、字串置換等
  • 13. Start! 將程式碼寫於檔案中 打開終端機直接鍵入程式
  • 17. 資料型態 str, int, float, bool, list, dict
  • 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;
  • 19. list & dict ● list => 陣列 ● dict => hash table
  • 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]
  • 21. If, else, for, while
  • 22. 開頭原本是用括號的地方改用冒號 4 個空白或是一個 tab if first == True: print "Mr. Anderson." else: print "Welcome back, we missed you." 結尾不需要括號
  • 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()
  • 28. COSCUP ● 前天系統爆炸了 ● 我發起了一個紀錄爆炸過程的小活動
  • 33. 流程 ● 下載 google docs 的 csv 檔案 ● 開啟檔案 ● 讀取內容 ● 切割字串 ● 產生 HTML 網頁 http :/ / j.m p / p yg tk-c osc up
  • 35. function def func (arg1, arg2): #Do something... return ret
  • 36. 奇技淫巧 ● newlist = [n for n in oldlist if n > 50] ● function return tuple
  • 38. 建議 ● Geany ● Gedit ● eclipse ● Of cause~ vim!
  • 39. Hello-world.py # -*- coding: utf-8 -*- print "你好世界!"
  • 40. line 1 Python String Byte String Unicode String 預設 # -*- coding: utf-8 -*-
  • 41. gedit
  • 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(); } }
  • 47. GTK+
  • 48. GTK+ Qt wxWidgets Windows Form Android MFC Swing/AWT View/Widget/Layout
  • 50. Cross Platform crossing the line, Jkönig, CC BY-NC-SA 2.0
  • 51. GTK+ C/C++ Python Perl Ruby C# PHP ... Linux Windows Mac
  • 52. 使用 GTK 的軟 / 硬體 Nokia n900
  • 53. #!/usr/bin/env python import pygtk pygtk.require ('2.0') import gtk if __name__ == "__main__": window = gtk.Window (); window.show () gtk.main ()
  • 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
  • 59. GTK+ Layout – box packing
  • 62. HBox VBox VBox
  • 63. pack_start / pack_end hbox = gtk.HBox() vbox1 = gtk.VBox() vbox2 = gtk.VBox() hbox.pack_start(vbox1) hbox.pack_start(vbox2)
  • 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()
  • 65. layout expand=True expand=True expand=False fill=True fill=False fill=False
  • 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()
  • 67. 用程式刻 UI 累了嗎? Tired Joy!, Tambako the Jaguar, by-nd
  • 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
  • 72. UI Freeze Frozen Moment, drinksmachine, by-nc-nd
  • 73. English 中文 UI Freeze
  • 75. Thread 嘿 Neo, 又是我
  • 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"
  • 78. Communication? UI part ? Thread part
  • 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
  • 83. Glade ListStore
  • 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()
  • 88. load-cities-completed def load_cities_completed(self, obj): self.cities = self.cities_thread.cities self.liststore = self.builder.get_object("cities") for city in self.cities: self.liststore.append ([city['name'], long(city['latitude_e6']), long(city['longitude_e6'])])
  • 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 上面找答案