Implementieren einer Auswahlbox

stimmen
0

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.

Veröffentlicht am 20/10/2009 um 14:24
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
1

Nur wenige Python-Programme implementieren Listboxen von Grund auf neu - sie sind normalerweise nur aus bestehenden Toolkits genommen. Das mag erklären, warum gibt es keinen wirklichen Quer Toolkit „Standard“ -)

Kommen zu Ihrem Code, stelle ich mir set_posgemeint Recht genannt zu werden , nachdem entweder up_keyoder down_keyfertig sind (Sie müssen nicht diesen ganz klar machen).

Meine größte Sorge wäre, die repetitiousness und Asymmetrie zwischen den beiden _keyRoutinen. Sicher gegeben , dass Ihre Angaben so ähnlich sind , für die Auf- und Ab - Taste, möchten Sie auf eine einzelne Funktion delegieren , die ein „Zuwachs“ Argument, entweder +1 oder -1. Die gemeinsame Funktion könnte zuerst tun self.sel_row += increment, dann sofort wieder in dem gemeinsamen Fall , in dem sel_rownoch in Ordnung ist, das heißt if self.top_item <= self.sel_row < self.top_item + self.screen_rows; befassen sich sonst mit den Fällen , in denen sel_rowdie aktuell angezeigte Region verlassen hat, durch Einstellung self.top_item, Verlassen , wenn diese keine Notwendigkeit verursacht Wraparound, oder schließlich mit den Rundum - Fällen zu tun.

Ich wäre daran interessiert, „flach ist besser als verschachtelt“ anzuwenden, indem wiederholt Konstrukte der Form „haben einige erforderlichen Zustand Chance, wenn die Dinge sind jetzt in Ordnung, return“ mit eher als logisch komplexer „, wenn eine einfache Sache zu tun wird in Ordnung sein , dann tun die einfache Sache, sonst, wenn etwas ein bisschen komplizierter, aber nicht schrecklich benötigt wird, dann tun das komplizierte etwas, sonst, wenn wir in einer wirklich komplizierten Fall sind, mit dem wirklich kompliziert Problem lösen“- letzteres ist weit anfällige und schwieriger Fehlern in jedem Fall zu folgen.

Beantwortet am 20/10/2009 um 16:30
quelle vom benutzer

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