[Tutor] python file browser with urwid

Tiago Saboga tiagosaboga at terra.com.br
Tue Jul 18 03:22:49 CEST 2006


I'm trying to write a file browser with urwid. In the future, I want to make a 
light front-end for cds burning, but for now I'm doing it as an exercise. The 
problem is I'm a little stuck now. I'm sending my actual working code, with 
some working functionality, but I would like to know if I should go ahead or 
if I stop now to make it better.

In fact, I don't know why I'm using a pyrun class, so I think I should get rid 
of it. And I think my try/except clause in pyrun's __init__ method is ugly, 
but I couldn't find nothing better.

Ah, and thanks everybody who helped me some months ago; I had some personal 
problems and couldn't answer, but it really helped.

Tiago.

The code:

#!/usr/bin/python

import urwid
import urwid.curses_display
import os

ui = urwid.curses_display.Screen()

ui.register_palette( [
	('splash', 'black', 'dark red'),
	('bg_splash', 'black', 'dark blue'),
	('header', 'white', 'black'),
	('footer', 'dark red', 'light gray'),
	('browser', 'white', 'dark blue'),
	('selected', 'white', 'dark red'),
	('file', 'light gray', 'dark blue'),
	('dir', 'light magenta', 'dark blue')
	  ])

def run():
	size = ui.get_cols_rows()
	inst = pyrun()
	inst.main()

class pyrun:
	def __init__(self):
		try:
			self.items = self.get_file_names( self.cwd )
		except AttributeError:
			self.initial_cwd = os.getcwd()
			self.cwd = self.initial_cwd
			self.items = self.get_file_names( self.cwd )
		self.listbox = urwid.AttrWrap ( urwid.ListBox( self.items ), 'browser')
		menu_txt = urwid.Text("F1 - Help     F2 - Options     F10 - Quit    
Now: %s" % self.cwd)
		header = urwid.AttrWrap( menu_txt, 'header')
		down_txt = urwid.Text("pybrowser. Left Arrow: Parent.")
		footer = urwid.AttrWrap( down_txt, 'footer')
		self.top = urwid.Frame( self.listbox, header, footer )
		
	def main(self):
		size = ui.get_cols_rows()
				
		while True:
			self.draw_screen( size )
			keys = ui.get_input()
			if "f10" in keys:
				break
			for k in keys:
				if k == "window resize":
					size = ui.get_cols_rows()
					continue
				elif k == "left":
					self.cwd = os.path.split(self.cwd)[0]
					self.__init__()
					continue
	def draw_screen( self, size ):
		canvas = self.top.render( size, focus=True )
		ui.draw_screen( size, canvas )
	
	def get_file_names(self, cwd):
		desc_list = os.listdir( cwd )
		dir_list = []
		file_list = []
		
		for f in desc_list:
			if os.path.isdir(os.path.join(cwd, f)):
				dir_list.append(f)
			elif os.path.isfile(os.path.join(cwd,f)):
				file_list.append(f)
		
		
		file_list = [ urwid.AttrWrap ( urwid.Text(f) , 'file') for f in file_list ] 
		dir_list = [ urwid.AttrWrap ( urwid.Text(f) , 'dir')  for f in dir_list ]
		
		return ( dir_list + file_list )
		
ui.run_wrapper( run )


More information about the Tutor mailing list