diff options
Diffstat (limited to 'examples/tour.py')
-rwxr-xr-x | examples/tour.py | 333 |
1 files changed, 333 insertions, 0 deletions
diff --git a/examples/tour.py b/examples/tour.py new file mode 100755 index 0000000..55211b3 --- /dev/null +++ b/examples/tour.py @@ -0,0 +1,333 @@ +#!/usr/bin/python +# +# Urwid tour. It slices, it dices.. +# Copyright (C) 2004-2011 Ian Ward +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# Urwid web site: http://excess.org/urwid/ + +""" +Urwid tour. Shows many of the standard widget types and features. +""" + +import urwid +import urwid.raw_display +import urwid.web_display + +def main(): + text_header = (u"Welcome to the urwid tour! " + u"UP / DOWN / PAGE UP / PAGE DOWN scroll. F8 exits.") + text_intro = [('important', u"Text"), + u" widgets are the most common in " + u"any urwid program. This Text widget was created " + u"without setting the wrap or align mode, so it " + u"defaults to left alignment with wrapping on space " + u"characters. ", + ('important', u"Change the window width"), + u" to see how the widgets on this page react. " + u"This Text widget is wrapped with a ", + ('important', u"Padding"), + u" widget to keep it indented on the left and right."] + text_right = (u"This Text widget is right aligned. Wrapped " + u"words stay to the right as well. ") + text_center = u"This one is center aligned." + text_clip = (u"Text widgets may be clipped instead of wrapped.\n" + u"Extra text is discarded instead of wrapped to the next line. " + u"65-> 70-> 75-> 80-> 85-> 90-> 95-> 100>\n" + u"Newlines embedded in the string are still respected.") + text_right_clip = (u"This is a right aligned and clipped Text widget.\n" + u"<100 <-95 <-90 <-85 <-80 <-75 <-70 <-65 " + u"Text will be cut off at the left of this widget.") + text_center_clip = (u"Center aligned and clipped widgets will have " + u"text cut off both sides.") + text_any = (u"The 'any' wrap mode will wrap on any character. This " + u"mode will not collapse space characters at the end of the " + u"line but it still honors embedded newline characters.\n" + u"Like this one.") + text_padding = (u"Padding widgets have many options. This " + u"is a standard Text widget wrapped with a Padding widget " + u"with the alignment set to relative 20% and with its width " + u"fixed at 40.") + text_divider = [u"The ", ('important', u"Divider"), + u" widget repeats the same character across the whole line. " + u"It can also add blank lines above and below."] + text_edit = [u"The ", ('important', u"Edit"), + u" widget is a simple text editing widget. It supports cursor " + u"movement and tries to maintain the current column when focus " + u"moves to another edit widget. It wraps and aligns the same " + u"way as Text widgets." ] + text_edit_cap1 = ('editcp', u"This is a caption. Edit here: ") + text_edit_text1 = u"editable stuff" + text_edit_cap2 = ('editcp', u"This one supports newlines: ") + text_edit_text2 = (u"line one starts them all\n" + u"== line 2 == with some more text to edit.. words.. whee..\n" + u"LINE III, the line to end lines one and two, unless you " + u"change something.") + text_edit_cap3 = ('editcp', u"This one is clipped, try " + u"editing past the edge: ") + text_edit_text3 = u"add some text here -> -> -> ...." + text_edit_alignments = u"Different Alignments:" + text_edit_left = u"left aligned (default)" + text_edit_center = u"center aligned" + text_edit_right = u"right aligned" + text_intedit = ('editcp', [('important', u"IntEdit"), + u" allows only numbers: "]) + text_edit_padding = ('editcp', u"Edit widget within a Padding widget ") + text_columns1 = [('important', u"Columns"), + u" are used to share horizontal screen space. " + u"This one splits the space into two parts with " + u"three characters between each column. The " + u"contents of each column is a single widget."] + text_columns2 = [u"When you need to put more than one " + u"widget into a column you can use a ",('important', + u"Pile"), u" to combine two or more widgets."] + text_col_columns = u"Columns may be placed inside other columns." + text_col_21 = u"Col 2.1" + text_col_22 = u"Col 2.2" + text_col_23 = u"Col 2.3" + text_column_widths = (u"Columns may also have uneven relative " + u"weights or fixed widths. Use a minimum width so that " + u"columns don't become too small.") + text_weight = u"Weight %d" + text_fixed_9 = u"<Fixed 9>" # should be 9 columns wide + text_fixed_14 = u"<--Fixed 14-->" # should be 14 columns wide + text_edit_col_cap1 = ('editcp', u"Edit widget within Columns") + text_edit_col_text1 = u"here's\nsome\ninfo" + text_edit_col_cap2 = ('editcp', u"and within Pile ") + text_edit_col_text2 = u"more" + text_edit_col_cap3 = ('editcp', u"another ") + text_edit_col_text3 = u"still more" + text_gridflow = [u"A ",('important', u"GridFlow"), u" widget " + u"may be used to display a list of flow widgets with equal " + u"widths. Widgets that don't fit on the first line will " + u"flow to the next. This is useful for small widgets that " + u"you want to keep together such as ", ('important', u"Button"), + u", ",('important', u"CheckBox"), u" and ", + ('important', u"RadioButton"), u" widgets." ] + text_button_list = [u"Yes", u"No", u"Perhaps", u"Certainly", u"Partially", + u"Tuesdays Only", u"Help"] + text_cb_list = [u"Wax", u"Wash", u"Buff", u"Clear Coat", u"Dry", + u"Racing Stripe"] + text_rb_list = [u"Morning", u"Afternoon", u"Evening", u"Weekend"] + text_listbox = [u"All these widgets have been diplayed " + u"with the help of a ", ('important', u"ListBox"), u" widget. " + u"ListBox widgets handle scrolling and changing focus. A ", + ('important', u"Frame"), u" widget is used to keep the " + u"instructions at the top of the screen."] + + + def button_press(button): + frame.footer = urwid.AttrWrap(urwid.Text( + [u"Pressed: ", button.get_label()]), 'header') + + radio_button_group = [] + + blank = urwid.Divider() + listbox_content = [ + blank, + urwid.Padding(urwid.Text(text_intro), ('fixed left',2), + ('fixed right',2), 20), + blank, + urwid.Text(text_right, align='right'), + blank, + urwid.Text(text_center, align='center'), + blank, + urwid.Text(text_clip, wrap='clip'), + blank, + urwid.Text(text_right_clip, align='right', wrap='clip'), + blank, + urwid.Text(text_center_clip, align='center', wrap='clip'), + blank, + urwid.Text(text_any, wrap='any'), + blank, + urwid.Padding(urwid.Text(text_padding), ('relative', 20), 40), + blank, + urwid.AttrWrap(urwid.Divider("=", 1), 'bright'), + urwid.Padding(urwid.Text(text_divider), ('fixed left',2), + ('fixed right',2), 20), + urwid.AttrWrap(urwid.Divider("-", 0, 1), 'bright'), + blank, + urwid.Padding(urwid.Text(text_edit), ('fixed left',2), + ('fixed right',2), 20), + blank, + urwid.AttrWrap(urwid.Edit(text_edit_cap1, text_edit_text1), + 'editbx', 'editfc'), + blank, + urwid.AttrWrap(urwid.Edit(text_edit_cap2, text_edit_text2, + multiline=True ), 'editbx', 'editfc'), + blank, + urwid.AttrWrap(urwid.Edit(text_edit_cap3, text_edit_text3, + wrap='clip' ), 'editbx', 'editfc'), + blank, + urwid.Text(text_edit_alignments), + urwid.AttrWrap(urwid.Edit("", text_edit_left, align='left'), + 'editbx', 'editfc' ), + urwid.AttrWrap(urwid.Edit("", text_edit_center, + align='center'), 'editbx', 'editfc' ), + urwid.AttrWrap(urwid.Edit("", text_edit_right, align='right'), + 'editbx', 'editfc' ), + blank, + urwid.AttrWrap(urwid.IntEdit(text_intedit, 123), + 'editbx', 'editfc' ), + blank, + urwid.Padding(urwid.AttrWrap(urwid.Edit(text_edit_padding, ""), + 'editbx','editfc' ), ('fixed left',10), 50 ), + blank, + blank, + urwid.AttrWrap(urwid.Columns([ + urwid.Divider("."), + urwid.Divider(","), + urwid.Divider("."), + ]), 'bright'), + blank, + urwid.Columns([ + urwid.Padding(urwid.Text(text_columns1), + ('fixed left',2), ('fixed right',0), 20), + urwid.Pile([ + urwid.Divider("~"), + urwid.Text(text_columns2), + urwid.Divider("_")]) + ], 3), + blank, + blank, + urwid.Columns([ + urwid.Text(text_col_columns), + urwid.Columns([ + urwid.Text(text_col_21), + urwid.Text(text_col_22), + urwid.Text(text_col_23), + ], 1), + ], 2), + blank, + urwid.Padding(urwid.Text(text_column_widths), + ('fixed left',2), ('fixed right',2), 20), + blank, + urwid.Columns( [ + urwid.AttrWrap(urwid.Text(text_weight % 1),'reverse'), + ('weight', 2, urwid.Text(text_weight % 2)), + ('weight', 3, urwid.AttrWrap(urwid.Text( + text_weight % 3), 'reverse')), + ('weight', 4, urwid.Text(text_weight % 4)), + ('weight', 5, urwid.AttrWrap(urwid.Text( + text_weight % 5), 'reverse')), + ('weight', 6, urwid.Text(text_weight%2)), + ], 0, min_width=8), + blank, + urwid.Columns([ + ('weight', 2, urwid.AttrWrap(urwid.Text( + text_weight % 2), 'reverse')), + ('fixed', 9, urwid.Text(text_fixed_9)), + ('weight', 3, urwid.AttrWrap(urwid.Text( + text_weight % 2), 'reverse')), + ('fixed', 14, urwid.Text(text_fixed_14)), + ], 0, min_width=8), + blank, + urwid.Columns([ + urwid.AttrWrap(urwid.Edit(text_edit_col_cap1, + text_edit_col_text1, multiline=True), + 'editbx','editfc'), + urwid.Pile([ + urwid.AttrWrap(urwid.Edit( + text_edit_col_cap2, + text_edit_col_text2), + 'editbx','editfc'), + blank, + urwid.AttrWrap(urwid.Edit( + text_edit_col_cap3, + text_edit_col_text3), + 'editbx','editfc'), + ]), + ], 1), + blank, + urwid.AttrWrap(urwid.Columns([ + urwid.Divider("'"), + urwid.Divider('"'), + urwid.Divider("~"), + urwid.Divider('"'), + urwid.Divider("'"), + ]), 'bright'), + blank, + blank, + urwid.Padding(urwid.Text(text_gridflow), ('fixed left',2), + ('fixed right',2), 20), + blank, + urwid.Padding(urwid.GridFlow( + [urwid.AttrWrap(urwid.Button(txt, button_press), + 'buttn','buttnf') for txt in text_button_list], + 13, 3, 1, 'left'), + ('fixed left',4), ('fixed right',3)), + blank, + urwid.Padding(urwid.GridFlow( + [urwid.AttrWrap(urwid.CheckBox(txt),'buttn','buttnf') + for txt in text_cb_list], + 10, 3, 1, 'left') , + ('fixed left',4), ('fixed right',3)), + blank, + urwid.Padding(urwid.GridFlow( + [urwid.AttrWrap(urwid.RadioButton(radio_button_group, + txt), 'buttn','buttnf') + for txt in text_rb_list], + 13, 3, 1, 'left') , + ('fixed left',4), ('fixed right',3)), + blank, + blank, + urwid.Padding(urwid.Text(text_listbox), + ('fixed left',2),('fixed right',2),20), + blank, + blank, + ] + + header = urwid.AttrWrap(urwid.Text(text_header), 'header') + listbox = urwid.ListBox(urwid.SimpleListWalker(listbox_content)) + frame = urwid.Frame(urwid.AttrWrap(listbox, 'body'), header=header) + + palette = [ + ('body','black','light gray', 'standout'), + ('reverse','light gray','black'), + ('header','white','dark red', 'bold'), + ('important','dark blue','light gray',('standout','underline')), + ('editfc','white', 'dark blue', 'bold'), + ('editbx','light gray', 'dark blue'), + ('editcp','black','light gray', 'standout'), + ('bright','dark gray','light gray', ('bold','standout')), + ('buttn','black','dark cyan'), + ('buttnf','white','dark blue','bold'), + ] + + + # use appropriate Screen class + if urwid.web_display.is_web_request(): + screen = urwid.web_display.Screen() + else: + screen = urwid.raw_display.Screen() + + def unhandled(key): + if key == 'f8': + raise urwid.ExitMainLoop() + + urwid.MainLoop(frame, palette, screen, + unhandled_input=unhandled).run() + +def setup(): + urwid.web_display.set_preferences("Urwid Tour") + # try to handle short web requests quickly + if urwid.web_display.handle_short_request(): + return + + main() + +if '__main__'==__name__ or urwid.web_display.is_web_request(): + setup() |