8

I use the following code to place result of my small scripts in clipboard.

from tkinter import Tk
r = Tk()
r.withdraw()
r.clipboard_clear()
r.clipboard_append("Result")

It works fine on Python version 3.3.5 and earlier. But when I upgrade to Python 3.4 it was receive empty clipboard. I tried the 3.4.0, 3.4.1 and 3.4.2 and all received one result (empty clipboard). If I prevent the script from the immediate exit, adding input() after clipboard_append(), I see that clipboard contains the correct "Result".

Update1:

The modified test script shows that the problem is not a timing issue:

from tkinter import Tk
r = Tk()
r.withdraw()
r.clipboard_clear()
r.clipboard_append("Result")
input()
r.destroy()

If I run this script, wait a few seconds, press Enter, I receive empty clipboard.

If I run script, switch to any other window and press Ctrl+V, I receive "Result" and "Result" remains in clipboard after script exits.

I think in tcl/tk 8.6 clipboard_clear() affect system clipboard, but clipboard_append affect only internal tcl/tk clipboard that transfered to system clipboard only by OS request. Looks like it was done in Linux, that don't have system clipboard.

Update2:

Last mention clipboard in Tk changelog refers to the 2004:

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

It seems that the error corrected in 2004 returned to us 10 years later.

fedorch
  • 441
  • 4
  • 9

2 Answers2

2

I suspect that 'Result' never gets to the clipboard, rather than being cleared. 3.4 on Windows come with tcl/tk 8.6 instead of 8.5. I suspect that this is the difference, and it is possibly a timing issue. Does r.destroy after the append work? Explicitly destroying the tk root before exiting python is generally a good idea. We had problems with the test suite until we started doing this.

Terry Jan Reedy
  • 18,414
  • 3
  • 40
  • 52
0

Add some delay is useful in my PC(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()
bruce
  • 462
  • 6
  • 9