[Tutor] python file browser with urwid

Kent Johnson kent37 at tds.net
Tue Jul 18 04:00:11 CEST 2006


Tiago Saboga wrote:
> 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.
>   
The class seems to be mostly used as a container for a few variables. 
That's an OK reason to use a class. You might be able to use functions 
with a few more parameters, but if the alternative is to use global 
variables I would use a class. I don't know urwid but in my experience 
GUI programs tend to be object-oriented so I wouldn't sweat that.

get_file_names() doesn't use self at all so it could be a module function.

I would break up __init__() into two parts, an actual initializer that just initializes self.initial_cwd and self.cwd, and a new function (reset()?) that does the rest of the work. Then __init__() and main() would both call reset() and you could get rid of the try/except.

Kent 

> 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 )
> _______________________________________________
> Tutor maillist  -  Tutor at python.org
> http://mail.python.org/mailman/listinfo/tutor
>
>
>   




More information about the Tutor mailing list