Mettre en œuvre une zone de liste

voix
0

Je dois mettre en œuvre un listbox pour un mobile. Les seuls contrôles pertinents sont et les touches fléchées. La zone de liste doit afficher autant de lignes d'éléments dans une liste que l'affichage sur l'écran (screen_rows), une ligne doit être highighted (sel_row) et l'affichage doit envelopper si l'utilisateur frappe flèche lorsque le premier élément est mis en surbrillance ou vers le bas si le dernier élément est mis en évidence (à savoir, le dernier élément doit être affiché et mis en évidence si l'utilisateur touche lorsque est en surbrillance le premier élément). Flèche met en évidence l'élément précédent et flèche vers le bas met en avant l'élément suivant.

J'ai mis quelque chose ensemble, mais je suis inquiet, je l'ai manqué quelque chose dans les tests. Il doit y avoir un moyen standard de faire cela, compte tenu de la prévalence de listboxes là-bas.

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: après chaque fonction I appeler une fonction d'écran d'emboutissage de reprise, qui retrace l'écran avec top_item à la rangée supérieure et sel mis en surbrillance.

J'ai ajouté une étiquette pseudo-code, dans le cas où quelqu'un a une version dans quelque chose qui est pas python.

Créé 20/10/2009 à 14:24
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
1

Peu de programmes Python mettre en œuvre listboxes à partir de zéro - ils sont normalement juste pris de boîtes à outils existants. Cela peut expliquer pourquoi il n'y a pas de contre-toolkit réel « standard » -!)

En venant à votre code, je pense set_posest censé être appelé juste après deux up_keyou down_keysont finis (vous ne faites pas tout à fait clair).

Mon principal souci serait la répétitivité et l' asymétrie entre vos deux _keyroutines. Certes , étant donné que vos spécifications sont si semblables pour touches haut et bas, vous souhaitez déléguer à une seule fonction qui prend un argument « incrément », soit +1 ou -1. Cette fonction commune pourrait d' abord faire self.sel_row += increment, puis revenir immédiatement dans le cas commun où sel_rowest toujours très bien, à savoir if self.top_item <= self.sel_row < self.top_item + self.screen_rows; autrement traiter les cas où sel_rowa quitté la région en cours d' affichage, en ajustant self.top_item, en sortant si cela ne provoque pas besoin de enveloppants, ou enfin traiter les cas enveloppants.

Je serais désireux d'appliquer « plat est mieux que imbriqué » par plusieurs reprises en utilisant des constructions de la forme « faire un peu de chance de l'État requis, si les choses sont maintenant très bien, le retour » plutôt que logiquement plus complexe « se faire une chose simple sera OK , puis faire la chose simple, si quelque chose d'autre un peu plus compliqué, mais pas si terrible est nécessaire, puis faire quelque chose compliquée, d'autre si nous sommes dans un cas très compliqué, régler le problème vraiment compliqué » - ce dernier est loin plus sujettes à l'erreur et plus difficile à suivre dans tous les cas.

Créé 20/10/2009 à 16:30
source utilisateur

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