实现列表框

问题描述 投票:0回答:2

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

python listbox pseudocode
2个回答
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
,如果不需要环绕则退出,或者最后处理环绕的情况。

我热衷于通过重复使用“执行一些所需的状态机会;如果现在一切正常,则返回”形式的结构来应用“扁平比嵌套更好”,而不是逻辑上更复杂的“如果做一件简单的事情将是好吧,那就做简单的事情;否则,如果需要一些更复杂但并不可怕的事情,那么就做复杂的事情;否则,如果我们遇到真正复杂的情况,那就处理真正复杂的问题”——后者是在任何情况下都更容易出错并且更难遵循。


0
投票

列表或组合框可以很容易地用其他编程语言实现......但在Python中需要安装GUI包的漫长过程!即使它对人工智能等许多东西很有用,它似乎也很烦人

!apt-get 安装 xvfb !Xvfb :1 -屏幕 0 1024x768x24 & !导出显示=:1

© www.soinside.com 2019 - 2024. All rights reserved.