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

Reply via email to