我想明白为什么我收到以下错误TclStackFree: incorrect freePtr. Call out of sequence?
但我不知道如何解决这个问题。
我的脚本摘要
My Python
, TKinter
脚本由三个活动线程组成。主线程和两个子线程。其中一个子线程负责侦听 UDP 消息,另一个子线程负责绘制数据图(使用Matplotlib
据我最好的理解,问题是我试图同时从两个子线程访问 gui。例如,我可能正在接收 UDP 消息并尝试在 GUI 上显示它们,同时尝试绘制先前接收到的数据的图表。由于我接收 UDP 数据包的速率(每秒最多 10,000 个),这种情况并不罕见。
Code
这两个子线程是使用 -
thread.start_new_thread(self.function, ())
UDP监听线程
def Listen(self):
if self.udpClient.IsConnected():
while True:
#Listen for messages
data = self.udpClient.listen(1024)
#Add the data to the gui
self.AddNewData(data)
if self.disconnectFlag:
break
def AddNewData(self, data):
self.listbox.insert(END, data)
receivedData.append(data)
图线程
def UpdateGraph(self):
while True:
if readyToGraph:
self.plot.clear()
self.plot.hexbin(data[0], data[1], bins = "log", extent = self.extent)
self.canvas.draw()
EDIT:
if __name__ == "__main__":
root = TK()
gui = MainWindow(root, "Receiver")
root.mainloop()
就像我说的,我认为问题在于有时侦听器线程尝试将数据添加到列表框,同时图形线程尝试更新图形。
我努力了...
Using root.after_idle(...)
在尝试修改 GUI 之前,但这只会锁定主线程。例子:self.listbox.insert(END, data)
-> root.after_idle(self.listbox.insert, END, data)
(我也打电话root.after_idle
before self.plot.clear()
, self.plot.hexbin(...)
, and self.canvas.draq()
)
我也研究过threading.condition
and queue.queue
按照建议here https://mail.python.org/pipermail/tkinter-discuss/2011-February/002776.html但我找不到太多关于这两者的信息。 (所以我还没有真正尝试过这两种解决方案)
Question
如何从子线程访问 gui 而不会锁定它或导致上述错误?