在第一次传递给wx.CallAfter之后,wxPython网格函数突然停止*可调用*

时间:2014-07-09 10:09:33

标签: python multithreading wxpython

我使用:import wx.grid as gridlib然后我在继承wx.Panel的类中执行此操作:

self.grid = gridlib.Grid(self)
self.grid.CreateGrid(10000, 17)

它会创建一个大网格。现在,当我在另一个线程调用的函数中执行此操作时:

current_line  = 1
wx.CallAfter(self.grid.SetCellValue(current_line - 1, 1, "SMTH"))
current_line += 1
wx.CallAfter(self.grid.SetCellValue(current_line - 1, 1, "SMTH"))

在第二个wx.CallAfter我得到:

  

断言可调用(callableObj)," callableObj不可调用"   AssertionError:callableObj不可调用

那么这意味着对象失去了它的方法?我的意思是python中的函数是对象,所以SetCellValue对象以某种方式被删除了吗?

1 个答案:

答案 0 :(得分:1)

代码没有做你认为它正在做的事情。 wx.CallAfter基本上是通过多个参数来调用的。第一个参数是函数/方法CallAfter应该调用的引用,以下参数是应该传递给第一个参数中的函数/方法引用的参数(参见{ {1}}):

wx._core

您已经指出this帖子中def CallAfter(callableObj, *args, **kw): 的完整来源。

您正在做的是自己调用方法/函数并将结果传递给wx.CallAfter。因此,第一个调用似乎有效,因为调用首先发生,CallAfter稍后失败(因为它得到CallAfter的结果而不是引用。

所以你应该简单地写两行:

….SetCellValue(…)