【问题标题】:wxPython Phoenix DataViewTreeControl() has "Segmentation fault (core dumped)"wxPython Phoenix DataViewTreeControl() 有“分段错误(核心转储)”
【发布时间】:2015-05-21 22:04:17
【问题描述】:

我是 wxPython 的新手,正在尝试添加一个 DataViewTreeControl。控件显示得很好。但是,当我关联数据时,我得到Segmentation fault (core dumped)。我已经做了足够多的工作,知道每次尝试从GetValue() 方法返回时都会发生这种情况。

我在Data View Model Demo 之后对我的实现进行了模式化,并且我相信它做得正确。

我读过错误地尝试更新对象会导致这种错误(here),但我不相信我会这样做。我尝试过使用wx.CallAfter()wx.CallLater(),但没有运气。

该应用程序确实有一个当前工作的工具栏和网格,所以我知道整个事情没有损坏。

如果我在上面的演示中保留实现,则在尝试 return mapper[col](相当于演示中的第 180 行)时会发生分段错误,在这种情况下,mapper[col] 的类型是 'unicode'

如果我将值转换为字符串(这是我的列数据类型设置的),那么在下面第 16 行发生段错误之前我会走得更远(我不确定这是否重要,但在这里它是):

    > /usr/lib/python2.7/encodings/utf_8.py(16)decode()
     15 def decode(input, errors='strict'):
---> 16     return codecs.utf_8_decode(input, errors, True)

我正在寻找有关这可能是线程问题还是我的数据模型实现错误的方向。

正如我所说,这在我尝试将模型与控件相关联之前有效。这是一个最小的非工作示例(self,在本例中是 wx.Frame):

def get_metadata(self):
    mdDict = dict()

    a1 = coremetadata.mdCoreAttribute(0, 'att1', 'cat1', 1, 'core1')
    a2 = coremetadata.mdCoreAttribute(1, 'att2', 'cat1', 2, 'core1')
    a3 = coremetadata.mdCoreAttribute(2, 'att3', 'cat3', 3, 'core1')

    c1 = coremetadata.mdCore('core1')
    c1.atts.append(a1)
    c1.atts.append(a2)
    c1.atts.append(a3)
    mdDict['core1'] = c1

    return coremetadata.CoreMetaData(mdDict.values())

def createDVTC(self):
    self.dvtc = dv.DataViewTreeCtrl(self.grid, wx.ID_ANY, size=(300,300))

    mdata = self.get_metadata()
    # tell the object to use our data
    self.dvtc.AssociateModel(mdata)

    return self.dvtc

def create_mdPane(self):

    self.dvtc = self.createDVTC()

    self._mgr.AddPane(self.dvtc, aui.AuiPaneInfo().
                      Name("MDNotebook").Caption("Metadata Display").
                      Right().Layer(1).Position(1).MinimizeButton(True))

感谢您的帮助!

【问题讨论】:

  • 当我为不存在的列设置数据时,我的 ListView 以这种方式崩溃。
  • @PetrBlahos 是否需要定义列才能使用AssociateModel()?即使我已经定义了列(我确信它们存在)并且仍然存在问题。
  • 看,我不知道。我刚才提到了发生在我身上的事情,可能和你的情况有关。

标签: python wxpython


【解决方案1】:

这不是线程问题。这是我对模型的实现。为了在GetParent()GetChildren() 函数中返回适当的数据类型(使用ObjectToItem()),必须小心谨慎。

具体来说,我没有在GetParent() 函数中使用ObjectToItem()...

一些非常基本的东西,但是当唯一的反馈是分段错误时,它不是很容易找到。

【讨论】:

    猜你喜欢
    • 2015-06-25
    • 2021-06-03
    相关资源
    最近更新 更多