Ich brauche einen listbox für ein mobiles zu implementieren. Die einzigen relevanten Kontrollen sind nach oben und unten Pfeiltasten. Das Listenfeld sollte so viele Reihen von Elementen aus einer Liste angezeigt werden, wie auf dem Bildschirm passen (screen_rows), soll eine Reihe (sel_row) und die Anzeige highighted werden sollte wickeln, wenn der Benutzer Pfeil trifft, wenn das erste Element markiert ist oder Pfeil nach unten wenn das letzte Element markiert ist (das heißt, soll das letzte Element angezeigt und hervorgehoben werden, wenn der Benutzer trifft, wenn das erste Element markiert ist). Pfeil nach oben hebt den vorherigen Punkt und Pfeil nach unten hebt den nächsten Punkt.
Ich habe etwas zusammen, aber ich bin besorgt ich etwas in Tests verpasst haben. Es muss ein Standard-Weg, dies zu tun, da draußen die Prävalenz von Listboxen gegeben.
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: nach jedem Funktionsaufruf I eine Redraw-Screen-Funktion, die den Bildschirm mit top_item am oberen und sel-Zeile neu zeichnet hervorgehoben.
Ich habe einen Pseudo-Code-Tag, falls hinzugefügt jemand eine Version in etwas, das nicht Python ist.













