Python: копирование из буфера обмена с помощью tkinter без отображения окна

Запуск Python 3.4 в Windows 7.

Мне нужно скопировать то, что хранится в буфере обмена, в переменную в моей программе python. Я видел в Qaru то, что можно сделать либо с pywin32, либо с tkinter. Поскольку tkinter является частью стандартной библиотеки python, я решил, что это было лучше, поскольку пользователю не нужно было устанавливать внешний модуль. Здесь код для получения данных буфера обмена в tkinter:

import tkinter
number = tkinter.Tk().clipboard_get()

Это отлично работает, за исключением того, что пустое окно tkinter появляется каждый раз, когда это выполняется.

1) Почему это происходит? Обычно tkinter ничего не отображает до тех пор, пока tk() не будет запущен mainloop().

2) Есть ли способ избежать появления этого окна? Если нет, я думаю, я просто использую pywin32

Ответ 1

Окно создается tkinter.Tk() (или другими элементами, которые нуждаются в окне), а не tk().mainloop(). Mainloop поддерживает работу программы.

Возможно, попробуйте Pyperclip или clipboard

Ответ 2

Это отлично работает, за исключением того, что пустое окно tkinter появляется каждый раз, когда это выполняется.

Вы можете скрыть это окно:

from tkinter import Tk
root = Tk()
root.withdraw()
number = root.clipboard_get()

Ответ 3

Здесь функция Python, основанная на этот ответ, который заменяет/возвращает текст буфера обмена с помощью Tkinter, встроенный модуль Python, без отображения окна.

def use_clipboard(paste_text=None):
    import tkinter # For Python 2, replace with "import Tkinter as tkinter".
    tk = tkinter.Tk()
    tk.withdraw()
    if type(paste_text) == str: # Set clipboard text.
        tk.clipboard_clear()
        tk.clipboard_append(paste_text)
    try:
        clipboard_text = tk.clipboard_get()
    except tkinter.TclError:
        clipboard_text = ''
    r.update() # Stops a few errors (clipboard text unchanged, command line program unresponsive, window not destroyed).
    tk.destroy()
    return clipboard_text

Небольшим недостатком использования этого метода на основе Tkinter является то, что он использует быстро скрытое окно, которое не является идеальным, но это не должно быть заметно.
Этот ответ использует контент из моего первоначального ответа на вопрос о переполнении стека Как скопировать/получить изображение в буфер обмена с помощью Python (я принимаю Tkinter для текста).

Ответ 4

У меня была та же проблема. Это работало для меня на Windows 7, python 2.7. Теперь я получаю только одно окно.

from Tkinter import *
root = Tk()
cliptext = root.clipboard_get()
lab=Label(root, text = cliptext)
lab.pack()
root.mainloop()

Ответ 5

AnnoyingWindow = Tk()
ClipBoard = AnnoyingWindow.clipboard_get()
AnnoyingWindow.destroy()
print(ClipBoard)

Ответ 6

Вы действительно делаете это без tkinter и гораздо более простым способом:

import pyperclip

clipboard_content = pyperclip.paste()

Ответ 7

Путь tkinter без окна:

from tkinter import Tk


def clipboard_get():
    r = Tk()
    r.withdraw()
    return r.clipboard_get()

Ответ 8

number.withdraw() #this hides the ui for the object

Просто добавьте эту команду в начале, когда вы создаете свой объект TKinter, и он скроет интерфейс. См. этот аналогичный вопрос.