Windows 上 Python 3.4 中的 Tkinter 不会在退出时将内部剪贴板数据发布到 Windows 剪贴板
Posted
技术标签:
【中文标题】Windows 上 Python 3.4 中的 Tkinter 不会在退出时将内部剪贴板数据发布到 Windows 剪贴板【英文标题】:Tkinter in Python 3.4 on Windows don't post internal clipboard data to the Windows clipboard on exit 【发布时间】:2014-12-06 22:00:06 【问题描述】:我使用以下代码将我的小脚本的结果放在剪贴板中。
from tkinter import Tk
r = Tk()
r.withdraw()
r.clipboard_clear()
r.clipboard_append("Result")
它在 Python 3.3.5 及更早版本上运行良好。但是当我升级到 Python 3.4 时,它收到了空剪贴板。我尝试了 3.4.0、3.4.1 和 3.4.2 并且都收到了一个结果(空剪贴板)。如果我阻止脚本立即退出,在clipboard_append()
之后添加input()
,我会看到剪贴板包含正确的“结果”。
更新1:
修改后的测试脚本显示问题不是时序问题:
from tkinter import Tk
r = Tk()
r.withdraw()
r.clipboard_clear()
r.clipboard_append("Result")
input()
r.destroy()
如果我运行此脚本,请等待几秒钟,然后按 Enter,我会收到空剪贴板。
如果我运行脚本,切换到任何其他窗口并按 Ctrl+V,我会收到“结果”并且脚本退出后“结果”仍保留在剪贴板中。
我认为在 tcl/tk 8.6 clipboard_clear()
影响系统剪贴板,但 clipboard_append
仅影响仅由操作系统请求传输到系统剪贴板的内部 tcl/tk 剪贴板。看起来它是在没有系统剪贴板的 Linux 中完成的。
更新2:
Tk changelog 中最后提到的剪贴板指的是 2004:
2004-05-03 (bug fix)[939389, 822002, 732662] Correctly post internal
clipboard data to the Windows clipboard on exit. (hobbs)
2004 年纠正的错误似乎在 10 年后又回到了我们身边。
【问题讨论】:
我也遇到了同样的问题,希望你发布一个错误报告... (bugs.python.org) 【参考方案1】:添加一些延迟在我的电脑(win10,python3.7)中很有用:
from tkinter import Tk
import time
r = Tk()
r.withdraw()
r.clipboard_clear()
r.clipboard_append('some string')
r.update()
time.sleep(.2)
r.update()
r.destroy()
【讨论】:
【参考方案2】:我怀疑“结果”永远不会进入剪贴板,而不是被清除。 Windows 上的 3.4 带有 tcl/tk 8.6 而不是 8.5。我怀疑这是差异,并且可能是时间问题。追加后的r.destroy
是否有效?在退出 python 之前显式销毁 tk 根通常是一个好主意。在我们开始这样做之前,我们的测试套件一直存在问题。
【讨论】:
修改后的测试脚本显示问题不是时序问题: 我写的太多,无法评论。我通过添加新的结果和想法更新了我的问题。 我刚刚在 Win7 上用 3.4.2 尝试了你原来的 5 行,它可以工作。我没有其他想法为什么不适合你。以上是关于Windows 上 Python 3.4 中的 Tkinter 不会在退出时将内部剪贴板数据发布到 Windows 剪贴板的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 上使用带有 Python 3.4 的 ImageScanner 模块
如何在 Windows 上使用 python 3.4 在 ptqt5 中获取 QtWebEngineView?
Windows 上的 pyodbc 和 python 3.4
Python 3.4 Docker 容器中的 AWS Elastic Beanstalk container_commands