Created
January 28, 2011 16:36
-
-
Save yurenju/800513 to your computer and use it in GitHub Desktop.
gtk-weather
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
import pygtk | |
pygtk.require ('2.0') | |
import gtk | |
import gobject | |
import pywapi | |
from threading import Thread | |
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() | |
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() | |
class Weather(gtk.Object): | |
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) | |
def register_signals(self): | |
gobject.signal_new("load-cities-completed", | |
Weather, | |
gobject.SIGNAL_RUN_FIRST, | |
gobject.TYPE_NONE, ()) | |
self.connect ("load-cities-completed", self.load_cities_completed) | |
gobject.signal_new("load-weather-completed", | |
Weather, | |
gobject.SIGNAL_RUN_FIRST, | |
gobject.TYPE_NONE, ()) | |
self.connect ("load-weather-completed", self.load_weather_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'])]) | |
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']) | |
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() | |
def on_window_delete_event (self, window, data): | |
gtk.main_quit() | |
if __name__ == "__main__": | |
gobject.type_register(Weather) | |
gtk.gdk.threads_init() | |
weather = Weather() | |
gtk.main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment