【问题标题】:tkFileDialog and pyperclip prevent script from exitingtkFileDialog 和 pyperclip 阻止脚本退出
【发布时间】:2018-11-04 20:57:52
【问题描述】:

同时导入 tkFileDialog 和 pyperclip 的脚本不会退出。 (Python2.7) 工作示例,我的脚本按预期退出:

import Tkinter, tkFileDialog
root = Tkinter.Tk()
root.withdraw()
file_path = tkFileDialog.askopenfilename()
root.destroy()

还有:

import pyperclip
print ('whatever')

但以下内容将阻止我的脚本退出(添加raise SystemExit 以强调):

import Tkinter, tkFileDialog
import pyperclip
root = Tkinter.Tk()
root.withdraw()
file_path = tkFileDialog.askopenfilename()
root.destroy()
raise SystemExit

只需导入两个模块即可,必须打开 tkFileDialog 才能创建错误。 当作为脚本调用时,调用 os._exit() 或引发 SystemExit 的任何代码会软锁定解释器或 python 进程。
看来,在打开tkFileDialog 时加载pyperclip 时会出现问题,因为以下片段按预期工作:

import Tkinter, tkFileDialog
root = Tkinter.Tk()
root.withdraw()
file_path = tkFileDialog.askopenfilename()
root.destroy()
import pyperclip
raise SystemExit

不过,无论如何,关键部分之后的每一行代码都会按预期执行,但提升 SystemExit 会创建一个软锁。
这不能用作解决方法,因为 python 不允许卸载模块。

我做错了什么?任何解决方法的想法?

【问题讨论】:

  • 所以当你调用打开文件名对话框时,你是在选择一个文件吗?
  • 是的。退出对话框而不选择文件工作正常
  • 好吧,root.destroy() 将结束 tk 实例,但是您可能需要使用 quit() 来关闭解释器。看看这个帖子:difference between root.destroy() and root.quit()?
  • @mike-SMT 我知道。我遇到的问题是,quit()exit()sys.exit()os._exit,.... 都会产生软锁,当 tkFileDialog 实例打开时加载 pyperclip。无论我做什么,脚本都不会退出。
  • 我在您的示例中看不到import os。如果您还没有这样做,您需要在顶部添加import os

标签: python python-2.7 tkinter exit pyperclip


【解决方案1】:

不是一个真正的解决方案,但我能想到的最好的解决方案: 从 python 2.7 切换到 python 3.7(因此从 Tkinter 8.5 切换到 8.6)对我来说是诀窍。

当然,这还有很多其他的含义,我无法测试。

附带说明 - 因为其他人无法复制该问题: 我有机会在另一台 Windows 10 机器上运行我的 code-sn-p - 它在相同的设置下完美运行。所以问题肯定与底层系统有关,与 pyperclip 或 Tkinter 本身无关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-29
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 2012-04-16
    • 2011-12-13
    相关资源
    最近更新 更多