سؤال

في wxPython، إذا قمت بإنشاء قائمة بأزرار الاختيار ووضع القائمة في البداية، فهل من الممكن تغيير محتويات تلك القائمة لاحقًا؟

على سبيل المثال، لدي لوحة تستخدم boxSizer لوضع الأدوات في البداية.إحدى هذه الأدوات هي قائمة بأزرار الاختيار (لقد قمت أيضًا بتجربة صندوق راديو عادي).أرغب في تغيير القائمة ديناميكيًا بناءً على متغيرات من فئة أخرى.

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

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

    class Job(wiz.WizardPageSimple):
    """Character's job class."""

    def __init__(self, parent, title, attribs):
        wiz.WizardPageSimple.__init__(self, parent)
        self.next = self.prev = None
        self.sizer = makePageTitle(self, title)
        self.charAttribs = attribs

#---Create widgets
        self.Job_list = ["Aircraft Mechanic", "Vehicle Mechanic", "Electronics Specialist"]

        box1_title = wx.StaticBox( self, -1, "" )
        box1 = wx.StaticBoxSizer( box1_title, wx.VERTICAL )
        grid1 = wx.BoxSizer(wx.VERTICAL)
        for item in self.Job_list:
            radio = wx.RadioButton(self, -1, item)
            grid1.Add(radio)

##Debugging
        self.btn = wx.Button(self, -1, "click")
        self.Bind(wx.EVT_BUTTON, self.eligibleJob, self.btn)

#---Place widgets
        self.sizer.Add(self.Job_intro)
        self.sizer.Add(self.btn)
        box1.Add(grid1)
        self.sizer.Add(box1)        

    def eligibleJob(self, event):
        """Determine which Jobs a character is eligible for."""

        if self.charAttribs.intelligence >= 12:
            skillList = ["Analyst", "Interrogator", "Fire Specialist", "Aircraft Pilot"]
            for skill in skillList:
                self.Job_list.append(skill)
            print self.Job_list ##Debugging
        #return self.Job_list
هل كانت مفيدة؟

المحلول

لإظهار عناصر القائمة الجديدة في الأماكن الصحيحة، يتعين عليك إعادة تخطيط الشبكة بعد إضافة عناصر جديدة إليها.على سبيل المثال، لإضافة بعض العناصر الجديدة، يمكنك الاتصال بـ:

def addNewSkills(self, newSkillList):
    '''newSkillList is a list of skill names you want to add'''
    for skillName in newSkillList:
        newRadioButton = wx.RadioButton(self, -1, skillName)
        self.grid1.Add(newRadioButton) # appears in top-left corner of the panel
    self.Layout() # all newly added radio buttons appear where they should be
    self.Fit() # if you need to resize the panel to fit new items, this will help

أين self.grid1 هو الحجم الذي تحتفظ به جميع أزرار الاختيار الخاصة بك.

نصائح أخرى

اثنين من الحلول الممكنة

  1. أعد بناء أداة تحديد الحجم باستخدام عناصر واجهة المستخدم الخاصة بالراديو في كل مرة يتعين عليك فيها إجراء تغيير
  2. احتفظ بأدوات زر الاختيار في القائمة، واتصل بـ SetLabel في كل مرة يتعين عليك فيها تغيير تسمياتها.

لقد تمكنت من إصلاح المشكلة باستخدام المعلومات التي قدمها DzinX، مع بعض التعديلات.

يبدو أن نشر مربع أزرار الاختيار أولاً "يقفل" المربع على أداة الحجم.إذا حاولت إضافة مربع جديد، فسوف أتلقى رسالة خطأ تفيد بأنني كنت أحاول إضافة الأداة إلى نفس الحجم مرتين.

بمجرد إزالة أزرار الاختيار في البداية وجعل المستخدم ينقر فوق زر للاتصال بطريقة ما، يمكنني ببساطة إضافة قائمة أزرار الاختيار دون مشكلة.

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

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