微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

urwid更新重点列表

如何解决urwid更新重点列表

删除行后,我尝试更新可聚焦列表,但屏幕未更新新列表。 退出程序并再次运行,数据将正确显示

我正在使用选自example from user elias的SelectableRow。

删除记录但列表没有更新后。如果我退出并再次运行该程序,则新列表会很好显示

import urwid

from filemanager import FileManager

PALETTE = [
    ('bold','bold',''),('reveal focus','black','dark cyan','standout'),]

class SelectableRow(urwid.WidgetWrap):
    def __init__(self,contents,on_select=None):
        self.on_select = on_select
        self.contents = contents
        self._columns = urwid.Columns(
            [urwid.Text(c,wrap='ellipsis') for c in contents],dividechars=10
        )
        self._focusable_columns = urwid.AttrMap(self._columns,'','reveal focus')
        super(SelectableRow,self).__init__(self._focusable_columns)

    def selectable(self):
        return True

    def update_contents(self,contents):
        self.contents[:] = contents
        self._columns = urwid.Columns(
            [urwid.Text(c,'reveal focus')

    def keypress(self,size,key):
        if self.on_select and key in ('d','D'):
            self.on_select(self)
        return key

class CancelableEdit(urwid.Edit):
    def __init__(self,*args,**kwargs):
        self.on_cancel = kwargs.pop('on_cancel',None)
        super(CancelableEdit,self).__init__(*args,**kwargs)

    def keypress(self,key):
        if key == 'esc':
            self.on_cancel(self)
        else:
            return super(CancelableEdit,self).keypress(size,key)

def build_delete_dialog(title,background,on_delete=None,on_cancel=None):
    buttons = urwid.Padding(urwid.Columns([
        urwid.Button('Yes',on_press=on_delete),urwid.Button('No',on_press=on_cancel),]),width=13,align='center')
    pile = urwid.Pile(
        [urwid.Text(title,align='center'),urwid.Divider('-'),urwid.Divider(' ')]
        + contents
        + [urwid.Divider(' '),buttons]
    )
    return urwid.Overlay(
        urwid.Filler(urwid.LineBox(pile)),'center',('relative',80),'middle',60)
    )

class App(object):
    def __init__(self):
        self.filemanager = FileManager()
        self.header = self.get_header()
        self.body = self.get_body()
        self.footer = self.get_footer()
        self.widget = urwid.Frame(header=self.header,body=self.body,footer=self.footer)
        self.loop = urwid.MainLoop(self.widget,PALETTE,unhandled_input=self.handle_input)

    def get_header(self):
        header_text = urwid.Text('TABLE')
        header_padding = urwid.Padding(header_text,left=1,right=1)
        header = urwid.LineBox(header_padding)
        return header

    def get_body(self):
        entries = self.get_entries()

        contents = [
            SelectableRow(row,on_select=self.show_delete_view)
            for row in entries
        ]
        listBox = urwid.ListBox(urwid.SimpleFocusListWalker(contents))

        return urwid.LineBox(urwid.Padding(listBox,right=1))

    def get_footer(self):
        footer_text = urwid.Text([
            u'(D) to delete. ',u'(Q) to quit.'
        ])
        footer_padding = urwid.Padding(footer_text,right=1)
        footer = urwid.LineBox(footer_padding)
        return footer

    def get_entries(self):
        return self.filemanager.find_files()

    def handle_input(self,key):
        if key in ('q','Q','esc'):
            raise urwid.ExitMainLoop()

    def show_delete_view(self,row):
        self._delete = [urwid.Text(row.contents[0],align='center')]
        self.loop.widget = build_delete_dialog(
            title='Delete item',contents=self._delete,background=self.widget,on_delete=partial(self.delete_stored_item,row),on_cancel=self.close_dialog,)

    def delete_stored_item(self,row,btn):
        self.filemanager.delete_file(row.contents[0])
        row.update_contents(self.get_entries())
        self.loop.draw_screen()
        self.loop.widget = self.widget

    def close_dialog(self,btn):
        self.loop.widget = self.widget

    def start(self):
        self.loop.run()

App().start()```

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。