Punerea în aplicare a unui listbox

voturi
0

Am nevoie să pună în aplicare un listbox pentru un telefon mobil. Singurele controale relevante sunt în sus și în jos tastele săgeată. Listbox ar trebui să afișeze cât mai multe rânduri de elemente dintr-o listă ca se va potrivi pe ecran (screen_rows), un rând ar trebui să fie highighted (sel_row) și afișajul trebuie să înfășurați în cazul în care utilizatorul lovește pe săgeata în sus atunci când primul element este evidențiat sau săgeată în jos în cazul în care ultimul element este evidențiat (adică, ultimul element trebuie să fie afișat și evidențiat în cazul în care utilizatorul hit-uri atunci când primul element este evidențiat). Săgeată sus scoate în evidență elementul anterior și săgeata în jos scoate în evidență elementul următor.

Am pus ceva împreună, dar sunt în cauză am pierdut ceva în testare. Trebuie să existe o modalitate standard de a face acest lucru, având în vedere prevalența listboxes acolo.

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: după fiecare funcție eu numesc o funcție ecran redesenare, care redesenează ecranul cu top_item în partea de sus și individual-rând evidențiat.

Am adăugat o etichetă pseudo-cod, în cazul în care cineva are o versiune în ceva care nu-i Python.

Întrebat 20/10/2009 la 14:24
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
1

Programele Python Puțini să pună în aplicare listboxes de la zero - acestea sunt în mod normal, doar luate de la toolkit existente. Acest lucru ar putea explica de ce nu există nici o reală cross-set de instrumente „Standard“ -!)

Venind la codul dvs., îmi imaginez set_poseste menit să fie numit imediat după fie up_keysau down_keysunt finisate (nu face acest lucru foarte clar).

Griji meu principal ar fi repetitiousness și asimetria dintre cele doua _keyrutine. Cu siguranță având în vedere că specificațiile dvs. sunt atât de asemănătoare pentru sus și în jos tastele, doriți să delege o singură funcție , care ia o „creștere“ argument, fie +1 sau -1. Această funcție comună ar putea face în primul rând self.sel_row += increment, apoi să se întoarcă imediat în cazul în care comun sel_roweste încă bine, și anume if self.top_item <= self.sel_row < self.top_item + self.screen_rows; în caz contrar se ocupe de cazurile în care sel_rowa ieșit din zona afișată în prezent, prin ajustarea self.top_item, în cazul în care determină ieșirea nu este nevoie să wraparound, sau în cele din urmă se ocupă cu cazurile wraparound.

Mi-ar fi dornici să se aplice „plat este mai bun decât imbricate“, prin utilizarea în mod repetat constructe de forma „face o șansă de stat necesare, în cazul în care lucrurile sunt acum bine, întoarcere“, mai degrabă decât în ​​mod logic mai complex „, dacă faci un lucru simplu va fi OK , apoi face un lucru simplu, altfel, dacă este nevoie de ceva un pic mai complicat, dar nu teribil, apoi face ceva complicat, altfel, dacă suntem într-un caz foarte complicat, se ocupă de problema foarte complicată“- acesta din urmă este mult mai predispuse la erori și mai greu de urmat, în orice caz.

Publicat 20/10/2009 la 16:30
sursa de către utilizator

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