Ho bisogno di implementare una casella di riepilogo per un cellulare. Gli unici controlli rilevanti sono su e giù tasti freccia. Listbox dovrebbe visualizzare il numero di righe di elementi da un elenco come si adatta sullo schermo (screen_rows), una riga deve essere highighted (sel_row) e il display dovrebbe avvolgere se l'utente preme freccia su quando il primo elemento viene evidenziata o freccia giù se l'ultimo elemento viene evidenziato (cioè, l'ultimo elemento deve essere visualizzato ed evidenziato se l'utente preme quando il primo elemento è evidenziato). Freccia in su mette in evidenza la voce precedente e freccia giù mette in evidenza la voce successiva.
Ho messo insieme qualcosa, ma sono preoccupato che ho perso qualcosa in fase di test. Ci deve essere un modo standard per fare questo, data la prevalenza di listboxes là fuori.
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: dopo ogni funzione chiamo una funzione schermo di schermo, che ridisegna lo schermo con top_item in alto e sel-riga evidenziata.
Ho aggiunto un tag di pseudo-codice, nel caso in cui qualcuno ha una versione in qualcosa che non è di pitone.













