Hi everyone!

Based on some posts to this list I've created a Border class, that draws ba 
border with title around widgets. So far so good. 

My problem is, when I tray to change the borders color,  only the top line and 
the bottom line are being ignored. They simply does not change the color and I 
can 
not figure out where the bug is....
Perhaps someone could give me a hint what is wrong?!

Best,
 Joern


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os,sys
import urwid
#import urwid.raw_display
import urwid.curses_display


class Border(urwid.WidgetWrap):
        def __init__(self, w, title=None,  title_attr=None,  border_attr=None):
                
                utf8decode = urwid.escape.utf8decode

                # Define the border characters
                self.tline = urwid.AttrWrap(urwid.Divider(utf8decode("─")),  
border_attr)       # Top Line
                self.bline = urwid.AttrWrap(urwid.Divider(utf8decode("─")),  
border_attr)       # Bottom Line
                self.lline = urwid.AttrWrap(urwid.SolidFill(utf8decode("│")),  
border_attr)     # Left Line
                self.rline = urwid.AttrWrap(urwid.SolidFill(utf8decode("│")),  
border_attr)     # Right Line
                self.tlcorner = urwid.AttrWrap(urwid.Text(utf8decode("┌")),  
border_attr)       # and the four corners
                self.trcorner = urwid.AttrWrap(urwid.Text(utf8decode("┐")),  
border_attr)
                self.blcorner = urwid.AttrWrap(urwid.Text(utf8decode("└")),  
border_attr)
                self.brcorner = urwid.AttrWrap(urwid.Text(utf8decode("┘")),  
border_attr)
                
                if is None:
                        title=""
                else:
                        self.title = " %s " % (title)           # Add two 
spaces to the title

                self.titlelen = len(self.title)
                self.title = urwid.AttrWrap(urwid.Text(self.title),  title_attr)

                # Create the top line
                top = urwid.Columns([ ('fixed', 1, self.tlcorner), ('fixed',  
self.titlelen, self.title), 
                                                        ('weight' , 1, 
self.tline), ('fixed', 1, self.trcorner) ])

                # This is what will be wrapped 
                middle = urwid.Columns( [('fixed', 1, self.lline),
                                                        w, ('fixed', 1, 
self.rline)], box_columns = [0,2], focus_column = 1)
                
                # Create the bottom line
                bottom = urwid.Columns([ ('fixed', 1, self.blcorner),
                                                        ('weight',  1, 
self.bline), ('fixed', 1, self.brcorner) ])

                # and pile them all together
                pile = urwid.Pile([('flow',top),middle,('flow',bottom)],
                                                        focus_item = 1)
                        
                urwid.WidgetWrap.__init__(self, pile)

        def set_attr(self, attr):
                self.set_attr( attr)
                

class EditDisplay:
        palette = [
                ('body',        'black',                'dark cyan',    
'standout'),
                ('foot',        'light gray',   'black'),
                ('key',         'light cyan',   'black',                
'underline'),
                ('title',       'white',                'black'),
                ('aborder',     'white',        'dark cyan',            'bold'),
                ('iborder',     'black',        'dark cyan',            'bold'),
                ('atitle',      'white',        'light gray',           
'standout'), 
                ('ititle',      'black',        'dark cyan',            
'standout'), 
                ]
                
        footer_text = [
                ('title', "border test"), "    ",
                ('key',  'c'),  " changes the border/title color  ", 
                ('key', "Q"), " exits",
                ]
        
        def __init__(self,  lfilename="",  rfilename="",  outfilename=""):
                self.topwidget = [ ]    # The topmost widget
                
                self.text = urwid.Text("My Text to be boxed")
                self.fill = urwid.Filler( self.text )
                
                self.border = Border(self.fill,  title="MyTitle" 
,title_attr='atitle',  border_attr='aborder' )
                
                self.ui = urwid.Frame( self.border )
                self.footer = urwid.AttrWrap( urwid.Text( self.footer_text ), 
'foot')
                self.view = urwid.Frame( urwid.AttrWrap( self.ui,  'body'), 
footer=self.footer )

        def main(self):
                self.ui = urwid.curses_display.Screen()
                self.ui.register_palette( self.palette )
                self.ui.run_wrapper( self.run )

        def run(self):
                size = self.ui.get_cols_rows()
                active=1
                while 1:
                        canvas = self.view.render( size, focus=1 )
                        self.ui.draw_screen( size, canvas )
                        keys = None
                        while not keys: 
                                keys = self.ui.get_input()
                        for k in keys:
                                if k == 'window resize':
                                        size = self.ui.get_cols_rows()
                                elif k in ('q','Q'):
                                        return
                                elif k in ('c'):
                                        if active==0:
                                                active=1
                                                
self.border.title.set_attr('atitle')

                                                
self.border.tline.set_attr('aborder')           # This does not change anything!
                                                
self.border.bline.set_attr('aborder')   # This does not change anything!
                                                
self.border.lline.set_attr('aborder')
                                                
self.border.rline.set_attr('aborder')
                                                
                                                
self.border.tlcorner.set_attr('aborder')
                                                
self.border.trcorner.set_attr('aborder')
                                                
self.border.blcorner.set_attr('aborder')
                                                
self.border.brcorner.set_attr('aborder')
                                                
                                        else:
                                                active=0
                                                
self.border.title.set_attr('ititle')
                                                
                                                
self.border.tline.set_attr('iborder')           # This does not change anything!
                                                
self.border.bline.set_attr('iborder')           # This does not change anything!
                                                
self.border.lline.set_attr('iborder')
                                                
self.border.rline.set_attr('iborder')
                                                
                                                
self.border.tlcorner.set_attr('iborder')
                                                
self.border.trcorner.set_attr('iborder')
                                                
self.border.blcorner.set_attr('iborder')
                                                
self.border.brcorner.set_attr('iborder')
                                else:
                                        pass
                                        
                                self.view.keypress( size, k )

def main():
        EditDisplay().main()
        
        
if __name__=="__main__":
        main()


_______________________________________________
Urwid mailing list
[email protected]
http://lists.excess.org/mailman/listinfo/urwid

Reply via email to