pyjamas
pyjamas

Reputation: 5357

Tkinter copy to clipboard not working in PyCharm

I just installed PyCharm and opened up a script I had been using in IDLE that did some string manipulation then copied it to the clipboard, but it doesn't work when I run it in PyCharm.

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

When I run this in IDLE I am able to paste "test" after, but in PyCharm it just says "Process finished with exit code 0" but there is nothing in the clipboard (even if there was before running). I have Python 3.5 as the selected interpreter.

Upvotes: 2

Views: 977

Answers (1)

Noctis Skytower
Noctis Skytower

Reputation: 21991

There seems to be problem if the clipboard is manipulated and the program closes too quickly soon after. The following program worked for me but was unreliable when the call to root.after only used one millisecond for the delay. Other possibilities were tried, but code down below should work:

import random
import string
import tkinter


def main():
    root = tkinter.Tk()
    root.after_idle(run_code, root)
    root.after(100, root.destroy)
    root.mainloop()


def run_code(root):
    root.withdraw()
    root.clipboard_clear()
    root.clipboard_append(''.join(random.sample(string.ascii_letters, 10)))
    print('Clipboard is ready.')


if __name__ == '__main__':
    main()

The following is a mildly more useful version of the program and demonstrates that you can make many calls to root.after_idle to run your code in a sequential manner. Its design is primarily for use to process command-line arguments and send them to your clipboard for you:

import sys
import tkinter


def main(argv):
    root = tkinter.Tk()
    root.after_idle(root.withdraw)
    root.after_idle(root.clipboard_clear)
    root.after_idle(root.clipboard_append, ' '.join(argv[1:]))
    root.after_idle(print, 'The clipboard is ready.')
    root.after(100, root.destroy)
    root.mainloop()
    return 0


if __name__ == '__main__':
    sys.exit(main(sys.argv))

Upvotes: 2

Related Questions