Je dois mettre en œuvre un listbox pour un mobile. Les seuls contrôles pertinents sont et les touches fléchées. La zone de liste doit afficher autant de lignes d'éléments dans une liste que l'affichage sur l'écran (screen_rows), une ligne doit être highighted (sel_row) et l'affichage doit envelopper si l'utilisateur frappe flèche lorsque le premier élément est mis en surbrillance ou vers le bas si le dernier élément est mis en évidence (à savoir, le dernier élément doit être affiché et mis en évidence si l'utilisateur touche lorsque est en surbrillance le premier élément). Flèche met en évidence l'élément précédent et flèche vers le bas met en avant l'élément suivant.
J'ai mis quelque chose ensemble, mais je suis inquiet, je l'ai manqué quelque chose dans les tests. Il doit y avoir un moyen standard de faire cela, compte tenu de la prévalence de listboxes là-bas.
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
EDIT: après chaque fonction I appeler une fonction d'écran d'emboutissage de reprise, qui retrace l'écran avec top_item à la rangée supérieure et sel mis en surbrillance.
J'ai ajouté une étiquette pseudo-code, dans le cas où quelqu'un a une version dans quelque chose qui est pas python.













