我正在学习urwid。
Urwid 列表框有一个不适合我的 API。例如,为了将焦点更改为下一个/上一个元素,我想写:
listbox.focus_next() / listbox.focus_previous()
但是 urwid.ListBox 提供的 API 是这样的:
1)关注列表框中的前一个元素
listwalker = listbox.body
widget,current_position = listwalker.get_focus()
try :
widget,previous_position = listwalker.get_prev(current_position)
listwalker.set_focus(previous_position)
except :
# you're at the beginning of the listbox
pass
2)关注列表框中的下一个元素
# same code, except that you change get_prev with get_next
listwalker = listbox.body
widget,current_position = listwalker.get_focus()
try :
widget,next_position = listwalker.get_next(current_position)
listwalker.set_focus(next_position)
except :
# you're at the end of the listbox
pass
请注意,所有这些方法都不是在列表框本身上调用的,而是在其属性之一(主体)上调用的。
对这种情况不满意,我决定继承 listbox 本身,为 API 提供两个新服务(方法):focus_previous() 和 focus_next(),如下所示:
class MyListBox(urwid.ListBox):
def focus_next(self):
try:
self.body.set_focus(self.body.get_next(self.body.get_focus()[1])[1])
except:
pass
def focus_previous(self):
try:
self.body.set_focus(self.body.get_prev(self.body.get_focus()[1])[1])
except:
pass
在处理令人不快的 API 时,这是(子类化)正确的方法吗?