bir liste uygulamak

oy
0

Bir mobil cihazlar için bir liste uygulamak gerekir. sadece ilgili kontroller yukarı ve aşağı ok tuşlarını bulunmaktadır. , Bir satır highighted edilmelidir ekrana (screen_rows) sığacak şekilde listbox listeden öğelerin sayısı kadar satır göstermesi gerekir (sel_row) ve ilk öğe aşağı ok vurgulanmış veya edildiğinde kullanıcı okunu yukarı vurursa ekran sarmak gerekir son öğe vurgulanmış ise (yani son madde görüntülenir ve ilk maddesi seçildiğinde kullanıcı yukarı vurursa vurgulanmalıdır). Yukarı ok önceki öğeyi vurgular ve aşağı ok sonraki öğeyi vurgular.

Ben birlikte birşeyler koyduk ama testlerde şey kaçırdığınızı endişe duyuyorum. Orada süzer yaygınlığı göz önüne alındığında, bunun için standart bir yolu olmalı.

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

DÜZENLEME: Her işlev sonra vurgulanan üst ve sel-satırdaki top_item ekrana yeniden çizer bir yeniden çizme ekran işlevini çağırır.

Birinin piton değil şeyin bir sürüme sahip durumda bir sözde kod etiketi, ekledik.

Oluştur 20/10/2009 saat 14:24
kaynak kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
1

Birkaç Python programları sıfırdan ListBoxes uygulamak - normalde sadece mevcut araci alınan ediyoruz. ! Hiçbir gerçek çapraz araç "standart" Bu yüzden orada açıklayabilir -)

Kodunuza geliyor, ben hayal set_posya hemen sonra çağrılacak içindir up_keyya down_keybitmiş olan (bunu tamamen açık yapmazlar).

Benim asıl endişe senin iki arasındaki repetitiousness ve asimetri olacaktır _keyrutinler. Şüphesiz senin gözlük yukarı ve anahtarlar aşağı için çok benzer olduğu göz önüne alındığında, sen +1 veya -1 ya bir "artım" argüman alır tek işleve temsilci istiyorum. Bu ortak işlev ilk yapabileceği self.sel_row += increment, daha sonra hemen ortak durumda dönmek sel_row, yani hala kullanılabilir durumda if self.top_item <= self.sel_row < self.top_item + self.screen_rows; Aksi durumlarda başa sel_rowayarlayarak, o anda görüntülenen bölgesini terk etti self.top_itemo bölgesini saran ya nihayet sarma davalara gerek neden olursa çıkarken,.

Ben defalarca formun yapılar kullanılarak "düz iç içe daha iyidir" uygulamak istekli olurdu "bazı gerekli devlet şans yapmak; şeyler şimdi iyi, dönüş ise" oldukça mantıklı daha karmaşık daha "eğer basit bir şey yapıyor Tamam olacak ardından basit bir göreve; korkunç biraz daha karmaşık ama bir şey tabi başka, o zaman karmaşık bir şey yapmak, biz gerçekten komplike durumda iseniz başka, gerçekten karmaşık sorunu" başa - ikincisi uzaktır daha hataya ve sert her durumda takip etmek.

Cevap 20/10/2009 saat 16:30
kaynak kullanıcı

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