Végre egy ListBox

szavazat
0

Kell, hogy végre egy ListBox egy mobil. Az egyetlen releváns kontrollok fel és le nyilakkal. A ListBox kell megjeleníteni, mint sok sort elemek listából mint amennyi elfér a képernyőn (screen_rows), egy sorban kell highighted (sel_row), és a kijelző lezárja, ha a felhasználó a felfelé mutató nyilat, ha az első elem ki van jelölve, vagy le nyilat ha az utolsó elem ki van jelölve (vagyis az utolsó elem jelenjen meg, és kiemelte, ha a felhasználó megnyomja, amikor az első elem ki van jelölve). Fel nyíl kiemeli az előző elemet és le nyíl kiemeli a következő tételt.

Tettem valamit együtt, de aggaszt kihagytam valamit tesztelés. Ott kell lennie egy szabványos módja ennek, mivel a prevalenciája listbox odakint.

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: miután minden funkciót hívom Újrarajzolás képernyő funkció újra rajzolja a képernyőre top_item tetején és sel-sorban kiemelve.

Adtam egy pszeudo-kód tag, ha valaki van olyan változata is a valamit, ami nem python.

A kérdést 20/10/2009 14:24
a forrás felhasználó
Más nyelveken...                            


1 válasz

szavazat
1

Kevés Python programok végrehajtásához listbox a semmiből - ők általában csak a meglévö eszközkészlet. Ez talán megmagyarázza, hogy miért nincs igazi cross-toolkit „standard”! -)

Jön a kódot, gondolom set_posazt jelenti, hogy az úgynevezett után sem up_keyvagy down_keykész vagy (ha nem teszi ezt teljesen világos).

A fő gond lenne a ismétlődés és az aszimmetria között, a két _keyrutin. Bizonyára, mivel a szemüveg annyira hasonlóak fel és le gombokkal, szeretné átruházni egy funkció kerül egy „növekményt” érv, akár 1 vagy -1. Ezt a közös függvényt először nem self.sel_row += increment, akkor azonnal vissza a gyakori esetben, amikor sel_rowmég rendben van, azaz if self.top_item <= self.sel_row < self.top_item + self.screen_rows; egyébként foglalkozik azokkal az esetekkel, amikor sel_rowkilépett az aktuálisan megjelenített régió beállításával self.top_item, kilépés, ha ez nem okoz szükség körbehajtjuk, vagy végül foglalkozik a körbefutó esetben.

Lennék szívesen alkalmazzák „lapos jobb, mint a beágyazott” többszöri használatával konstrukciók formájában „némi szükséges állami lehetőséget, ha a dolgok most finom, visszatérés” helyett logikusan bonyolultabb „, ha csinál egy egyszerű dolog rendben lesz , majd tegye az egyszerű dolog, még ha valami egy kicsit bonyolultabb, de nem szörnyű van szükség, akkor ezt a bonyolult valamit, mást, ha mi vagyunk a nagyon bonyolult ügy, foglalkozik a nagyon bonyolult probléma”- ez utóbbi sokkal több hibával és nehezebb követni minden esetben.

Válaszolt 20/10/2009 16:30
a forrás felhasználó

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