listctrl не се попълва правилно

Така че успях да получа списъка с елементи в даден ред, за да попълня базата данни правилно. при преобразуване на елементите за попълване на приспособлението listctrl, което показва елементите, включени в поръчка....... Получавам това: въведете описание на изображението тук

левият прозорец показва какво се случва, когато добавите първия елемент... десният прозорец е мястото, където се крие моят проблем. по същество презаписва текста на първия елемент и вместо това добавя празна колона... цената обаче се добавя правилно и всички елементи се добавят правилно в sql базата данни... така че проблемът ми е в това как попълвам моя списък

кодът, показан по-долу, е функцията, която попълва списъка ctrl, показан по-рано... Изглежда не мога да разбера къде сбърках... някакви идеи?

код за рестартиране на списъка

    def refresh_list2(self, event):
          """Place the names of each ItemEntry into the list"""

        index = 0
        self.entrydict = {}
        self.list2.DeleteAllItems()
        for entry in self.ordite.list_entries():
                if entry.Order_ID == self.entry.Order_ID:
                   self.list2.InsertStringItem(index,self.entry.Order_ID)
                   self.list2.SetStringItem(index,1,self.entryit.Item_ID)
                   self.list2.SetStringItem(index,2,str(self.entryit.Item_Price))
                   self.list2.SetStringItem(index,3,str(self.entryit.Item_Qty))
                   self.entrydict[index] = entry
                   index += 1

код за вмъкване на елементите в базата данни

    def add_item(self, event):
        """Add a new entry to the Order_Date ite"""
        # start out with blank, generic Entry
        self.entryit = oi.OrderItemEntry(self.entry.Order_ID,"","","0")
        self.endiag = AddItemOrder(self,self.entryit)
        self.endiag.ShowModal()           


        self.ordite.add_entry(self.entry.Order_ID,
                            str(self.entryit.Item_ID),
                            str(self.entryit.Item_Price),
                            str(self.entryit.Item_Qty) )

        self.refresh_list2(None)
        self.addPrice(None)

все още обмислям да направя функция в бекенда, която съхранява филтриран списък на обектите на артикулите въз основа на дадения order_ID


person Sean Perez    schedule 23.05.2013    source източник
comment
Показаният код не изглежда така, сякаш може да доведе до резултатите в показания GUI. Вашият for цикъл не използва вход за попълване на listctrl, всеки път, когато се завърти за всеки елемент във входа, той използва същите променливи self.entry и self.entryit.   -  person Yoriz    schedule 23.05.2013
comment
добре... промених го, така че всички се позовават на enterit, който е обектът, който съхранява подробностите за елементите.... същото нещо се случва...   -  person Sean Perez    schedule 23.05.2013
comment
@ Ая... нищо добро нищо не се е променило.....   -  person Sean Perez    schedule 23.05.2013


Отговори (1)


О, радостите на wx.ListCtrl. ;-)

Прекарах много час в битка с тях, преди да напиша обвиващ клас около него, за да го направя значително по-малко болезнено.

Има няколко проблема с вашия refresh_list2() код...

Първо, методът InsertStringItem() винаги ще вмъква елемента преди посочения index, така че ако искате да добавите към списъка, трябва да зададете index на всяка стойност, по-голяма или равна на брой елементи в момента в списъка - sys.maxint работи доста добре.

Второ, InsertStringItem() ще върне индекса, на който е вмъкнал елемента, така че ще трябва да използвате тази стойност при всички следващи извиквания на SetStringItem().

Опитайте нещо подобно...

def refresh_list2(self, event):
      """Place the names of each ItemEntry into the list"""

    self.entrydict = {}
    self.list2.DeleteAllItems()

    for entry in self.ordite.list_entries():
        if entry.Order_ID == self.entry.Order_ID:
           index = self.list2.InsertStringItem(sys.maxint, self.entry.Order_ID)
           self.list2.SetStringItem(index, 1, self.entryit.Item_ID)
           self.list2.SetStringItem(index, 2, str(self.entryit.Item_Price))
           self.list2.SetStringItem(index, 3, str(self.entryit.Item_Qty))
           self.entrydict[index] = entry

... което трябва да постигне желания резултат, но по-късно може да имате проблеми с self.entrydict, ако впоследствие изтриете елемент от списъка, тъй като стойностите на индекса може да се променят.


Актуализация

Не съм сигурен какво правите, но следният самостоятелен пример работи за мен...

import sys
import wx

data = (('O0012', '1001', '235.0', '1'),
        ('O0012', '1002', '600.0', '2'))

app = wx.App(redirect=False)
frame = wx.Frame(None)
lc = wx.ListCtrl(frame, style=wx.LC_REPORT)
lc.InsertColumn(0, 'Order ID')
lc.InsertColumn(1, 'Item ID')
lc.InsertColumn(2, 'Item Price')
lc.InsertColumn(3, 'Item Qty')
for a, b, c, d in data:
    index = lc.InsertStringItem(sys.maxint, a)
    lc.SetStringItem(index, 1, b)
    lc.SetStringItem(index, 2, c)
    lc.SetStringItem(index, 3, d)

frame.Show()
app.MainLoop()

Актуализация #2

ах Мисля, че искахте да вмъкнете елементите от локалната променлива entry, а не атрибутите на екземпляра...

def refresh_list2(self, event):
      """Place the names of each ItemEntry into the list"""

    self.entrydict = {}
    self.list2.DeleteAllItems()

    for entry in self.ordite.list_entries():
        if entry.Order_ID == self.entry.Order_ID:
           index = self.list2.InsertStringItem(sys.maxint, entry.Order_ID)
           self.list2.SetStringItem(index, 1, entry.Item_ID)
           self.list2.SetStringItem(index, 2, str(entry.Item_Price))
           self.list2.SetStringItem(index, 3, str(entry.Item_Qty))
           self.entrydict[index] = entry
person Aya    schedule 23.05.2013
comment
@ Aya... някакъв начин да изчистя речника на enterdict, в случай че трябва да изтрия елемент? - person Sean Perez; 23.05.2013
comment
@SeanPerez Най-доброто решение за този проблем ще зависи от това за какво използвате entrydict. Ще помогне да включите всички части от кода, които имат достъп до него - в момента всичко, което виждам, е, че го създавате, но никога не го използвате. - person Aya; 23.05.2013
comment
@SeanPerez Вижте актуализиран отговор и ако имате някакви коментари, можете ли да ги поставите върху този отговор, а не върху въпроса, в противен случай не получавам известия. - person Aya; 23.05.2013
comment
всъщност е част от по-голямо приложение, работещо с sql. данните, които вмъквам, са по същество данните от задната част на sql. Знам, че това е свързано с това как моят списък за опресняване вмъква елементи, като се има предвид, че по същество презаписва първия запис в списъка и пише празни места за останалите. но споменатите данни са правилно вмъкнати в задната част на SQL... Наистина предпочитам да не публикувам целия си код, като се има предвид, че е локализирано нещо с моята функция refresh_list2... странно, че работи правилно, когато се прилага в другите ми модули и Не мога да разбера защо - person Sean Perez; 23.05.2013
comment
Почти винаги използвам ObjectListView вместо ListCtrl само защото интерфейсът му е много по-добър и мисля, че е по-лесен за използване с база данни. - person Mike Driscoll; 23.05.2013
comment
Все още го намирам за доста странно......... Не знам защо. Всъщност използвам същата функция по отношение на кода за добавяне на поръчки към главен списък и тя работи перфектно. не знам защо, за бога, излезе от строя, когато го използвам тук - person Sean Perez; 23.05.2013
comment
Проверихте ли вече какъв запис всъщност задава стойностите на графичния интерфейс, като ги отпечатате, кодът на графичния интерфейс може да е наред и това, което сте задали, е неправилно. - person Yoriz; 24.05.2013