如何解决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 举报,一经查实,本站将立刻删除。