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?

如何从Python 3.4 升级到 Python 3.5

Windows 上的 pyodbc 和 python 3.4

如何为 Python 3.4 版本安装 PyQt5?

Python 3.4 Docker 容器中的 AWS Elastic Beanstalk container_commands