Wdrożenie listbox

głosy
0

Trzeba zaimplementować listbox na telefon. Jedyne odpowiednie kontrole są w górę iw dół strzałek. Listbox powinien wyświetlać dowolną liczbę rzędów elementów z listy, ile zmieści się na ekranie (screen_rows), jeden wiersz należy highighted (sel_row) i wyświetlacz powinien zawijać jeśli użytkownik wciśnie strzałki w górę, gdy pierwszy element jest zaznaczony lub strzałka w dół jeżeli ostatnia pozycja jest podświetlona (czyli ostatni element powinien być wyświetlony i zaznaczony jeśli użytkownik wciśnie się, gdy jest podświetlona pierwsza pozycja). Strzałka w górę Zaznacza poprzedni element i strzałka w dół wskazuje następną pozycję.

Mam umieścić coś razem, ale jestem zaniepokojony Tęskniłam coś w testowaniu. Tam musi być standardowym sposobem, aby to zrobić, biorąc pod uwagę częstość występowania listboxes tam.

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

Edycja: po każdej funkcji zgłoszę funkcję odświeżania ekranu, który rysuje ekran top_item w górnym rzędzie sel i podkreślono.

Dodałem tag pseudo-code, w przypadku gdy ktoś ma wersję w coś, co nie jest pyton.

Utwórz 20/10/2009 o 14:24
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
1

Kilka programów Python wdrożyć listboxes od podstaw - są one zwykle tylko zaczerpnięte z istniejących zestawów narzędzi. To może wyjaśniać, dlaczego nie ma prawdziwy cross-Toolkit „standard”! -)

Jadąc do kodu, wyobrażam sobie, set_posma być wywoływana tuż po albo up_keyczy down_keysą wykończone (nie rób tego do końca jasne).

Moim głównym zmartwieniem byłby repetitiousness i asymetria pomiędzy swoimi dwoma _keyrutyny. Na pewno biorąc pod uwagę, że specyfikacje są tak podobne do górę iw dół, chcesz przekazać do jednej funkcji, która zajmuje się „przyrost” argumentu, albo +1 lub -1. Że wspólne działanie mogłoby najpierw zrobić self.sel_row += increment, a następnie natychmiast powrócić do wspólnego przypadku, gdy sel_rowjest jeszcze w porządku, tj if self.top_item <= self.sel_row < self.top_item + self.screen_rows; w przeciwnym razie do czynienia z przypadkami, gdzie sel_rowodszedł aktualnie wyświetlany obszar, regulując self.top_item, wyjście jeśli nie powoduje konieczności Wraparound, czy wreszcie do czynienia z przypadkami wraparound.

Byłbym chętnie stosuje się „płaskie jest lepszy niż zagnieżdżone” wielokrotnie używając konstrukcji w postaci „zrobić jakąś szansę wymaganego stanu, jeśli rzeczy są teraz w porządku, zwrot” zamiast logicznie bardziej złożone „jeśli robi prostą rzeczą będzie OK , a następnie zrobić prostą rzecz, jeśli potrzebne jest jeszcze coś nieco bardziej skomplikowana, ale nie straszne, a następnie wykonać skomplikowaną coś; else if jesteśmy w bardzo skomplikowanej sytuacji do czynienia z bardzo skomplikowany problem”- ten ostatni jest daleko bardziej podatne na błędy i trudniejsze do naśladowania w każdym przypadku.

Odpowiedział 20/10/2009 o 16:30
źródło użytkownik

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