Created
September 9, 2017 14:42
-
-
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
This file contains hidden or 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/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() | |
This file contains hidden or 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/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