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.













