Advertisement
steve-shambles-2109

RSS News-feed reader GUI V1.61

Nov 24th, 2019
782
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.35 KB | None | 0 0
  1. """RSS News-feed reader GUI V1.61.
  2.  
  3. By Steve Shambles Sept 2018
  4. Updated Nov 2019
  5. stevepython.wordpress.com
  6.  
  7. pip3 install beautifulsoup4
  8. """
  9. import sys
  10. from tkinter import BOTTOM, Button, LabelFrame, Listbox, Menu, messagebox
  11. from tkinter import  RIGHT, Scrollbar, Tk, X, Y
  12. import urllib.request
  13. from urllib.request import urlopen
  14. import webbrowser
  15. import xml.etree.ElementTree as  ElementTree
  16.  
  17. from bs4 import BeautifulSoup as soup
  18.  
  19. root = Tk()
  20. root.title('NewsBox V1.61')
  21.  
  22. if sys.platform.startswith('win'):
  23.     root.geometry('464x632')
  24.     root.resizable(False, False)
  25. else:
  26.     root.geometry('517x663')
  27.  
  28.  
  29. def sky_btn():
  30.     """When sky button clicked. Clear listbox, fill with news."""
  31.     list_box.delete('0', 'end')
  32.     skysports_url = 'https://www.skysports.com/rss/12040'
  33.     skysports_news(skysports_url)
  34.  
  35. def fox_btn():
  36.     """When fox button clicked. Clear listbox, fill with news."""
  37.     list_box.delete('0', 'end')
  38.     foxsports_url = 'https://api.foxsports.com/v1/'  \
  39.                     'rss?partnerKey=zBaFxRyGKCfxBagJG9b8pqLyndmvo7UU'
  40.     foxsports_news(foxsports_url)
  41.  
  42. def buzz_btn():
  43.     """When buzz button clicked. Clear listbox, fill with news."""
  44.     list_box.delete('0', 'end')
  45.     buzz_url = 'https://www.buzzfeed.com/world.xml'
  46.     buzz_news(buzz_url)
  47.  
  48. def ny_btn():
  49.     """When nytimes button clicked. Clear listbox, fill with news."""
  50.     list_box.delete('0', 'end')
  51.     nytimes_url = 'https://www.nytimes.com/svc/collections/v1/publish/'  \
  52.                   'https://www.nytimes.com/section/world/rss.xml'
  53.     nytimes_news(nytimes_url)
  54.  
  55. def bbc_btn():
  56.     """When bbc button clicked. Clear listbox, fill with news."""
  57.     list_box.delete('0', 'end')
  58.     bbc_news()
  59.  
  60. def google_btn():
  61.     """When google button clicked. Clear listbox, fill with news."""
  62.     list_box.delete('0', 'end')
  63.     google_url = 'https://news.google.com/news/rss/?ned=uk&gl=US&hl=en'
  64.     google_news(google_url)
  65.  
  66. def skysports_news(xml_news_url):
  67.     """Retrieve and display skysports news in listbox from RSS feed."""
  68.     gnews_client = urlopen(xml_news_url)
  69.     xml_page = gnews_client.read()
  70.     gnews_client.close()
  71.  
  72.     soup_page = soup(xml_page, 'xml')
  73.     news_list = soup_page.findAll('item')
  74.     list_box.insert('end', '                                    SKY SPORTS HEADLINES')
  75.     list_box.itemconfig('end', {'bg': 'dodgerblue'})
  76.     list_box.insert('end', ' ' *85)
  77.  
  78.     for skysports_news in news_list:
  79.         PDate = (skysports_news.pubDate.text)
  80.         list_box.insert('end', PDate)
  81.         Tit = (skysports_news.title.text)
  82.         list_box.insert('end', Tit)
  83.         Lnk = (skysports_news.link.text)
  84.         list_box.insert('end', Lnk)
  85.         list_box.itemconfig('end', {'fg': 'blue'})
  86.         list_box.insert('end', '-' *85)
  87.  
  88. def foxsports_news(xml_news_url):
  89.     """Retrieve and display foxsports news in listbox from RSS feed."""
  90.     gnews_client = urlopen(xml_news_url)
  91.     xml_page = gnews_client.read()
  92.     gnews_client.close()
  93.  
  94.     soup_page = soup(xml_page, 'xml')
  95.     news_list = soup_page.findAll('item')
  96.     list_box.insert('end', '                                 FOX SPORTS NEWS HEADLINES')
  97.     list_box.itemconfig('end', {'bg': 'orange'})
  98.     list_box.insert('end', ' ' *85)
  99.  
  100.     for foxsports_news in news_list:
  101.         PDate = (foxsports_news.pubDate.text)
  102.         list_box.insert('end', PDate)
  103.         Tit = (foxsports_news.title.text)
  104.         list_box.insert('end', Tit)
  105.         Lnk = (foxsports_news.link.text)
  106.         list_box.insert('end', Lnk)
  107.         list_box.itemconfig('end', {'fg': 'blue'})
  108.         list_box.insert('end', '-' *85)
  109.  
  110. def buzz_news(xml_news_url):
  111.     """Retrieve and display buzzfeed news in listbox from RSS feed."""
  112.     gnews_client = urlopen(xml_news_url)
  113.     xml_page = gnews_client.read()
  114.     gnews_client.close()
  115.  
  116.     soup_page = soup(xml_page, 'xml')
  117.     news_list = soup_page.findAll('item')
  118.     list_box.insert('end', '                                 BUZZFEED NEWS HEADLINES')
  119.     list_box.itemconfig('end', {'bg': 'salmon'})
  120.     list_box.insert('end', ' ' *85)
  121.  
  122.     for buzz_news in news_list:
  123.         PDate = (buzz_news.pubDate.text)
  124.         list_box.insert('end', PDate)
  125.         Tit = (buzz_news.title.text)
  126.         list_box.insert('end', Tit)
  127.         Lnk = (buzz_news.link.text)
  128.         list_box.insert('end', Lnk)
  129.         list_box.itemconfig('end', {'fg': 'blue'})
  130.         list_box.insert('end', '-' *85)
  131.  
  132. def nytimes_news(xml_news_url):
  133.     """Retrieve and display nytimes news in listbox from RSS feed."""
  134.     gnews_client = urlopen(xml_news_url)
  135.     xml_page = gnews_client.read()
  136.     gnews_client.close()
  137.  
  138.     soup_page = soup(xml_page, 'xml')
  139.     news_list = soup_page.findAll('item')
  140.     list_box.insert('end', '                             NEW YORK TIMES NEWS HEADLINES')
  141.     list_box.itemconfig('end', {'bg': 'green2'})
  142.     list_box.insert('end', ' ' *85)
  143.  
  144.     for nytimes_news in news_list:
  145.         PDate = (nytimes_news.pubDate.text)
  146.         list_box.insert('end', PDate)
  147.         Tit = (nytimes_news.title.text)
  148.         list_box.insert('end', Tit)
  149.         Lnk = (nytimes_news.link.text)
  150.         list_box.insert('end', Lnk)
  151.         list_box.itemconfig('end', {'fg': 'blue'})
  152.         list_box.insert('end', '-' *85)
  153.  
  154. def google_news(xml_news_url):
  155.     """Retrieve and display google news in listbox from RSS feed."""
  156.     gnews_client = urlopen(xml_news_url)
  157.     xml_page = gnews_client.read()
  158.     gnews_client.close()
  159.  
  160.     soup_page = soup(xml_page, 'xml')
  161.     news_list = soup_page.findAll('item')
  162.     list_box.insert('end', '                                  GOOGLE NEWS HEADLINES')
  163.     list_box.itemconfig('end', {'bg': 'gold'})
  164.     list_box.insert('end', ' ' *85)
  165.  
  166.     for google_news in news_list:
  167.         PDate = (google_news.pubDate.text)
  168.         list_box.insert('end', PDate)
  169.         Tit = (google_news.title.text)
  170.         list_box.insert('end', Tit)
  171.         Lnk = (google_news.link.text)
  172.         list_box.insert('end', Lnk)
  173.         list_box.itemconfig('end', {'fg': 'blue'})
  174.         list_box.insert('end', '-' *85)
  175.  
  176. def bbc_news():
  177.     """Retrieve and display bbc news in listbox from RSS feed."""
  178.     bbc_url = 'http://feeds.bbci.co.uk/news/world/rss.xml'
  179.     REQ = urllib.request.urlopen(bbc_url)
  180.     PAGE = REQ.read()
  181.     DOC = ElementTree.fromstring(PAGE)
  182.     list_box.insert('end', '                               BBC WORLD NEWS HEADLINES')
  183.     list_box.itemconfig('end', {'bg': 'plum'})
  184.     list_box.insert('end', ' ' *85)
  185.  
  186.     for item in DOC.iter('item'):
  187.         title = item.find('title').text
  188.         pubDate = item.find('pubDate').text
  189.         list_box.insert('end', pubDate)
  190.         list_box.insert('end', title)
  191.         link = item.find('link').text
  192.         list_box.insert('end', link)
  193.         list_box.itemconfig('end', {'fg': 'blue'})
  194.         list_box.insert('end', '-' *85)
  195.  
  196. def double_clicked(event):
  197.     """Double clicked mouse on an item"""
  198.     ev_w = event.widget
  199.     idx = int(ev_w.curselection()[0])
  200.     value = ev_w.get(idx)
  201.     # Check is a url.
  202.     if 'http' in value:
  203.         webbrowser.open(value)
  204.  
  205. def about_menu():
  206.     """About program pop up."""
  207.     messagebox.showinfo('About', 'NewsBox V1.61.\n'
  208.                         'By Steve Shambles.\n'
  209.                         'Sept 2018.\n'
  210.                         'Updated Nov 2019.')
  211.  
  212. def visit_blog():
  213.     """Visit my blog, you know it makes sense."""
  214.     webbrowser.open('https://stevepython.wordpress.com/')
  215.  
  216. # Create 2 frames.
  217. btn_frame = LabelFrame(root)
  218. btn_frame.grid(row=0, column=0)
  219.  
  220. listbox_frame = LabelFrame(root)
  221. listbox_frame.grid(padx=8, pady=8)
  222.  
  223. # Drop-down menu.
  224. MENU_BAR = Menu(root)
  225. FILE_MENU = Menu(MENU_BAR, tearoff=0)
  226. MENU_BAR.add_cascade(label='Menu', menu=FILE_MENU)
  227. FILE_MENU.add_command(label='Visit Blog', command=visit_blog)
  228. FILE_MENU.add_separator()
  229. FILE_MENU.add_command(label='About', command=about_menu)
  230. FILE_MENU.add_command(label='Exit', command=root.destroy)
  231. root.config(menu=MENU_BAR)
  232.  
  233. # Buttons.
  234. bbc_btn = Button(btn_frame, bg='plum', text='  BBC News  ', command=bbc_btn)
  235. bbc_btn.grid(row=0, column=0, pady=4, padx=4)
  236.  
  237. google_btn = Button(btn_frame, bg='gold', text='Google News', command=google_btn)
  238. google_btn.grid(row=0, column=1, pady=4, padx=4)
  239.  
  240. nytimes_btn = Button(btn_frame, bg='green2', text=' NY Times  ', command=ny_btn)
  241. nytimes_btn.grid(row=0, column=2, pady=4, padx=4)
  242.  
  243. sky_btn = Button(btn_frame, bg='dodgerblue', text=' Sky Sports  ', command=sky_btn)
  244. sky_btn.grid(row=1, column=0, pady=4, padx=4)
  245.  
  246. foxsports_btn = Button(btn_frame, bg='orange', text='  Fox Sports ', command=fox_btn)
  247. foxsports_btn.grid(row=1, column=1, pady=4, padx=4)
  248.  
  249. buzz_btn = Button(btn_frame, bg='salmon', text=' BuzzFeed  ', command=buzz_btn)
  250. buzz_btn.grid(row=1, column=2, pady=4, padx=4)
  251.  
  252. # Listbox with scrollbars.
  253. list_box = Listbox(
  254.     master=listbox_frame,
  255.     selectmode='single',
  256.     width=60,
  257.     height=30,
  258.     fg='black',
  259.     bg='skyblue')
  260.  
  261. sbar_vert = Scrollbar(listbox_frame, orient='vertical')
  262. sbar_vert.pack(side=RIGHT, fill=Y)
  263. list_box.configure(yscrollcommand=sbar_vert.set)
  264. sbar_vert.configure(command=list_box.yview)
  265.  
  266. sbar_hor = Scrollbar(listbox_frame, orient='horizontal')
  267. sbar_hor.pack(side=BOTTOM, fill=X)
  268. list_box.configure(xscrollcommand=sbar_hor.set)
  269. sbar_hor.configure(command=list_box.xview)
  270.  
  271. list_box.pack()
  272. list_box.bind('<Double-1>', double_clicked)
  273.  
  274. root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement