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