📄 docgen_tutorial.py
字号:
#!/usr/bin/python## Urwid tutorial documentation generation program# Copyright (C) 2004-2007 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/from __future__ import nested_scopesimport sysimport reimport osimport urwid.html_fragmentimport urwidtry: import templayerexcept: templayer = Noneexamples = {}interp_line = "#!/usr/bin/python\n\n"cut_comment = "# CUT HERE"examples["min"] = ["example_min"]def example_min(): import urwid.curses_display import urwid ui = urwid.curses_display.Screen() def run(): canvas = urwid.TextCanvas(["Hello World"]) ui.draw_screen( (20, 1), canvas ) while not ui.get_input(): pass ui.run_wrapper( run )examples["text"] = ["example_text"]def example_text(): import urwid.curses_display import urwid ui = urwid.curses_display.Screen() def run(): cols, rows = ui.get_cols_rows() txt = urwid.Text("Hello World", align="center") fill = urwid.Filler( txt ) canvas = fill.render( (cols, rows) ) ui.draw_screen( (cols, rows), canvas ) while not ui.get_input(): pass ui.run_wrapper( run )examples["attr"] = ["example_attr"]def example_attr(): import urwid.curses_display import urwid ui = urwid.curses_display.Screen() ui.register_palette( [ ('banner', 'black', 'light gray', ('standout', 'underline')), ('streak', 'black', 'dark red', 'standout'), ('bg', 'black', 'dark blue'), ] ) def run(): cols, rows = ui.get_cols_rows() txt = urwid.Text(('banner', " Hello World "), align="center") wrap1 = urwid.AttrWrap( txt, 'streak' ) fill = urwid.Filler( wrap1 ) wrap2 = urwid.AttrWrap( fill, 'bg' ) canvas = wrap2.render( (cols, rows) ) ui.draw_screen( (cols, rows), canvas ) while not ui.get_input(): pass ui.run_wrapper( run )examples["resize"] = ["example_resize"]def example_resize(): import urwid.curses_display import urwid ui = urwid.curses_display.Screen() ui.register_palette( [ ('banner', 'black', 'light gray', ('standout', 'underline')), ('streak', 'black', 'dark red', 'standout'), ('bg', 'black', 'dark blue'), ] ) def run(): cols, rows = ui.get_cols_rows() txt = urwid.Text(('banner', " Hello World "), align="center") wrap1 = urwid.AttrWrap( txt, 'streak' ) fill = urwid.Filler( wrap1 ) wrap2 = urwid.AttrWrap( fill, 'bg' ) while True: canvas = wrap2.render( (cols, rows) ) ui.draw_screen( (cols, rows), canvas ) keys = ui.get_input() if "q" in keys or "Q" in keys: break if "window resize" in keys: cols, rows = ui.get_cols_rows() ui.run_wrapper( run )examples["edit"] = ["example_edit"]def example_edit(): import urwid.curses_display import urwid ui = urwid.curses_display.Screen() def run(): cols, rows = ui.get_cols_rows() ask = urwid.Edit("What is your name?\n") fill = urwid.Filler( ask ) reply = None while True: canvas = fill.render( (cols, rows), focus=True ) ui.draw_screen( (cols, rows), canvas ) keys = ui.get_input() for k in keys: if k == "window resize": cols, rows = ui.get_cols_rows() continue if reply is not None: return if k == "enter": reply = urwid.Text( "Nice to meet you,\n"+ ask.edit_text+"." ) fill.body = reply if fill.selectable(): fill.keypress( (cols, rows), k ) ui.run_wrapper( run )examples["frlb"] = ["example_frlb"]def example_frlb(): import urwid.curses_display import urwid class Conversation(object): def __init__(self): self.items = urwid.SimpleListWalker( [self.new_question()]) self.listbox = urwid.ListBox(self.items) instruct = urwid.Text("Press F8 to exit.") header = urwid.AttrWrap( instruct, 'header' ) self.top = urwid.Frame(self.listbox, header) def main(self): self.ui = urwid.curses_display.Screen() self.ui.register_palette([ ('header', 'black', 'dark cyan', 'standout'), ('I say', 'default', 'default', 'bold'), ]) self.ui.run_wrapper( self.run ) # CUT HERE def run(self): size = self.ui.get_cols_rows() while True: self.draw_screen( size ) keys = self.ui.get_input() if "f8" in keys: break for k in keys: if k == "window resize": size = self.ui.get_cols_rows() continue self.top.keypress( size, k ) if keys: name = self.items[0].edit_text self.items[1:2] = [self.new_answer(name)] # CUT HERE def draw_screen(self, size): canvas = self.top.render( size, focus=True ) self.ui.draw_screen( size, canvas ) def new_question(self): return urwid.Edit(('I say',"What is your name?\n")) def new_answer(self, name): return urwid.Text(('I say',"Nice to meet you, "+name+"\n")) Conversation().main()examples["lbcont"]=["example_lbcont"]def example_lbcont(): import urwid.curses_display import urwid class Conversation(object): def __init__(self): self.items = urwid.SimpleListWalker( [self.new_question()]) self.listbox = urwid.ListBox(self.items) instruct = urwid.Text("Press F8 to exit.") header = urwid.AttrWrap( instruct, 'header' ) self.top = urwid.Frame(self.listbox, header) def main(self): self.ui = urwid.curses_display.Screen() self.ui.register_palette([ ('header', 'black', 'dark cyan', 'standout'), ('I say', 'default', 'default', 'bold'), ]) self.ui.run_wrapper( self.run ) # CUT HERE def run(self): size = self.ui.get_cols_rows() while True: self.draw_screen( size ) keys = self.ui.get_input() if "f8" in keys: break for k in keys: if k == "window resize": size = self.ui.get_cols_rows() continue self.keypress( size, k ) def keypress(self, size, k): if k == "enter": widget, pos = self.listbox.get_focus() if not hasattr(widget,'get_edit_text'): return answer = self.new_answer( widget.get_edit_text() ) if pos == len(self.items)-1: self.items.append( answer ) self.items.append( self.new_question() ) else: self.items[pos+1:pos+2] = [answer] widget.set_edit_pos(0) self.listbox.set_focus( pos+2, coming_from='above' ) else: self.top.keypress( size, k ) # CUT HERE def draw_screen(self, size): canvas = self.top.render( size, focus=True ) self.ui.draw_screen( size, canvas ) def new_question(self): return urwid.Edit(('I say',"What is your name?\n")) def new_answer(self, name): return urwid.Text(('I say',"Nice to meet you, "+name+"\n")) Conversation().main()examples["lbscr"] = ["example_lbscr"]def example_lbscr(): import urwid.curses_display import urwid # CUT HERE CONTENT = [ urwid.AttrWrap( w, None, 'reveal focus' ) for w in [ urwid.Text("This is a text string that is fairly long"), urwid.Divider("-"), urwid.Text("Short one"), urwid.Text("Another"), urwid.Divider("-"), urwid.Text("What could be after this?"), urwid.Text("The end."), ] ] # CUT HERE class RevealFocus(object): def __init__(self): self.listbox = urwid.ListBox( CONTENT ) self.head = urwid.Text("Pressed:") self.head = urwid.AttrWrap(self.head, 'header') self.top = urwid.Frame(self.listbox, self.head) def main(self): self.ui = urwid.curses_display.Screen() self.ui.register_palette([ ('header', 'white', 'black'), ('reveal focus', 'black', 'dark cyan', 'standout'), ]) self.ui.run_wrapper( self.run ) def run(self): size = self.ui.get_cols_rows() while True: self.draw_screen( size ) keys = self.ui.get_input() if "f8" in keys: break self.head.set_text("Pressed:") for k in keys: if k == "window resize": size = self.ui.get_cols_rows() continue self.head.set_text("Pressed: "+k) self.top.keypress( size, k ) def draw_screen(self, size): canvas = self.top.render( size, focus=True ) self.ui.draw_screen( size, canvas ) RevealFocus().main()examples["wmod"] = ["example_wmod"]def example_wmod(): class QuestionnaireItem( urwid.WidgetWrap ): def __init__(self): self.options = [] unsure = urwid.RadioButton( self.options, "Unsure" ) yes = urwid.RadioButton( self.options, "Yes" ) no = urwid.RadioButton( self.options, "No" ) display_widget = urwid.GridFlow( [unsure, yes, no], 15, 3, 1, 'left' ) urwid.WidgetWrap.__init__(self, display_widget) def get_state(self): for o in self.options: if o.get_state() is True: return o.get_label() examples["wanat"] = ["example_wanat","example_wanat_new","example_wanat_multi"]def example_wanat(): class Pudding( urwid.FlowWidget ): def selectable( self ): return False def rows( self, (maxcol,), focus=False ): return 1 def render( self, (maxcol,), focus=False ): num_pudding = maxcol / len("Pudding") return urwid.TextCanvas(["Pudding"*num_pudding]) class BoxPudding( urwid.BoxWidget ): def selectable( self ): return False def render( self, (maxcol, maxrow), focus=False ): num_pudding = maxcol / len("Pudding") return urwid.TextCanvas( ["Pudding"*num_pudding] * maxrow)def example_wanat_new(): class NewPudding( urwid.FlowWidget ): def selectable( self ): return False def rows( self, (maxcol,), focus=False ): w = self.display_widget( (maxcol,), focus ) return w.rows( (maxcol,), focus ) def render( self, (maxcol,), focus=False ): w = self.display_widget( (maxcol,), focus ) return w.render( (maxcol,), focus ) def display_widget( self, (maxcol,), focus ): num_pudding = maxcol / len("Pudding") return urwid.Text( "Pudding"*num_pudding )def example_wanat_multi(): class MultiPudding( urwid.Widget ): def selectable( self ): return False def rows( self, (maxcol,), focus=False ): return 1 def render( self, size, focus=False ): if len(size) == 1: (maxcol,) = size maxrow = 1 else: (maxcol, maxrow) = size num_pudding = maxcol / len("Pudding") return urwid.TextCanvas( ["Pudding"*num_pudding] * maxrow )examples["wsel"] = ["example_wsel"]def example_wsel(): class SelectablePudding( urwid.FlowWidget ):
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -