【发布时间】:2017-09-26 15:57:24
【问题描述】:
我的 Python 应用程序在 Windows 和 OS X/macOS 上成功运行......但是,在 Ubuntu 上,我收到了 Tcl_AsyncDelete 错误!
我知道 Tk 在 Python 中的线程是如何工作的,并且 Tk 只能从主线程访问,但是当我的逻辑线程尝试使用 urllib.urlopen 打开 URL 时,错误出现并且 Python 出现恐慌。一旦我删除了urlopen 调用来测试它,程序就不会崩溃。发生在 Python 2 和 Python 3 上。
这是我的项目的代码:
我尽我所能,将日志记录级别设置为 DEBUG(在我的代码中),使用 pdb 调试应用程序......没有有用的信息。
这不是 Tk 从单独的线程访问或在线程内运行的问题 - Tk 在主线程内运行,与逻辑线程的所有通信都通过共享队列发生。 .
或者也许我错过了什么?提前致谢!
【问题讨论】:
-
This trivial search query 找到了关于 SO 的先前问题(和答案)以及其他资源上关于此问题的许多其他讨论。您在发帖前是否至少进行了最低限度的研究?
-
@kostix 嗯,是的,我确实做了我的研究......这就是我说 Tk 应该只从主线程调用的原因!我说过,据我所知,不会发生从线程调用 Tk 的情况,唯一运行线程的是“逻辑线程”,将数据写入共享队列,GUI 主循环从主线程中读取该队列。 ..
-
@algrithmic 无论你用 urllib 做什么,它都会将一些 GUI 活动推到不同的线程上。 Tk 在其内部大量使用线程局部状态(以避免拥有可怕的大全局锁),因此您需要正确处理线程。使用
threading.current_thread()来诊断您在意外线程上的位置…… -
@DonalFellows 非常感谢!我确实检查了
threading.current_thread().name,问题是get_IP_data()运行在Thread-1而不是MainThread,因为该函数是从Thread-1内部调用的,即使它驻留在线程本身之外(就像Python 工作)... 解决方案是在MainThread中简单地调用get_IP_data()。不过,让我感到困惑的是,为什么urllib会干扰Ttkinter?但除此之外,问题解决了。如果可以的话,我会投票!
标签: python python-2.7 tcl tk python-multithreading