Tkinter вставить изображение в текстовое поле из буфера обмена - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь вставить изображение из буфера обмена и вставить его в текстовое поле / ярлык в tkinter. Мой код ниже.

# page4 buttons and functions

f7 = Frame(page4)
f7.grid(row=0, column=0, sticky='NESW')

f8 = Frame(page4)
f8.grid(row=0, column=0, columnspan=2, sticky='NESW')

tb8 = Label(f7, width=82)
tb8.grid(row=0, column=0, sticky='NESW')

tb9 = Text(f7, width=30)
tb9.grid(row=0, column=1, sticky='NESW')


 def imgps():
   try:
    image = root.selection_get(selection='CLIPBOARD')
    img = ImageTk.PhotoImage(Image.open(image))
    tb8.config(page4, image=img)
    tb8.clipboard_clear()
  except:
    messagebox.showinfo(message="Clipboard is Empty.")

 pbtn11 = Button(f8, text="IMAGE", activebackground="lavender",
            activeforeground="RoyalBlue", bd="5", bg="aquamarine2",
            command=imgps, fg="purple", font=('arial', 10, 'bold'))
 pbtn11.grid(row=0, column=0, sticky='NESW')

Ничего не появляется в предполагаемой области, и ни одна ошибка не отображается. Но откуда я закрываю приложение. Окно сообщений появляется. Похоже, странное кодирование. Может кто-нибудь помочь.

1 Ответ

0 голосов
/ 27 июня 2018

Вот простой пример добавления изображения на этикетку.

Помните, что вам необходимо убедиться, что ссылка на изображение сохранена, иначе вы не увидите изображение в своем приложении.

Обновление:

Я считаю, что этот обновленный ответ должен работать для вас. Код попытается извлечь изображение из буфера обмена, используя метод ImageGrab в PIL, если он есть, и затем сохранит изображение во временную папку. Затем мы загружаем это изображение в метку и затем удаляем изображение из временной папки.

import tkinter as tk
import os
from tkinter import messagebox
from PIL import ImageTk, ImageGrab

root = tk.Tk()
tb8 = tk.Label(root, width=82)
tb8.grid(row=0, column=0, sticky='nsew')

def imgps():
    try:
        temp_path = "./TempImage/some_image.gif" # Whatever temp path you want here
        im = ImageGrab.grabclipboard() # Get image from clipboard
        im.save(temp_path) # save image to temp folder
        load_for_label = ImageTk.PhotoImage(file=temp_path) # load image from temp folder
        tb8.config(image=load_for_label) # set image to label
        tb8.image = load_for_label # save reference to image in memory
        tb8.clipboard_clear() # clear clipboard
        os.remove(temp_path) # delete temp file
    except:
        messagebox.showinfo(message="Clipboard is Empty.")

pbtn11 = tk.Button(root, text="IMAGE", command=imgps)
pbtn11.grid(row=1, column=0, sticky='nsew')

root.mainloop()

Я пробовал несколько способов загрузить изображение прямо из буфера обмена, но продолжал сталкиваться с ошибками. Таким образом, мои вышеупомянутые решения не могут быть на 100% самым быстрым способом реализации этого, но должны работать достаточно хорошо.

...