Implementovat ListBox

hlasů
0

Musím zavést ListBox pro mobil. Jediné relevantní prvky jsou nahoru a dolů šipkami. Listbox by měla zobrazovat jako mnoho řádků položek ze seznamu, jak se vejde na obrazovku (screen_rows), by měla být jedna řada highighted (sel_row) a na displeji by měl zabalit, pokud uživatel zmáčkne šipku nahoru, když je první položka zvýrazněna nebo šipky dolů pokud je zvýrazněna poslední položka (to znamená, že se poslední položka by měla být zobrazeny a zvýrazněny v případě, že uživatel narazí, když je zvýrazněna první položka). Šipka nahoru upozorňuje na předchozí položku a šipka dolů upozorňuje na další položku.

Já jsem dal něco dohromady, ale jsem znepokojen jsem něco uniklo při testování. Musí se jednat o standardní způsob, jak to udělat, vzhledem k tomu, prevalence listboxes venku.

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: po každé funkci volám funkci překreslení obrazovky, které překreslí obrazovku top_item nahoře a SEL-řádku zvýrazněny.

Přidal jsem pseudo-kódu tag, v případě, že někdo má verze v něco, co je to python.

Položena 20/10/2009 v 14:24
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
1

Několik Python programy realizovat listboxy od nuly - jsou obvykle jen vzít ze stávajících sad nástrojů. Které mohou vysvětlit, proč není tam žádný skutečný cross-toolkit „standard“ -!)

Příchod do vašeho kódu, jsem si představit, set_posje chtěl být nazýván hned po jeden up_keynebo down_keyhotové (nechcete, aby to zcela jasné).

Mou hlavní starostí by byl repetitiousness a asymetrii mezi svými dvěma _keyrutiny. Jistě vzhledem k tomu, že vaše specifikace jsou tak podobné, až klávesami dolů, chcete přenést na jednu funkci, která bere argument „přírůstek“, a to buď +1 nebo -1. Že společné funkce by mohla nejprve se self.sel_row += incrementpak okamžitě vrátit v obvyklém případě, kdy sel_rowje ještě v pořádku, tj if self.top_item <= self.sel_row < self.top_item + self.screen_rows; jinak vypořádat s případy, kdy sel_rowbyl ukončen právě zobrazenou oblast, úpravou self.top_item, vystupující v případě, že způsobí, že není třeba namotání, nebo konečně zabývající se případy wraparound.

Byla bych ráda, aby se vztahují „Byt je lepší než vnořené“ opakovaným použitím konstruktů formě „udělat nějaké požadované státní šanci, když věci jsou nyní v pořádku, návrat“ spíše než logicky složitější „, pokud dělá jednoduchou věc bude v pořádku , pak to jednoduchá věc, jinak, pokud je potřeba něco trochu složitější, ale není tak strašné, pak to komplikované něco, jinak když jsme v opravdu komplikované věci řešit opravdu komplikovaný problém“- druhý je daleko více náchylné k chybám a těžší sledovat v každém případě.

Odpovězeno 20/10/2009 v 16:30
zdroj uživatelem

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