Dear urwid users,

I am starting to take a look at urwid after a quite long brake again... so I am still a newbie :-)

I am a bit confused about the handling of button-press reactions and setting focus using keys for different widgets. I attached a small example. The aim is to show a help text or some more buttons on the right green 'box' in the inner-frame as soon as I walk through the buttons. The focused is set to the buttons, but as soon as I press one of the buttons I would like to focus to the current content of the right green column.
It would be nice, if anyone has a hint, how to achieve this!?

Thanks!
Fabian
import os
import urwid.raw_display
import urwid
from urwid import *
import sys



class TextField(urwid.WidgetWrap):
    def __init__(self, text):
        self.widget = urwid.Text(text)
        self.w = urwid.AttrWrap(self.widget,'bg','focus')
        urwid.WidgetWrap.__init__(self, self.w)
        self.selected = False

    def keypress(self, size, key):
        return key

    def selectable(self):
        return True


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

def post_press(self, button):
		raise DialogExit(button.exitcode)
def pre_press(self, button):
		raise DialogExit(button.exitcode)
def solve_press(self, button):
		raise DialogExit(button.exitcode)
def overview_press(button):
    inner_head= AttrWrap(Text("NEU"),'bg3')
    print "HALLO"    
#    raise DialogExit(button.exitcode)
def caseBuild_press(self, button):
		raise DialogExit(button.exitcode)

def run():
    some_text_list = urwid.SimpleListWalker(map(TextField, (("this is some content of list"*10).split())))
    listbox = urwid.ListBox(some_text_list)
    emptylist=[]
    emptylistbox = urwid.ListBox(emptylist)
    

    inner_foot = urwid.Text("inner_foot")
    
    postButton=urwid.AttrWrap(Button("Post",post_press,None),"bg","focus")
    caseBuilderButton=urwid.AttrWrap(Button("Case Builder",caseBuild_press,None),"bg","focus")
    preButton=urwid.AttrWrap(Button("Pre",pre_press,None),"bg","focus")
    solverButton=urwid.AttrWrap(Button("Solver",solve_press,None),"bg","focus")
    overviewButton=urwid.AttrWrap(Button("OverView",on_press=overview_press,user_data=None),"bg","focus")
    

    divider=urwid.Divider(div_char=' ', top=0, bottom=0)

    topButtons=urwid.Pile([overviewButton,divider,solverButton,divider,preButton,divider, caseBuilderButton,divider,postButton])
    topButtons= AttrWrap(topButtons,'bg2')
    foot_column=Text("foot")
    inner_head= AttrWrap(Text("innerText"),'bg3')
    inner_head = AttrWrap(LineBox(inner_head),'line')
    height = 30
    
    columnsC = Columns([("weight",1,listbox),("fixed",10,listbox),emptylistbox], 1)
    
    fillerR= AttrWrap(LineBox(columnsC),'bg3')

    widget1 = urwid.Pile([divider,('weight',10,topButtons),divider]) #('weight',10,topButtons2)])
    filler= AttrWrap(urwid.Filler(widget1,'top'),'bg3')
    filler= AttrWrap(LineBox(filler),'line')
    columns = Columns([('fixed',20,filler),fillerR], 1)
    
    user_input = urwid.Edit("Type things here ->","")
    status_bar = urwid.Text("Everything is just great")
    footer = urwid.Pile( [user_input, status_bar], focus_item=0 )
    inner_frame = urwid.Frame(body=columns, footer=footer, header=inner_head)

    outer_foot = urwid.Text("outer_foot")
    outer_head = urwid.Text("outer_head")
    
    outer_frame = urwid.Frame(body=inner_frame, footer=outer_foot,
header=outer_head)

    size = ui.get_cols_rows()
    canvas = outer_frame.render(size, focus=1)
    ui.draw_screen(size, canvas)

    while True:
        size = ui.get_cols_rows()
        key = ui.get_input()
        for k in key:
            if k == 'meta a':
                print "H"
                
            if k == 'j' or k=='down':
                outer_frame.keypress(size, 'down')
                #inner_foot.set_text(listbox.get_focus()[0].widget.text)
                
            elif k == 'k' or k=='up':
                outer_frame.keypress(size, 'up')
                #inner_foot.set_text(listbox.get_focus()[0].widget.text)

            if key == "p":
                user_input.set_focus(1, coming_from='above' )
                
        canvas = outer_frame.render(size, focus=1)
        ui.draw_screen(size, canvas)


palette = [
    ('body', 'black', 'light gray'),
    ('bg', 'black', 'dark green', 'standout'),
    ('bg3', 'dark green', 'black'),
    ('line', 'dark blue', 'black'),
    ('focustext','light gray','dark blue'),
    ('bg2', 'black', 'dark green'),
    ('focus', 'dark blue', 'light gray', 'bold')]

ui = urwid.raw_display.Screen()
ui.register_palette(palette)

ui.run_wrapper(run)

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

Reply via email to