Εφαρμογή ενός πλαισίου λίστας

ψήφοι
0

Θα πρέπει να εφαρμόσει ένα πλαίσιο λίστας για ένα κινητό. Οι μόνοι σχετικοί έλεγχοι βρίσκονται πάνω και κάτω βέλη. Το πλαίσιο λίστας πρέπει να εμφανίζει όσες σειρές στοιχεία από μια λίστα, όπως θα ταιριάζει στην οθόνη (screen_rows), μία σειρά θα πρέπει να highighted (sel_row) και η οθόνη θα πρέπει να τυλίξετε αν ο χρήστης πατήσει επάνω βέλος, όταν το πρώτο στοιχείο έχει επισημανθεί ή κάτω βέλος εάν το τελευταίο στοιχείο έχει επισημανθεί (δηλαδή, θα πρέπει να εμφανίζεται το τελευταίο στοιχείο και υπογράμμισε αν ο χρήστης πατήσει όταν το πρώτο στοιχείο έχει επισημανθεί). Πάνω βέλος επισημαίνει το προηγούμενο στοιχείο και κάτω βέλος επισημαίνει το επόμενο στοιχείο.

Έχω βάλει κάτι μαζί, αλλά ανησυχώ έχω χάσει κάτι στις δοκιμές. Πρέπει να υπάρχει ένας τυπικός τρόπος για να γίνει αυτό, με δεδομένη την επικράτηση της listboxes εκεί έξω.

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: Μετά από κάθε λειτουργία που εγώ αποκαλώ μια λειτουργία οθόνης ανασχηματισμού, που επανασχεδιάζει την οθόνη με top_item στην κορυφή και sel-σειρά υπογράμμισε.

Έχω προσθέσει μια ετικέτα ψευδο-κώδικα, σε περίπτωση που κάποιος έχει μια έκδοση σε κάτι που δεν είναι python.

Δημοσιεύθηκε 20/10/2009 στις 14:24
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
1

Λίγα προγράμματα Python εφαρμογή listboxes από το μηδέν - από όπου και αν συνήθως μόλις ληφθεί από τις υπάρχουσες εργαλείων. Αυτό μπορεί να εξηγήσει γιατί δεν υπάρχει πραγματική cross-εργαλειοθήκη «πρότυπο» -!)

Ερχόμενοι στον κώδικά σας, φαντάζομαι set_posέχει ως στόχο να κληθεί αμέσως μετά είτε up_keyείτε down_keyείναι έτοιμο (να μην κάνει αυτό το απολύτως σαφές).

Κύρια ανησυχία μου ήταν η επαναληπτικότητα και η ασυμμετρία μεταξύ των δύο σας _keyρουτίνα. Σίγουρα, δεδομένου ότι specs σας είναι τόσο όμοια για πάνω και κάτω πλήκτρα, θέλετε να αναθέσετε σε ένα μόνο συνάρτηση που παίρνει μια «αύξηση» επιχείρημα, είτε +1 ή -1. Αυτή η κοινή λειτουργία θα μπορούσε πρώτα χρειάζεται self.sel_row += increment, στη συνέχεια επιστρέφουν αμέσως στην κοινή περίπτωση κατά την οποία sel_rowεξακολουθεί να είναι μια χαρά, δηλαδή if self.top_item <= self.sel_row < self.top_item + self.screen_rows? Αλλιώς ασχοληθεί με τις περιπτώσεις κατά τις οποίες sel_rowέχει εξέλθει από την στιγμή που εμφανίζεται περιοχής, με την προσαρμογή self.top_item, την έξοδο αν αυτό δεν προκαλεί καμία ανάγκη να περιτύλιξης, ή, τέλος, ασχολείται με τις περιπτώσεις περιτύλιξης.

Θα ήθελα να είναι πρόθυμοι να εφαρμόσουν «επίπεδη είναι καλύτερο από το ένθετο» από επανειλημμένα χρησιμοποιώντας δομές της μορφής «να κάνει κάποια απαιτούνται ευκαιρία κατάσταση? Αν τα πράγματα είναι τώρα μια χαρά, επιστροφή» και όχι λογικά πιο περίπλοκη «, αν κάνει ένα απλό πράγμα θα είναι εντάξει , στη συνέχεια, κάνουν το απλό πράγμα? άλλο αν χρειάζεται κάτι λίγο πιο περίπλοκο, αλλά δεν είναι τρομερό, τότε κάνει το περίπλοκο κάτι? άλλο, αν είμαστε σε μια πολύ περίπλοκη υπόθεση, ασχολείται με το πολύ περίπλοκο πρόβλημα»- το τελευταίο είναι πολύ πιο επιρρεπείς σε λάθη και πιο δύσκολο να ακολουθήσει σε κάθε περίπτωση.

Απαντήθηκε 20/10/2009 στις 16:30
πηγή χρήστη

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