Skip to content

Instantly share code, notes, and snippets.

@fabiomontefuscolo
Created September 9, 2017 14:42
Show Gist options
  • Save fabiomontefuscolo/8a437a1de888e9243b7ca93540a272fc to your computer and use it in GitHub Desktop.
Save fabiomontefuscolo/8a437a1de888e9243b7ca93540a272fc to your computer and use it in GitHub Desktop.
ncurses and urwid examples based on https://www.youtube.com/watch?v=eN1eZtjLEnU
#!/usr/bin/python2
import curses
from urllib2 import urlopen
from simplejson import loads
from HTMLParser import HTMLParser
JOKES_API = 'http://api.icndb.com/jokes/random'
def get_new_joke():
resp = urlopen(JOKES_API).read()
data = loads(resp)
joke = data['value']['joke']
joke = HTMLParser().unescape(joke)
return joke
stdscr = curses.initscr()
curses.noecho()
curses.cbreak()
curses.curs_set(0)
if curses.has_colors():
curses.start_color()
curses.init_pair(1, curses.COLOR_RED, curses.COLOR_BLACK)
curses.init_pair(2, curses.COLOR_GREEN, curses.COLOR_BLACK)
curses.init_pair(3, curses.COLOR_BLUE, curses.COLOR_BLACK)
stdscr.addstr('RANDOM QUOTES', curses.A_REVERSE)
stdscr.chgat(-1, curses.A_REVERSE)
stdscr.addstr(curses.LINES - 1, 0, 'Press "R" to get a new quote. "Q" to quit!')
stdscr.chgat(curses.LINES - 1, 7, 1, curses.A_BOLD | curses.color_pair(2))
stdscr.chgat(curses.LINES - 1, 31, 1, curses.A_BOLD | curses.color_pair(1))
quote_window = curses.newwin(curses.LINES - 2, curses.COLS, 1, 0)
quote_text_window = quote_window.subwin(curses.LINES - 6, curses.COLS - 4, 3, 2)
quote_text_window.addstr('Press "R" to get your first quote!')
quote_window.box()
stdscr.noutrefresh()
quote_window.noutrefresh()
curses.doupdate()
while True:
c = quote_window.getch()
if c in (ord('r'), ord('R')):
quote_text_window.clear()
quote_text_window.addstr('Getting quote...', curses.color_pair(3))
quote_text_window.refresh()
quote_text_window.clear()
quote_text_window.addstr(get_new_joke())
elif c in (ord('q'), ord('Q')):
break
stdscr.noutrefresh()
quote_window.noutrefresh()
quote_text_window.noutrefresh()
curses.doupdate()
curses.nocbreak()
curses.echo()
curses.curs_set(1)
curses.endwin()
#!/usr/bin/python2
import urwid
from urllib2 import urlopen
from HTMLParser import HTMLParser
from simplejson import loads
JOKES_API = 'http://api.icndb.com/jokes/random'
palette = [
('titlebar', 'black', 'white'),
('refresh button', 'dark green,bold', 'black'),
('quit button', 'dark red,bold', 'black'),
('getting quote', 'dark blue', 'black'),
]
header_text = urwid.Text(u'RANDOM QUOTES')
header = urwid.AttrMap(header_text, 'titlebar')
menu = urwid.Text([
u'Press (',
('refresh button', u'R'),
u') to get a new quote. Press (',
('quit button', u'Q'),
u') to quit.'
])
quote_text = urwid.Text(u'Press (R) to get your first quote!')
quote_filler = urwid.Filler(quote_text, valign='top', top=1, bottom=1)
v_padding = urwid.Padding(quote_filler, left=1, right=1)
quote_box = urwid.LineBox(v_padding)
layout = urwid.Frame(header=header, body=quote_box, footer=menu)
def get_new_joke():
resp = urlopen(JOKES_API).read()
data = loads(resp)
joke = data['value']['joke']
joke = HTMLParser().unescape(joke)
return joke
def handle_input(key):
if key in ('r', 'R'):
quote_box.base_widget.set_text(
('getting quote', 'Getting new quote...')
)
main_loop.draw_screen()
quote_box.base_widget.set_text(get_new_joke())
elif key in ('q', 'Q'):
raise urwid.ExitMainLoop()
main_loop = urwid.MainLoop(layout, palette, unhandled_input=handle_input)
main_loop.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment