实现一个列表框

时间:2009-10-20 13:24:01

标签: python listbox pseudocode

我需要为移动设备实现一个列表框。唯一相关的控件是向上和向下箭头键。列表框应该显示列表中适合屏幕的多行项目(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。

1 个答案:

答案 0 :(得分:1)

很少有Python程序从头开始实现列表框 - 它们通常只是从现有的工具包中获取。这可以解释为什么没有真正的交叉工具包“标准”! - )

来到你的代码,我想set_pos是在up_keydown_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,退出,如果这不需要回绕,或最终处理回收的情况。

我会热衷于通过反复使用“做一些必要的状态机会;如果事情现在好了,返回”而不是逻辑上更复杂的“如果做一件简单的事情”的形式的构造来应用“扁平比嵌套更好”会好的,然后做简单的事情;否则如果需要更复杂但不可怕的东西,那就做复杂的事情;否则如果我们处在一个非常复杂的情况下,处理真正复杂的问题“ - 后者更容易出错,在任何情况下都更难以遵循。