我需要为移动设备实现一个列表框。唯一相关的控件是向上和向下箭头键。列表框应该显示列表中适合屏幕的多行项目(screen_rows),一行应该是高亮的(sel_row),如果用户在第一个项目突出显示或向下箭头时点击箭头,则显示应该换行如果最后一项突出显示(即,如果用户在第一项突出显示时点击,则应显示最后一项并突出显示)。向上箭头突出显示上一个项目,向下箭头突出显示下一个项目。
我把一些东西放在一起,但我担心我在测试中遗漏了一些东西。鉴于列表框的普遍存在,必须有一种标准的方法来实现这一点。
def up_key(self):
if self.sel_row > 0:
self.sel_row -= 1
elif self.top_item > 0: # top_item is the index of the first list item
self.top_item -= 1
elif self.top_item == 0:
if self.n_lines >= self.screen_rows: # n_lines is the number of items in the list
self.top_item = self.n_lines - self.screen_rows
self.sel_row = min(self.screen_rows-1, self.n_lines-1)
else:
self.top_item = 0
self.sel_row = self.n_lines-1
def down_key(self):
if self.sel_row < self.screen_rows-1 and self.sel_row < self.n_lines-1:
self.sel_row += 1
elif self.sel_row == self.screen_rows-1:
bottom_item = self.top_item + self.screen_rows
if bottom_item == self.n_lines:
self.top_item = 0
self.sel_row = 0
if bottom_item < self.n_lines:
self.top_item += 1
elif self.sel_row == self.n_lines-1:
self.top_item = 0
self.sel_row = 0
def set_pos(self, pos): # display item with index pos
if pos < 0:
pos = 0
elif pos >= self.n_lines:
pos = self.n_lines - 1
if pos < self.screen_rows:
self.top_item = 0
self.sel_row = pos
else:
self.sel_row = min(self.screen_rows, self.n_lines)//2 - 1
self.top_item = pos - self.sel_row
if self.top_item >= self.n_lines - self.screen_rows:
self.top_item = self.n_lines - self.screen_rows - 1
self.sel_row = pos - self.top_item - 1
编辑:在每个函数之后,我调用一个重绘屏幕功能,重绘屏幕顶部的top_item和突出显示的sel-row。
我添加了一个伪代码标记,以防某人的某个版本不是python。
答案 0 :(得分:1)
很少有Python程序从头开始实现列表框 - 它们通常只是从现有的工具包中获取。这可以解释为什么没有真正的交叉工具包“标准”! - )
来到你的代码,我想set_pos
是在up_key
或down_key
完成之后立即调用的(你没有完全清楚)。
我主要担心的是两个_key
例程之间的重复性和不对称性。当然,鉴于您的规范对于向上和向下键非常相似,您希望委托给一个带有“增量”参数的函数,该函数为+1或-1。该常用函数可以先self.sel_row += increment
,然后立即返回sel_row
仍然正常的常见情况,即if self.top_item <= self.sel_row < self.top_item + self.screen_rows
;否则处理sel_row
退出当前显示区域的情况,通过调整self.top_item
,退出,如果这不需要回绕,或最终处理回收的情况。
我会热衷于通过反复使用“做一些必要的状态机会;如果事情现在好了,返回”而不是逻辑上更复杂的“如果做一件简单的事情”的形式的构造来应用“扁平比嵌套更好”会好的,然后做简单的事情;否则如果需要更复杂但不可怕的东西,那就做复杂的事情;否则如果我们处在一个非常复杂的情况下,处理真正复杂的问题“ - 后者更容易出错,在任何情况下都更难以遵循。