listctrl没有正确填充

时间:2013-05-23 11:02:24

标签: python wxpython

因此,我设法获取给定顺序中的项目列表,以正确填充数据库。转换项目以填充listctrl小部件,显示订单中包含的项目.......我得到这个: enter image description here

左侧窗口显示添加第1项时会发生什么....右侧窗口是我的问题所在。它基本上覆盖了第一个项目的文本并添加了一个空白列....但是价格正确加起来并且所有项目都正确地添加到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存储项目对象的过滤列表

1 个答案:

答案 0 :(得分: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