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