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

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

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

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

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

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

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


person AllTradesJack    schedule 03.07.2014    source источник


Ответы (7)


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

Попробуйте Pyperclip или буфер обмена

person furas    schedule 03.07.2014
comment
эти два модуля большое спасибо. Знаете ли вы, почему paste() возвращает байтовый объект вместо строки? - person AllTradesJack; 03.07.2014
comment
Я использую Python 2.7 в Linux Mint и получаю строку. Наверное, это зависит от системы. - person furas; 03.07.2014
comment
Интересный. Python 3.4 в Windows 7 предоставляет байтовый объект. Я только что преобразовал его в строку utf-8 - person AllTradesJack; 03.07.2014

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

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

from tkinter import Tk
root = Tk()
root.withdraw()
number = root.clipboard_get()
person fedorch    schedule 12.10.2014

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

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

Вот функция 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 для текста).

person Edward    schedule 31.08.2014

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

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

person Darth Futuza    schedule 30.04.2016

Способ tkinter без окна:

from tkinter import Tk


def clipboard_get():
    r = Tk()
    r.withdraw()
    return r.clipboard_get()
person bruce    schedule 10.09.2019

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

Установить с помощью:

pip install pyperclip

Использование:

import pyperclip

clipboard_content = pyperclip.paste()
person maviz    schedule 08.03.2017
comment
Хороший, но не стандартный модуль - person Artemis; 22.05.2019
comment
@Artemis отредактировал, чтобы решить эту проблему - person maviz; 20.01.2021