Domanda

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 qualcosa insieme, 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 è python.

È stato utile?

Soluzione

programmi Python Pochi implementare listboxes da zero - sono normalmente solo presi da toolkit esistenti. Questo potrebbe spiegare il motivo per cui non c'è nessun vero cross-toolkit "standard" -!)

Venendo al codice, immagino set_pos è destinato a essere chiamato subito dopo o up_key o down_key sono finiti (non si fanno questo del tutto chiaro).

La mia preoccupazione principale sarebbe la ripetitività e l'asimmetria tra le due routine _key. Sicuramente, dato che le caratteristiche del tuo sono così simili per su e giù le chiavi, si vuole delegare a una sola funzione che prende un argomento "incremento", o +1 o -1. Tale funzione comune potrebbe prima fare self.sel_row += increment, per poi tornare immediatamente nel caso comune in cui sel_row è ancora valida, cioè if self.top_item <= self.sel_row < self.top_item + self.screen_rows; altrimenti affrontare i casi in cui sel_row non fuoriesce la regione attualmente visualizzata, regolando self.top_item, uscendo caso, possono causare alcun bisogno di avvolgente, o infine trattare i casi avvolgenti.

Sarei entusiasta di applicare "flat è meglio di nested" ripetutamente usando costrutti del modulo di "fare qualche possibilità stato richiesto; se le cose sono ora bene, il ritorno", piuttosto che logicamente più complessa ", se fare una cosa semplice sarà OK, poi fare la cosa semplice, altrimenti se è necessario qualcosa di un po 'più complicato, ma non è terribile, poi fare il complicato qualcosa, altrimenti se siamo in un caso davvero complicato, affrontare il problema davvero complicato" - la quest'ultimo è molto più soggetto ad errori e più difficile da seguire in ogni caso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top