Implementare una casella di riepilogo

voti
0

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.

È pubblicato 20/10/2009 alle 14:24
fonte dall'utente
In altre lingue...                            


1 risposte

voti
1

programmi Python pochi attuano 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 uno up_keyo down_keysono finiti (non fate questo del tutto chiaro).

La mia preoccupazione principale sarebbe la ripetitività e l'asimmetria tra le due _keyroutine. 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 trattare i casi in cui sel_rowè uscito regione attualmente visualizzata, regolando self.top_item, uscendo caso, possono causare alcuna necessità 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" - quest'ultimo è di gran lunga più inclini all'errore e difficile da seguire in ogni caso.

Risposto il 20/10/2009 a 16:30
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more