0

モバイル用のリストボックスを実装する必要があります。関連するコントロールは上下の矢印キーのみです。リストボックスは、リストから画面に収まる数の項目の行を表示する必要があり (screen_rows)、1 つの行を強調表示し (sel_row)、最初の項目が強調表示されているときにユーザーが上向き矢印または下向き矢印を押すと、表示が折り返される必要があります。最後の項目が強調表示されている場合 (つまり、最初の項目が強調表示されているときにユーザーがヒットした場合、最後の項目が表示され、強調表示されます)。上矢印は前の項目を強調表示し、下矢印は次の項目を強調表示します。

私は何かをまとめましたが、テストで何かを逃したのではないかと心配しています。リストボックスが普及していることを考えると、これを行う標準的な方法が必要です。

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

編集: 各関数の後、画面の再描画関数を呼び出します。これにより、top_item が上部にあり、sel-row が強調表示された状態で画面が再描画されます。

誰かが Python 以外のバージョンを持っている場合に備えて、擬似コード タグを追加しました。

4

1 に答える 1

1

リストボックスをゼロから実装する Python プログラムはほとんどありません。通常は、既存のツールキットから取得したものです。それが本当のクロスツールキット「標準」がない理由を説明するかもしれません!-)

あなたのコードに来て、私はどちらかが終了set_posした直後に呼び出されることを意図していると思います(これを完全に明確にするわけではありません)。up_keydown_key

_key私の主な心配は、あなたの 2 つのルーチンの反復性と非対称性です。あなたの仕様が上向きキーと下向きキーで非常に似ていることを考えると、+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か、ラップアラウンドが必要ない場合は終了するか、最終的にラップアラウンド ケースを処理します。

「フラットは入れ子よりも優れている」という形式の構成を繰り返し使用することで、「必要な状態のチャンスを実行します。物事がうまくいったら、論理的により複雑になるのではなく、戻ります」を適用したいと思います。 、次に単純なことを行います。そうでない場合は、もう少し複雑だがひどくはないものが必要な場合は、複雑なことを行います。それ以外の場合は、本当に複雑な場合は、本当に複雑な問題に対処します」 -- 後者は遠いですいずれにせよ、エラーが発生しやすく、追跡するのが難しくなります。

于 2009-10-20T15:30:14.800 に答える