Skip to content

Instantly share code, notes, and snippets.

@yurenju
Created January 28, 2011 16:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yurenju/800513 to your computer and use it in GitHub Desktop.
Save yurenju/800513 to your computer and use it in GitHub Desktop.
gtk-weather
#!/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