def keypress(self, size, key):
if key == 'tab':
self.switch_focus()
return urwid.Frame.keypress(self, size, key)
python类Frame()的实例源码
def select_mod(
choices: Sequence[Mod],
header: Optional[str] = None,
footer: Optional[str] = None,
) -> Optional[Mod]:
"""Present user with a TUI menu and return his choice.
Keyword arguments:
choices: The :class:`Mod`s to choose from.
header: Optional menu heading.
footer: Optional menu footing.
Returns:
The selected mod.
"""
menu = ModMenu(choices)
head = urwid.Text(('title', header), align='center') if header else None
foot = urwid.Text(('description', footer), align='center') if footer else None # noqa: E501
if head or foot:
top = urwid.Frame(menu, head, foot)
else:
top = menu
try:
colors = curses.tigetnum('colors')
except curses.error: # Uninitialized terminal
colors = 16
event_loop = urwid.MainLoop(
top,
palette=ModMenu.palette,
unhandled_input=exit_loop_on_q_esc,
)
event_loop.screen.set_terminal_properties(colors=colors)
event_loop.run()
return menu.chosen
def __init__(self):
cwd = os.getcwd()
store_initial_cwd(cwd)
self.header = urwid.Text("")
self.listbox = urwid.TreeListBox(urwid.TreeWalker(DirectoryNode(cwd)))
self.listbox.offset_rows = 1
self.footer = urwid.AttrWrap(urwid.Text(self.footer_text),
'foot')
self.view = urwid.Frame(
urwid.AttrWrap(self.listbox, 'body'),
header=urwid.AttrWrap(self.header, 'head'),
footer=self.footer)
def __init__(self, name):
self.save_name = name
self.walker = LineWalker(name)
self.listbox = urwid.ListBox(self.walker)
self.footer = urwid.AttrWrap(urwid.Text(self.footer_text),
"foot")
self.view = urwid.Frame(urwid.AttrWrap(self.listbox, 'body'),
footer=self.footer)
def __init__(self, name):
self.save_name = name
self.walker = LineWalker(name)
self.listbox = urwid.ListBox(self.walker)
self.footer = urwid.AttrWrap(urwid.Text(self.footer_text),
"foot")
self.view = urwid.Frame(urwid.AttrWrap(self.listbox, 'body'),
footer=self.footer)
def __init__(self):
self.head = urwid.AttrWrap(
urwid.Text(["Help Column ", ('key',"?")],
layout = CALC_LAYOUT),
'help')
self.foot = urwid.AttrWrap(
urwid.Text(["[text continues.. press ",
('key',"?"), " then scroll]"]), 'helpnote' )
self.items = [urwid.Text(x) for x in self.help_text]
self.listbox = urwid.ListBox(urwid.SimpleListWalker(self.items))
self.body = urwid.AttrWrap( self.listbox, 'help' )
self.frame = urwid.Frame( self.body, header=self.head)
def __init__(self):
self.columns = urwid.Columns([HelpColumn(), CellColumn("A")], 1)
self.col_list = self.columns.widget_list
self.columns.set_focus_column( 1 )
view = urwid.AttrWrap(self.columns, 'body')
self.view = urwid.Frame(view) # for showing messages
self.col_link = {}
def __init__(self):
cwd = os.getcwd()
store_initial_cwd(cwd)
self.header = urwid.Text("")
self.listbox = urwid.TreeListBox(urwid.TreeWalker(DirectoryNode(cwd)))
self.listbox.offset_rows = 1
self.footer = urwid.AttrWrap(urwid.Text(self.footer_text),
'foot')
self.view = urwid.Frame(
urwid.AttrWrap(self.listbox, 'body'),
header=urwid.AttrWrap(self.header, 'head'),
footer=self.footer)
def __init__(self, text, height, width, body=None):
width = int(width)
if width <= 0:
width = ('relative', 80)
height = int(height)
if height <= 0:
height = ('relative', 80)
self.body = body
if body is None:
# fill space with nothing
body = urwid.Filler(urwid.Divider(),'top')
self.frame = urwid.Frame( body, focus_part='footer')
if text is not None:
self.frame.header = urwid.Pile( [urwid.Text(text),
urwid.Divider()] )
w = self.frame
# pad area around listbox
w = urwid.Padding(w, ('fixed left',2), ('fixed right',2))
w = urwid.Filler(w, ('fixed top',1), ('fixed bottom',1))
w = urwid.AttrWrap(w, 'body')
# "shadow" effect
w = urwid.Columns( [w,('fixed', 2, urwid.AttrWrap(
urwid.Filler(urwid.Text(('border',' ')), "top")
,'shadow'))])
w = urwid.Frame( w, footer =
urwid.AttrWrap(urwid.Text(('border',' ')),'shadow'))
# outermost border area
w = urwid.Padding(w, 'center', width )
w = urwid.Filler(w, 'middle', height )
w = urwid.AttrWrap( w, 'border' )
self.view = w
def test_frame(self):
self.wstest(urwid.Frame(urwid.SolidFill()))
self.wstest(urwid.Frame(urwid.SolidFill(),
header=urwid.Text("hello")))
self.wstest(urwid.Frame(urwid.SolidFill(),
header=urwid.Text("hello"),
footer=urwid.Text("hello")))
def test_frame(self):
s1 = urwid.SolidFill(u'1')
f = urwid.Frame(s1)
self.assertEqual(f.focus, s1)
self.assertEqual(f.focus_position, 'body')
self.assertRaises(IndexError, lambda: setattr(f, 'focus_position',
None))
self.assertRaises(IndexError, lambda: setattr(f, 'focus_position',
'header'))
t1 = urwid.Text(u'one')
t2 = urwid.Text(u'two')
t3 = urwid.Text(u'three')
f = urwid.Frame(s1, t1, t2, 'header')
self.assertEqual(f.focus, t1)
self.assertEqual(f.focus_position, 'header')
f.focus_position = 'footer'
self.assertEqual(f.focus, t2)
self.assertEqual(f.focus_position, 'footer')
self.assertRaises(IndexError, lambda: setattr(f, 'focus_position', -1))
self.assertRaises(IndexError, lambda: setattr(f, 'focus_position', 2))
del f.contents['footer']
self.assertEqual(f.footer, None)
self.assertEqual(f.focus_position, 'body')
f.contents.update(footer=(t3, None), header=(t2, None))
self.assertEqual(f.header, t2)
self.assertEqual(f.footer, t3)
def set1():
f.contents['body'] = t1
self.assertRaises(urwid.FrameError, set1)
def set2():
f.contents['body'] = (t1, 'given')
self.assertRaises(urwid.FrameError, set2)
def _setup_ui(self):
email = input('???? (Email??): ')
password = getpass.getpass('????: ')
api = DoubanFMApi()
api.login(email, password)
songs = api.get_redheart_songs()
# ??
self.title = urwid.Text('')
self._update_title()
divider = urwid.Divider()
header = urwid.Padding(urwid.Pile([divider, self.title, divider]), left=4, right=4)
# ????
index = 0
for song in songs:
self.btns.append(SongButton(song, self._on_item_pressed, index))
index += 1
self.song_listbox = SongListBox(self.btns)
# ??
self.main = urwid.Padding(
urwid.Frame(self.song_listbox, header=header, footer=divider),
left=4, right=4)
# ??????
urwid.register_signal(
SongListBox, ['exit', 'stop', 'next_song', 'change_mode'])
urwid.connect_signal(self.song_listbox, 'exit', self._on_exit)
urwid.connect_signal(self.song_listbox, 'stop', self.stop_song)
urwid.connect_signal(self.song_listbox, 'next_song', self.next_song)
urwid.connect_signal(self.song_listbox, 'change_mode', self.change_mode)
self.loop = urwid.MainLoop(self.main, palette=self.palette)
self.loop.screen.set_terminal_properties(colors=256)
def __init__(self, quiz, host_view, result, loop = None):
self.quiz = quiz
self.host_view = host_view
self.result = result
self.loop = loop
self.logger = logging.getLogger(__name__)
if result:
if 'status_code' not in result:
raise ValueError('Unknow result format: %s' % json.dumps(result))
if result['status_code'] is 20:
self.listbox = self.make_compile_error_view()
elif result['status_code'] is 10:
self.listbox = self.make_success_view()
elif result['status_code'] is 11:
self.listbox = self.make_failed_view()
elif result['status_code'] is 12:# memeory limit exceeded
self.listbox = self.make_unified_error_view("Memory Limit Exceeded")
elif result['status_code'] is 13:# output limit exceeded
self.listbox = self.make_unified_error_view("Output Limit Exceeded")
elif result['status_code'] is 14:# timeout
self.listbox = self.make_unified_error_view("Time Limit Exceeded")
elif result['status_code'] is 15:
self.listbox = self.make_runtime_error_view()
else:
raise ValueError('Unknow status code: %d' % result['status_code'])
else:
raise ValueError('result shouldn\'t be None')
self.overlay = urwid.Overlay(urwid.LineBox(self.listbox), host_view,
align='center', width=('relative', 95),
valign='middle', height=('relative', 95),
min_width=40, min_height=40)
footer = urwid.Pile([urwid.Text('Press Esc to close this view.', align='center'),
urwid.Divider()])
urwid.Frame.__init__(self, self.overlay, footer=footer)
def keypress(self, size, key):
key = vim_key_map(key)
if key is 'esc':
self.destroy()
else:
return urwid.Frame.keypress(self, size, key)
def __init__(self, text, width, host_view, loop = None):
self.running = False
self.lock = EasyLock()
self.loop = loop
self.overlay = urwid.Overlay(
urwid.LineBox(urwid.Text(text)), host_view, #urwid.SolidFill(),
'center', width, 'middle', None)
urwid.Frame.__init__(self, self.overlay)
def __init__(self, text, width, host_view, loop = None):
self.loop = loop
self.host_view = host_view
self.overlay = urwid.Overlay(
urwid.LineBox(urwid.Text(text)), host_view, #urwid.SolidFill(),
'center', width, 'middle', None)
urwid.Frame.__init__(self, self.overlay)
def __init__(self):
title = urwid.AttrWrap(urwid.Text('Help'), 'body')
body = urwid.Text(HelpView.__doc__)
pile = urwid.Pile([title, body])
filler = urwid.Filler(pile)
urwid.Frame.__init__(self, filler)
def __init__(self, quiz, loop = None):
self.quiz = quiz
self.loop = loop
self.logger = logging.getLogger(__name__)
blank = urwid.Divider()
view_title = urwid.AttrWrap(urwid.Text(self.quiz.title), 'body')
view_text = self.make_body_widgets()
view_code_title = urwid.Text('\n --- Sample Code ---\n')
view_code = urwid.Text(self.quiz.sample_code)
listitems = [blank, view_title, blank] + view_text + \
[blank, view_code_title, blank, view_code, blank]
self.listbox = urwid.ListBox(urwid.SimpleListWalker(listitems))
urwid.Frame.__init__(self, self.listbox)
def select_project(project_list, path_callback):
max_width = len(max(project_list, key=len))
f = ProjectSelector(project_list, 'normal', 'highlighted', 'selected')
def refresh_list(key=''):
if key:
if key in ('delete', 'backspace'):
f.remove_key()
else:
if key in 'abcdefghijklmnopqrstuvwxyz- .0123456789':
f.add_key(key)
s = f.render()
txt.set_text(s)
def exit_on_q(key):
if key.__class__ is not str:
return
if key in ('Q',):
raise urwid.ExitMainLoop()
if key == 'up':
f.up()
if key == 'down':
f.down()
if key == 'enter':
path_callback(f.select())
raise urwid.ExitMainLoop()
key = key.lower()
refresh_list(key)
palette = [
('normal', 'light gray', ''),
('selected', 'yellow, bold', ''),
('highlighted', 'black, bold', 'yellow'),
('quit button', 'light red, bold', ''),
('enter button', 'light green, bold', '')
]
txt = urwid.Text('', align='left')
fill = urwid.Filler(txt)
pad = urwid.Padding(fill, align='center', width=max_width+4)
box = urwid.LineBox(pad, title="Projects")
footer = urwid.Text(['Start typing to search. Use arrow keys to navigate. Press (', ('enter button', 'Enter'), ') to select project. ', 'Press (', ('quit button', 'Q'), ') to exit.'])
frame = urwid.Frame(body=box, footer=footer)
loop = urwid.MainLoop(frame, palette, unhandled_input=exit_on_q)
refresh_list()
loop.run()
def __init__(self, discord_client):
self.discord = discord_client
self.tabs = {}
self.w_tabs = TabSelector(self)
self.frame = urwid.Frame(
urwid.Filler(
urwid.Text(
"????????????????????????????????????\n"
"????????????????????????????????????\n"
"????????????????????????????????????\n"
" v0.2.4\n"
" \n"
" \n"
" < Logging in... Hang tight! > \n"
" --------------------------- \n"
" \ ^__^ \n"
" \ (oo)\_______ \n"
" (__)\ )\/\ \n"
" ||----w | \n"
" || || \n"
" \n"
" \n"
" \n",
align=urwid.CENTER)),
header=self.w_tabs)
HasModal.__init__(self, self.frame)
self.urwid_loop = urwid.MainLoop(
self.w_placeholder,
palette=MainUI.palette,
unhandled_input=lambda key: self._keypress(None, key),
event_loop=urwid.AsyncioEventLoop(loop=self.discord.loop),
pop_ups=True)
def refresh(_loop, _data):
_loop.draw_screen()
_loop.set_alarm_in(2, refresh)
self.urwid_loop.set_alarm_in(0.2, refresh)
self.urwid_loop.start()