# -*- coding: utf-8 -*- import gtk import webkit from xml.dom import minidom import urllib class RSSFeeder: # Attributes _title = "RSS Feeder" _label_text = "HELLO News" _window = None _toolbar = None _statusbar = None _mainbox = None _label = None _news_button = None _planet_button = None _cool_button = None _fun_button = None _like_button = None _updates_button = None _exit_button = None _feedview = None _feedbox = None _feedview_scroller = None _statusbar_progressbar = None _feedliststore = None _feedtreeview = None _feedcellrenderer = None _feedcelltreeviewcolumn = None _currentbutton = None _currentItems = None # Constants _greenColor = '#00E500' _defaultColor = "#EFEFEF" _redColor = '#FF0000' _feeds_limit = 20 def getFeedURL(self): if self._currentbutton == "news": return "http://www.eltiempo.com/colombia/rss.xml" elif self._currentbutton == "planet": return "http://www.eltiempo.com/deportes/rss.xml" elif self._currentbutton == "cool": return "http://www.eltiempo.com/tecnologia/rss.xml" return "http://www.eltiempo.com/mundo/rss.xml" def exit_button_clicked(self,btn): """ Callback for exit button click """ self.exitApplication() def selectButton(self): self._news_button.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self._defaultColor)) self._planet_button.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self._defaultColor)) self._fun_button.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self._defaultColor)) self._cool_button.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self._defaultColor)) if self._currentbutton == "news": self._news_button.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self._greenColor)) elif self._currentbutton == "planet": self._planet_button.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self._greenColor)) elif self._currentbutton == "cool": self._cool_button.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self._greenColor)) elif self._currentbutton == "fun": self._fun_button.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self._greenColor)) def news_button_clicked(self,btn): """ Callback for news button click """ if self._currentbutton == "news": self.clearCurrentFeeds() else: self._currentbutton = "news" self.selectButton() url = self.getFeedURL() self.load_rss_items(url) def planet_button_clicked(self,btn): """ Callback for planet button click """ if self._currentbutton == "planet": self.clearCurrentFeeds() else: self._currentbutton = "planet" self.selectButton() url = self.getFeedURL() self.load_rss_items(url) def cool_button_clicked(self,btn): """ Callback for cool button click """ if self._currentbutton == "cool": self.clearCurrentFeeds() else: self._currentbutton = "cool" self.selectButton() url = self.getFeedURL() self.load_rss_items(url) def fun_button_clicked(self,btn): """ Callback for fun button click """ if self._currentbutton == "fun": self.clearCurrentFeeds() else: self._currentbutton = "fun" self.selectButton() url = self.getFeedURL() self.load_rss_items(url) def updates_button_clicked(self,btn): """ Callback for updates button click """ if self._currentbutton is not None: url = self.getFeedURL() self.load_rss_items(url) def clearCurrentFeeds(self): self._feedliststore.clear() self._currentbutton = None self._currentItems = None self.selectButton() self._feedview.load_html_string('','') def load_rss_items(self,url): """ Get the RSS items """ connection = urllib.urlopen(url) feed = minidom.parse(connection) connection.close() items = feed.getElementsByTagName('item')[0:self._feeds_limit] self._feedliststore.clear() self._feedview.load_html_string('','') self._currentItems = items for item in items: self._feedliststore.append([item.childNodes[1].childNodes[0].data]) def load_rss_item(self,itemTitle): """ Get the RSS items """ if self._currentItems is not None: for item in self._currentItems: title = item.childNodes[1].childNodes[0].data if title == itemTitle: description = item.childNodes[9].childNodes[0].data content = item.childNodes[13].childNodes[0].data html = """
%s
 
DESCRIPTION
 
%s
 
CONTENT
 
%s """ % ( title, description, content ) self._feedview.load_html_string(html,'') def exitApplication(self): """ Callback for close button """ gtk.main_quit() def destroyWindow(self, widget, data=None): """ Callback for window destroy """ self.exitApplication() def createWindow(self): """ Create window """ self._window = gtk.Window() self._window.set_title(self._title) self._window.connect("destroy", self.destroyWindow) self._window.maximize() def createToolbar(self): """ Create toolbar """ self._toolbar = gtk.HBox() self._label =gtk.Label(self._label_text) self._news_button = gtk.Button("News") self._planet_button = gtk.Button("Planet") self._cool_button = gtk.Button("Cool") self._fun_button = gtk.Button("Fun") self._like_button = gtk.Button("Like") self._updates_button = gtk.Button("Updates") self._exit_button = gtk.Button("Exit") self._toolbar.pack_start(self._label,False,True) self._toolbar.pack_start(gtk.HSeparator(),False,False,5) self._toolbar.pack_start(self._news_button,False) self._toolbar.pack_start(self._planet_button,False) self._toolbar.pack_start(self._cool_button,False) self._toolbar.pack_start(self._fun_button,False) self._toolbar.pack_start(self._like_button,False) self._toolbar.pack_start(gtk.HSeparator(),False,False,5) self._toolbar.pack_start(self._updates_button,False,True) self._toolbar.pack_start(gtk.HSeparator(),False,False,5) self._toolbar.pack_start(self._exit_button,False,True) self._exit_button.connect("clicked",self.exit_button_clicked) self._news_button.connect("clicked",self.news_button_clicked) self._planet_button.connect("clicked",self.planet_button_clicked) self._cool_button.connect("clicked",self.cool_button_clicked) self._fun_button.connect("clicked",self.fun_button_clicked) self._updates_button.connect("clicked",self.updates_button_clicked) self._mainbox.pack_start(self._toolbar,False) self.selectButton() def feedtreeview_click(self,widget): treeselection = self._feedtreeview.get_selection() (model, iter) = treeselection.get_selected() value = self._feedliststore.get_value(iter, 0) self.load_rss_item(value) def createFeedWorkspace(self): """ Create feed view """ self._feedbox = gtk.HBox() self._feedview_scroller = gtk.ScrolledWindow() self._feedview = webkit.WebView() self._feedview_scroller.add(self._feedview) self._feedliststore = gtk.ListStore(str) self._feedtreeview = gtk.TreeView(self._feedliststore) self._feedcellrenderer = gtk.CellRendererText() self._feedcelltreeviewcolumn = gtk.TreeViewColumn( "Latest 20", self._feedcellrenderer, text=0 ) self._feedtreeview.append_column(self._feedcelltreeviewcolumn) self._feedbox.pack_start(self._feedview_scroller) self._feedbox.pack_start(self._feedtreeview,False, padding=5) self._mainbox.pack_start(self._feedbox) self._feedtreeview.connect('cursor-changed', self.feedtreeview_click) def createStatusBar(self): self._statusbar = gtk.HBox() self._statusbar_progressbar = gtk.ProgressBar() self._statusbar.pack_start(self._statusbar_progressbar) self._mainbox.pack_start(self._statusbar, False) def __init__(self): """ Constructor """ # Window self.createWindow() # Main box self._mainbox = gtk.VBox() # Toolbar self.createToolbar() # Feed view self.createFeedWorkspace() # Status bar self.createStatusBar() # Show all self._window.add(self._mainbox) self._window.show_all() # Final adjustments if __name__ == "__main__": rssfeeder = RSSFeeder() gtk.main()