[Urwid] Colored border class question

Joern Koerner koerner at in.tu-clausthal.de
Wed May 21 03:43:53 EDT 2008


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()




More information about the Urwid mailing list