سؤال

أحتاج إلى تنفيذ صندوق قائمة للجوال. الضوابط الوحيدة ذات الصلة هي مفاتيح الأسهم لأعلى ولأسفل. يجب أن يعرض ListBox أكبر عدد من صفوف العناصر من القائمة كما ستناسب الشاشة (screen_rows) ، ويجب أن يكون صف واحد مرتفعًا (SEL_ROW) ويجب أن يلفت الشاشة إذا قام المستخدم بسهم لأعلى عند تسليط الضوء على العنصر الأول أو أسفل السهم إذا تم تسليط الضوء على العنصر الأخير (أي ، يجب عرض العنصر الأخير وتمييزه إذا قام المستخدم بإعداده عند تسليط الضوء على العنصر الأول). يبرز UP Arrow العنصر السابق وأسفل السهم يبرز العنصر التالي.

لقد وضعت شيئًا معًا ، لكنني قلق لقد فاتني شيء في الاختبار. يجب أن تكون هناك طريقة قياسية للقيام بذلك ، بالنظر إلى انتشار صناديق القائمة هناك.

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 تنفذ قوائم القائمة من نقطة الصفر - عادة ما تكون مأخوذة للتو من مجموعات الأدوات الموجودة. قد يفسر هذا سبب عدم وجود "قياسي" متقاطع حقيقي!-)

قادم إلى الكود الخاص بك ، أتصور set_pos من المفترض أن يتم استدعاؤه مباشرة بعد أي منهما up_key أو down_key تم الانتهاء (أنت لا توضح هذا تمامًا).

إن قلقي الرئيسي هو التكرار وعدم التماثل بين اثنين _key الروتين. بالتأكيد بالنظر إلى أن المواصفات الخاصة بك متشابهة للغاية للمفاتيح لأعلى ولأسفل ، فأنت تريد تفويض وظيفة واحدة تأخذ وسيطة "زيادة" ، إما +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, ، والخروج إذا لم يسبب ذلك حاجة إلى التفاف ، أو التعامل مع الحالات الملتوية أخيرًا.

سأكون حريصًا على تطبيق "شقة أفضل من المتداخلة" من خلال استخدام بنيات النموذج "قم ببعض فرصة الحالة المطلوبة ؛ إذا كانت الأمور على ما يرام الآن ، فأعود" بدلاً من التعقيد المنطقي "إذا كان القيام بشيء بسيط سيكون على ما يرام ، ثم افعل الشيء البسيط ؛ وإلا إذا كان هناك حاجة إلى شيء أكثر تعقيدًا ولكن ليس فظيعًا ، فقم بعمل شيء معقد ؛ وإلا أكثر عرضة للخطأ وأصعب متابعة في أي حال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top