访问 TKinter 脚本中的主线程?

2024-01-13

我想明白为什么我收到以下错误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 而不会锁定它或导致上述错误?


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

这就是本质:

Hi,

afaik after() / after_idle() 调用不是线程安全的!

在我对 Andreas 提供的代码的研究中,我发现了 event_generate() 方法是调用 tk 的唯一线程安全方法 线程而不让它轮询某些东西。 (正如 Guido 和 在其他页面上看到其他人似乎都在投票......为什么?)

brgds,

-- Jan

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

访问 TKinter 脚本中的主线程? 的相关文章

随机推荐

  • boost 转换适配器中可能存在错误

    我发现以下代码的调试和发布版本之间存在错误 include
  • Highcharts:将图表旋转 90 度并重新绘制它

    我正在尝试创建一个按钮 允许我将图表从纵向转换为横向 所以我所做的就是在单击按钮时向图表添加一个类 transform translate 50 50 rotate 90deg 确实如此 但图表是这样的旋转90度 但图表没有重绘 拉伸全屏
  • 获取 DisplayMetrics 的正确方法: getResources() 或 getWindowManager()

    获取 DisplayMetrics 的正确方法是什么 即获取屏幕 显示信息 例如density or xdpi 我问这个问题是因为我见过两种方法 FIRST DisplayMetrics metrics new DisplayMetrics
  • 将内容置于绝对定位的 div 中

    我有一个绝对定位的元素 里面有内容 它可以是一个 h1 或几个 p 标签 所以我不知道内容的高度 我怎么能够内容垂直居中绝对定位内div HTML p div div class centerd h1 helo h1 span hi aga
  • 如何从c中的sock结构中获取ip地址?

    我正在编写简单的服务器 客户端 并尝试获取客户端 IP 地址并将其保存在服务器端 以决定哪个客户端应该进入关键部分 我用谷歌搜索了好几次 但找不到从袜子结构中获取IP地址的正确方法 我相信这是服务器接受客户端请求后从 sock 结构获取 I
  • Python“除了”失败

    我想知道你是否可以重新引发一个 特定的 捕获的异常 并让它被稍后的 一般的 捕获 除了在同一个 try except 中 例如 我想对特定的 IOError 执行某些操作 但如果它不是预期的 IOError 则应像处理任何其他错误一样处理该
  • Python 中的图像抓取程序未按预期运行

    我的代码只返回一个空字符串 我不知道为什么 import urllib2 def getImage url page urllib2 urlopen url page page read Gives HTML to parse start
  • Z_DATA_ERROR,ERRNO -3,zlib:数据检查不正确,MBA M1

    最近 我在 MacBook Air M1 机器上使用最新的 Node 和 NPM 安装依赖项时遇到了问题 然后我发现M1不支持最新的Node版本 所以我的解决方案是使用 NVM 并将其更改为 Node v14 16 一切都运行良好 但是当我
  • Angular 2:“...”的路由生成器未包含在传递的参数中

    所以我的 AuthenticationService 中有以下代码 检查登录凭据后 用户将被重定向到他们的个人资料 authentication service ts redirectUser username string void Re
  • 适用于 Android 的 Tensorflow 量化图

    我正在尝试将量化图表加载到 Android 应用程序中 我的构建文件包含 deps tensorflow core android tensorflow lib tensorflow contrib quantization cc arra
  • 多个描述元标记有效吗?

    用不同的语言定义多个元描述是否有效 这是有效的吗 有效 是的 搜索引擎正确处理 目前看来并非如此 大多数 SEO 验证者都会抱怨多个描述 即使它们被标记为不同的语言代码 并且如前所述 在某些情况下会被视为垃圾邮件进行处罚 没有理由不让一个页
  • 消费者不使用 Riverpod 重建 UI

    我正在尝试使用 Riverpod 制作简单的 stateNotifier 当我单击按钮时 它将在值之间切换 我检查了该值 按下按钮时它会发生变化 问题是 UI 没有自行重建 我已经检查了文档并且非常确定我做得正确 主屏幕 class Hom
  • 如何在生成下载文件时显示加载动画?

    我有一个 Web 应用程序 用户可以在其中生成 PDF 和 PowerPoint 文件 这些文件可能需要一些时间才能生成 因此我希望能够在生成时显示加载动画 这里的问题是我无法知道下载何时开始 动画永远不会消失 我知道可以 在侧面 生成文件
  • 通过本机 Java API 验证 Windows 用户凭据

    我需要存储 Windows 用户名和凭据 以便稍后运行一些需要这些凭据的进程 当我收集这些作为用户的输入时 我想验证凭据是否正确 Java 中是否有原生 api 可以帮助我验证 Windows 系统凭据 我正在经历LoginContext类
  • 第一个 li 的 JQuery 选择器

    当用户单击第一个 li 又名 任何日期 时 我需要一个 onclick 事件 如何使用 jQuery 选择该元素 ul class ui menu ui widget ui widget content li class ui menu i
  • 为什么 Swift 会隐式解包可选的“nil”?

    self presentTextInputControllerWithSuggestions nil allowedInputMode WKTextInputMode Plain results AnyObject gt Void in r
  • 出生日期限制

    我想将日期选择器对话框限制为至少选择 18 岁 val c Calendar getInstance val year c get Calendar YEAR val month c get Calendar MONTH val day c
  • 如何实现基于行的文件内容的并行处理

    我正在编写一个 POC 来处理一个非常大的文本文件 约 10 亿行以上 并正在为此尝试使用 Go package main import bufio fmt log os time func main start time Now file
  • 相互递归类

    如何在 C 中实现相互递归类 就像是 Recursion h ifndef RECURSION H define RECURSION H class Class1 Class2 Class2 ptr public void Class1 m
  • 访问 TKinter 脚本中的主线程?

    我想明白为什么我收到以下错误TclStackFree incorrect freePtr Call out of sequence 但我不知道如何解决这个问题 我的脚本摘要 My Python TKinter脚本由三个活动线程组成 主线程和