【问题标题】:Cannot catch Tcl exception无法捕获 Tcl 异常
【发布时间】:2021-09-17 05:54:45
【问题描述】:

Tcl_AsyncDelete 困扰我很久了。由于在我删除特定线程之前它不会产生任何问题,因此我决定忽略它。我尝试了以下方法,

try:
    top.destroy()
except:
    pass

这里的顶部是 Tkinter 主窗口,当我尝试销毁它时会弹出错误。但是上面的代码不起作用,我该怎么办?

【问题讨论】:

  • 您可能还希望包含错误消息的准确文本。
  • edit您的问题包含一个小的minimal reproducible example
  • 如果我没记错的话,Tcl_AsyncDelete 通常不应该出现。我猜你在另一个线程中使用了tkinter。这并不像tcltkinter 使用的库)那样恐慌并死掉。请勿在您创建 tk.Tk() 的线程以外的线程中使用 tkinter

标签: python tkinter tcl


【解决方案1】:

如果问题是进程刚刚结束,那么问题很有可能是您在滥用线程。非常特别是,Tkinter 对象不得从创建它们的线程以外的任何线程访问。 (他们在内部使用大量线程特定的数据来避免大量锁定,但这会施加 strict 线程绑定规则。这包括在内存管理引擎中,这是 非常 em> 在幕后忙碌,你真的无法欺骗让你做你想做的事。)

如果您觉得非常勇敢,您可以一次在两个单独的线程中运行完整的 Tkinter GUI,前提是您完成了所有工作,包括初始窗口创建、主循环等等。但是你很擅长“除非你是专家,否则不要这样做”领域,专家会倾向于告诉你“不要这样做”。

【讨论】:

  • 在某些平台上,可以让一个线程在另一个线程运行的小部件中运行小部件,但这是极端的魔法,很难想象这些天会有许多实际应用。 (它曾经用于在 Web 浏览器中运行 Tk GUI……)另外,我不知道 Tkinter 是否公开了支持它所需的晦涩的 API 位;我完全不会责怪他们把这些排除在外!
猜你喜欢
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
  • 2021-10-03
  • 2018-02-04
  • 2018-02-04
  • 2011-04-19
相关资源
最近更新 更多