[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