Hi Ian,

* Ian Ward <[EMAIL PROTECTED]> wrote:
> Fabian Braennstroem wrote:
>> Hi,
>> 
>> I just found urwid and would like to use it to adjust the
>> curses-based 'lfm' (last file manager) with some radio and
>> check buttons. It would be nice, if anybody can send me some
>> simple examples.  I am still a python newbie and I saw the
>> examples in the urwid installation directory, but as more
>> 'understandable' scripts I read the better I get into it :-)
>
> Have you followed the tutorial and checked out the contributed examples 
> on the web site?
Yes, but as I wrote, I am kind of new using python... and
try to copy and past a lot of interesting lines to get my
ideas to work. Python works pretty good this way; I just
import the needed module and use some lines from other
tutorials, which hopefully works. It actually does for some
small things :-)
 
> More simple examples would be nice, and the docs and examples can always 
> be improved on. Please please post any questions you have to the list.

Thanks! As written above, I try to 'enhance' lfm for my
needs, e.g.  printing, burning
files, making plots, converting images, running latex,... but I am missing some
radio/check buttons. Now, I tried to include the 'dialog.py' example into lfm,
just to run a 'do_msgbox'. To achive that I included the following part:

class DialogExit(Exception):
   pass


class DialogDisplay:
   palette = [
      ('body','black','light gray', 'standout'),
      ('border','black','dark blue'),
      ('shadow','white','black'),
      ('selectable','black', 'dark cyan'),
      ('focus','white','dark blue','bold'),
      ('focustext','light gray','dark blue'),
      ]
      
   def __init__(self, text, height, width, body=None):
      width = int(width)
      if width <= 0:
         width = ('relative', 80)
      height = int(height)
      if height <= 0:
         height = ('relative', 80)
   
      self.body = body
      if body is None:
         # fill space with nothing
         body = urwid.Filler(urwid.Divider(),'top')

      self.frame = urwid.Frame( body, focus_part='footer')
      if text is not None:
         self.frame.header = urwid.Pile( [urwid.Text(text),
            urwid.Divider()] )
      w = self.frame
      
      # pad area around listbox
      w = urwid.Padding(w, ('fixed left',2), ('fixed right',2))
      w = urwid.Filler(w, ('fixed top',1), ('fixed bottom',1))
      w = urwid.AttrWrap(w, 'body')
      
      # "shadow" effect
      w = urwid.Columns( [w,('fixed', 2, urwid.AttrWrap(
         urwid.Filler(urwid.Text(('border','  ')), "top")
         ,'shadow'))])
      w = urwid.Frame( w, footer = 
         urwid.AttrWrap(urwid.Text(('border','  ')),'shadow'))

      # outermost border area
      w = urwid.Padding(w, 'center', width )
      w = urwid.Filler(w, 'middle', height )
      w = urwid.AttrWrap( w, 'border' )
      
      self.view = w


   def add_buttons(self, buttons):
      l = []
      for name, exitcode in buttons:
         b = urwid.Button( name, self.button_press )
         b.exitcode = exitcode
         b = urwid.AttrWrap( b, 'selectable','focus' )
         l.append( b )
      self.buttons = urwid.GridFlow(l, 10, 3, 1, 'center')
      self.frame.footer = urwid.Pile( [ urwid.Divider(),
         self.buttons ], focus_item = 1)

   def button_press(self, button):
      raise DialogExit(button.exitcode)

   def main(self):
      self.ui = urwid.raw_display.Screen()
      self.ui.register_palette( self.palette )
      return self.ui.run_wrapper( self.run )

   def run(self):
      self.ui.set_mouse_tracking()
      size = self.ui.get_cols_rows()
      try:
         while True:
            canvas = self.view.render( size, focus=True )
            self.ui.draw_screen( size, canvas )
            keys = None
            while not keys: 
               keys = self.ui.get_input()
            for k in keys:
               if urwid.is_mouse_event(k):
                  event, button, col, row = k
                  self.view.mouse_event( size, 
                     event, button, col, row,
                     focus=True)
               if k == 'window resize':
                  size = self.ui.get_cols_rows()
               k = self.view.keypress( size, k )

               if k:
                  self.unhandled_key( size, k)
      except DialogExit, e:
         return self.on_exit( e.args[0] )
      
   def on_exit(self, exitcode):
      return exitcode, ""

   def unhandled_key(self, size, key):
      pass


def do_msgbox(text, height, width):
   d = DialogDisplay( text, height, width )
   d.add_buttons([   ("OK", 0) ])
   return d


I called the 'do_msgbox' with:


    ord('U'): 'do_msgbox("test",10,15)',

which means, as soon as you type 'U' call 'do_msgbox'. This is the way I added
the other 'features'. Unfortunately, I get:

node1~/HOME$ lfm                                                                
                                                            [24 Aug 8:36pm]
Traceback (most recent call last):
  File "/home/fab/Desktop/lfm/lfm.py", line 893, in ?
    lfm_start(sys.argv)
  File "/home/fab/Desktop/lfm/lfm.py", line 882, in lfm_start
    path = curses.wrapper(main, paths, prefs)
  File "/usr/lib/python2.4/curses/wrapper.py", line 44, in wrapper
    return func(stdscr, *args, **kwds)
  File "/home/fab/Desktop/lfm/lfm.py", line 801, in main
    ret = app.run()
  File "/home/fab/Desktop/lfm/lfm.py", line 174, in run
    ret = self.act_pane.manage_keys()
  File "/home/fab/Desktop/lfm/lfm.py", line 555, in manage_keys
    ret = actions.do(self.act_tab, ch)
  File "/home/fab/Desktop/lfm/actions.py", line 189, in do
    exec(act)
  File "<string>", line 1, in ?
AttributeError: DialogDisplay instance has no __call__ method

Right now, I have no clue, what the last line means. Maybe, it is a simple
python/urwid problem and you do not have to know the whole lfm code to give
some tips!? Would be nice to use urwid for it.
Thanks!

Greetings!
 Fabian



_______________________________________________
Urwid mailing list
[email protected]
http://lists.excess.org/mailman/listinfo/urwid

Reply via email to