gpt4 book ai didi

python - 访问TKinter脚本中的主线程?

转载 作者:行者123 更新时间:2023-12-03 13:12:49 24 4
gpt4 key购买 nike

我想理解为什么我会收到以下错误TclStackFree: incorrect freePtr. Call out of sequence?,但是我不确定如何解决此问题。

我的脚本摘要

我的PythonTKinter脚本由三个 Activity 线程组成。主线程和两个子线程。子线程中的一个负责监听UDP消息,另一个子线程负责绘制接收到的数据(使用Matplotlib)。据我所知,问题是我试图从两个子线程访问gui。同时。例如,我可能正在接收UDP消息并试图在gui上显示它们,同时尝试绘制先前接收到的数据的图形。由于我接收UDP数据包的速率(每秒高达10,000个),这种情况并不少见。

代码

使用-产生两个子线程

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()

就像我说的那样,我认为问题在于,有时监听器线程试图在图线程尝试更新图的同时将数据添加到列表框中。

我试过了...

在尝试修改GUI之前使用 root.after_idle(...),但这只会锁定主线程。示例: self.listbox.insert(END, data)-> root.after_idle(self.listbox.insert, END, data)(在 root.after_idleself.plot.clear()self.plot.hexbin(...)之前,我也称为 self.canvas.draq())

我也按照建议的 here的方式研究了 threading.conditionqueue.queue,但是我找不到关于这两者的太多信息。 (所以我还没有真正尝试过任何一种解决方案)

问题

如何从子线程访问gui而不将其锁定或引起上述错误?

最佳答案

这是tkinter-discuss邮件列表上讨论的内容的链接:
https://mail.python.org/pipermail/tkinter-discuss/2013-November/thread.html

这是本质:

Hi,

afaik the after() / after_idle() calls are not thread safe!

On my research leading to the code Andreas provide I found the event_generate() method the only threadsafe way to invoke the tk thread without letting it poll something. (As mentioned by Guido and seen on other pages everyone else seems to poll... why?)

brgds,

-- Jan

关于python - 访问TKinter脚本中的主线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20104408/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com