Windows上的Python 3.4中的Tkinter在退出时不会将内部剪贴板数据发布到Windows剪贴板

fed*_*rch 8 python windows clipboard tkinter python-3.4

我使用以下代码将我的小脚本的结果放在剪贴板中.

from tkinter import Tk
r = Tk()
r.withdraw()
r.clipboard_clear()
r.clipboard_append("Result")
Run Code Online (Sandbox Code Playgroud)

它在Python 3.3.5及更早版本上运行良好.但是当我升级到Python 3.4时,它会收到空的剪贴板.我尝试了3.4.0,3.4.1和3.4.2并且都收到了一个结果(空剪贴板).如果我阻止脚本立即退出,添加input()之后clipboard_append(),我看到该剪贴板包含正确的"结果".

UPDATE1:

修改后的测试脚本显示问题不是时间问题:

from tkinter import Tk
r = Tk()
r.withdraw()
r.clipboard_clear()
r.clipboard_append("Result")
input()
r.destroy()
Run Code Online (Sandbox Code Playgroud)

如果我运行此脚本,请等待几秒钟,按Enter键,我会收到空​​剪贴板.

如果我运行脚本,切换到任何其他窗口并按Ctrl + V,我会收到"结果",脚本退出后"结果"仍保留在剪贴板中.

我认为在tcl/tk 8.6中clipboard_clear()影响系统剪贴板,但clipboard_append只影响仅通过OS请求转移到系统剪贴板的内部tcl/tk剪贴板.看起来它是在Linux中完成的,没有系统剪贴板.

UPDATE2:

Tk changelog中最后提到的剪贴板是指2004年:

2004-05-03 (bug fix)[939389, 822002, 732662] Correctly post internal 
clipboard data to the Windows clipboard on exit. (hobbs)
Run Code Online (Sandbox Code Playgroud)

似乎在2004年纠正的错误在10年后回到了我们身上.

Ter*_*edy 2

我怀疑“结果”永远不会到达剪贴板,而不是被清除。Windows 上的 3.4 附带 tcl/tk 8.6,而不是 8.5。我怀疑这就是差异,并且可能是时间问题。r.destroy追加之后有用吗?在退出 python 之前显式销毁 tk 根通常是一个好主意。在我们开始这样做之前,我们的测试套件遇到了问题。