【问题标题】:Implement a listbox实现一个列表框
【发布时间】:2010-12-08 08:26:52
【问题描述】:

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


    【解决方案1】:

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

    谈到你的代码,我想set_pos 应该在up_keydown_key 完成后立即被调用(你没有完全说清楚)。

    我主要担心的是你的两个_key 例程之间的重复性和不对称性。当然,鉴于您的向上和向下键的规格非常相似,您希望委托给一个函数,该函数采用“增量”参数,+1 或 -1。该通用函数可以首先执行self.sel_row += increment,然后在sel_row 仍然可以的通用情况下立即返回,即if self.top_item &lt;= self.sel_row &lt; self.top_item + self.screen_rows;否则处理sel_row退出当前显示区域的情况,通过调整self.top_item,如果不需要回绕则退出,或者最后处理回绕的情况。

    我很想通过重复使用“做一些必要的状态机会;如果事情现在很好,返回”而不是逻辑上更复杂的“如果做一件简单的事情”这样的结构来应用“平面比嵌套更好”没问题,那就做简单的事情;否则,如果需要更复杂但不可怕的事情,那就做复杂的事情;否则,如果我们遇到非常复杂的情况,请处理非常复杂的问题”——后者更容易出错,而且在任何情况下都更难遵循。

    【讨论】:

    • 在gui编程的早期,我曾经看到用c或c++实现的列表框,但我找不到任何例子。无论如何,我会看看是否按照您的建议进行更改会使事情变得更简单,然后酌情返回
    • @foosion,是的,在具有合理功能的 GUI 框架和小部件出现之前,当一个人编程到裸 xlib 或类似的东西时,一个人编写了自己的小部件——去过那里,做到了,但是,很久以前!-)
    • @Alex,才过去了 20 年 :-)
    猜你喜欢
    • 2014-12-04
    • 2020-08-15
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    相关资源
    最近更新 更多