Ian Ward wrote:
> Ian Ward wrote:
>> Nuutti Kotivuori wrote:
>>> In any case, this slowness is a showstopper for me - and I'm wondering
>>> what would be the best way to optimize this.
>> Currently Urwid redraws all the visible widgets every time you call
>> render. The Text widgets do cache the result of their alignment and
>> wrapping, but Urwid might be calling calc_width unnecessarily on
>> text it should already know the width of.
>
> Please try the attached patch. The Columns widget was causing
> calc_width to be called unnecessarily.
Thanks! I tried the patch and it alleviates the situation a
lot. However, performance is still not good enough. Here is a sample
program to check the performance (not minimal, one of my test files):
#!/usr/bin/python
import urwid
import urwid.raw_display
import urwid.web_display
if urwid.web_display.is_web_request():
Screen = urwid.web_display.Screen
else:
Screen = urwid.raw_display.Screen
class SampleColumn:
def __init__(self, name):
self.items = [urwid.Text(['Name: %s' % name]),
urwid.Text(['Foobar!']),
urwid.Text(['Barfoo!'])]
self.listbox = urwid.ListBox(self.items)
self.body = urwid.AttrWrap(self.listbox, 'column', 'columnfocus')
class MusDisplay:
palette = [('column', 'default', 'dark blue'),
('columnfocus', 'default', 'dark red'),
('body', 'default', 'default'),
('event', 'light gray', 'dark blue', 'standout')]
def __init__(self):
self.columns = urwid.Columns([SampleColumn('A').body,
SampleColumn('B').body,
SampleColumn('C').body,
SampleColumn('D').body,
SampleColumn('E').body,
SampleColumn('F').body,
SampleColumn('G').body,
SampleColumn('H').body,
SampleColumn('I').body,
SampleColumn('J').body],
dividechars = True,
min_width = 20)
self.columns.set_focus_column(0)
self.view = urwid.Frame(urwid.AttrWrap(self.columns, 'body'))
def main(self):
self.ui = Screen()
self.ui.register_palette( self.palette )
self.ui.run_wrapper( self.run )
def run(self):
self.ui.set_mouse_tracking()
size = self.ui.get_cols_rows()
self.event = ''
while True:
view = self.view
# XXX: debugging
view = urwid.Frame(view,
footer=urwid.AttrWrap(urwid.Text(self.event), 'event'))
canvas = view.render( size, focus=1 )
self.ui.draw_screen( size, canvas )
keys = None
while not keys:
# XXX: idle loop stuff
keys = self.ui.get_input()
self.event = repr(keys)
for k in keys:
if k == 'window resize':
size = self.ui.get_cols_rows()
elif urwid.is_mouse_event(k):
event, button, col, row = k
self.view.mouse_event(size,
event, button, col, row,
focus=True)
elif k in ('q','Q'):
return
else:
self.view.keypress(size, k)
def main():
urwid.web_display.set_preferences("Mus")
if urwid.web_display.handle_short_request():
return
MusDisplay().main()
if __name__ == "__main__" or urwid.web_display.is_web_request():
main()
When run in ISO-8859-1 mode, performance is great - when run in UTF-8
mode, even with the patch, I can easily max out the CPU and have the
display updating really slow by rapidly tapping left and right.
-- Naked
_______________________________________________
Urwid mailing list
[email protected]
http://lists.excess.org/mailman/listinfo/urwid