سؤال

سؤالي هو ما إذا كان بإمكاننا تعيين/ربط بعض القيمة بعنصر معين وإخفاء هذه القيمة (أو إذا كان بإمكاننا فعل نفس الشيء بطريقة أخرى).

مثال: دعنا نقول الأعمدة الموجودة على ListCtrl هي "الاسم" و "الوصف":

self.lc = wx.ListCtrl(self, -1, style=wx.LC_REPORT)
self.lc.InsertColumn(0, 'Name')
self.lc.InsertColumn(1, 'Description')

وعندما أضيف عنصرًا أريدهم أن يعرضوا المعلمة الاسم والوصف:

num_items = self.lc.GetItemCount()
        self.lc.InsertStringItem(num_items, "Randomname")
        self.lc.SetStringItem(num_items, 1, "Some description here")

الآن ما أريد القيام به هو تعيين شيء في الأساس لهذا العنصر الذي لا يتم عرضه حتى أتمكن من الوصول لاحقًا إلى التطبيق.

لذلك أود إضافة شيء لا يتم عرضه على التطبيق ولكنه على قيمة العنصر مثل:

hiddendescription = "Somerandomthing"

ما زلت لم تنفجر؟ حسنًا ، دعنا نقول أنني أضيف زرًا لإضافة عنصر مع بعض TextCtrls الأخرى لتعيين المعلمات ومعلمات TextCtrls هي:

"اسم"

"وصف"

"Hiddendescription"

إذن ، يقوم المستخدم بملء هذا TextCtrls وينقر على الزر لإنشاء العنصر ، وأريد بشكل أساسي فقط إظهار الاسم والوصف وإخفاء "Hiddendescription" ولكن لأفعل ذلك حتى أتمكن من استخدامه لاحقًا.

آسف لشرح أكثر من وقت واحد في هذا المنشور ولكني أريد أن أتأكد من فهم ما أتظاهر به.

هل كانت مفيدة؟

المحلول

يتيح لك WXListCtrl ربط البيانات التعسفية بعنصر ، لن يتم عرضه - اقرأ المستندات للطرق التالية:

SetItemData

GetItemData

FindItemData

تحتوي فئة WXListItem أيضًا على طرق GetData و SetData.

نصائح أخرى

بدلاً من استخدام ListCtrl كهيكل بيانات الخاص بك ، يمكنك الاحتفاظ بقائمة/مقرات منفصلة للكائنات التي تحتوي على جميع المعلومات التي تريدها وتحديث ListCtrl من بنية البيانات الأخرى.

فمثلا:

class MyObject(object):
    def __init__(self, name, description, hidden_description):
        self.name = name
        self.description = description
        self.hidden_description = hidden_description

ثم في طلبك:

def __init__(self):
    self.my_items = {}
    self.lc = wx.ListCtrl(self, -1, style=wx.LC_REPORT)
    self.lc.InsertColumn(0, 'Name')
    self.lc.InsertColumn(1, 'Description')

def addItemToMyListCtrl(self, name, description, hidden):
    new_item = MyObject(name, description, hidden)
    self.my_items[name] = new_item
    self.lc.Append((new_item.name, new_item.description))

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

يمكنك دائمًا ضبط عرض العمود المخفي على الصفر ، مما قد ينجز ما تريد. لقد جربته للتو في برنامج C ++ (غير WX) وعمل بشكل جيد.

wx.ListCtrl لا يتيح لك ربط كائن Python بعنصر مثل wx.TreeCtrl لا مع مفيد للغاية SetPyData() الطريقة (والمقابلة GetPyData()).

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

قد يكون من الممكن أيضًا أن ترث مباشرة من wx.listctrl ، وإضافة الأساليب المناسبة ، لكنني لم أر أي محاولات في ذلك في أي مكان ، لذلك قد يكون الأمر أكثر صعوبة مما أفكر فيه.

بالتناوب يمكنك فقط الاستخدام SetItemData() لتخزين int في كل عنصر ، واستخدم هذا int لفهرسة DICT (أو القائمة ، إذا تم طلب العناصر بشكل موثوق ومتسق) التي تحتوي على الكائنات المرتبطة بها. لقد أظهرت Tgray بالفعل كيفية القيام بذلك ، وهي مدرجة في الصفحة التي ارتبطها أعلاه أيضًا ، لذلك لن أتغلب عليه مرة أخرى.

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