【发布时间】: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