在第一次传递到wx.CallAfter之后,wxPython网格函数突然停止*可调用*
我使用:在第一次传递到wx.CallAfter之后,wxPython网格函数突然停止*可调用*,python,multithreading,wxpython,Python,Multithreading,Wxpython,我使用:将wx.grid导入为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
将wx.grid导入为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
对象?代码没有执行您认为它正在执行的操作wx.CallAfter
基本上是通过具有多个参数来调用的。第一个参数是对函数/方法调用的引用。在应调用后,以下参数是应在第一个参数中传递给函数/方法引用的参数(请参见wx.\u core
):
您已经在post中指向了wx.CallAfter
的完整源代码
相反,您要做的是自己调用方法/函数,并将结果传递给CallAfter
。因此,第一个调用似乎是有效的,因为调用首先发生,而CallAfter
稍后失败(因为它得到的结果是…SetCellValue(…)
)
因此,您应该简单地为这两行编写:
wx.CallAfter(self.grid.SetCellValue, current_line - 1, 1, "SMTH")
在开始下一个问题之前,你是否可以接受其他问题的答案(或不同意答案)。
wx.CallAfter(self.grid.SetCellValue, current_line - 1, 1, "SMTH")