[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