Как отобразить изображение / скриншот в окне Python, не сохраняя его - PullRequest
3 голосов
/ 07 мая 2019

Я хочу отобразить свой скриншот в новом окне tkinter (TopLevel), но я не хочу сохранять его на ПК.Когда я сохраняю его, он работает нормально, но когда я пытаюсь загрузить скриншот из памяти, у меня появляется ошибка: изображение не существует.

Мое главное окно root = Tk()

Я вызываю эту функцию изкнопка:

def screenshot():
    x = 500
    y = 500
    im1 = pyautogui.screenshot(region=(x, y, 100, 100))
    im1.save('test.png')

    New = Toplevel(root)
    im1 = ImageTk.PhotoImage(Image.open("test.png"))
    image1 = Label(New, image = im1)
    image1.image = im1
    image1.place(x=0, y=0)

И это работает хорошо, но когда я пытаюсь это сделать:

def screenshot():
    x = 500
    y = 500
    im1 = pyautogui.screenshot(region=(x, y, 100, 100))

    New = Toplevel(root)
    image1 = Label(New, image = im1)
    image1.image = im1
    image1.place(x=0, y=0)

Я получил ошибку:

_tkinter.TclError: image "<PIL.Image.Image image mode=RGB size=100x100 at 0xB4367F0>" doesn't exist

Как я могу отобразить мой скриншотбез сохранения?

РЕДАКТИРОВАТЬ: я обойти свою проблему, используя os.remove код выглядит следующим образом:

def screenshot():
    x = 500
    y = 500
    im1 = pyautogui.screenshot(region=(x, y, 100, 100))
    im1.save('test.png')

    New = Toplevel(root)
    im1 = ImageTk.PhotoImage(Image.open('test.png'))
    image1 = Label(New, image = im1)
    image1.image = im1
    image1.place(x=0, y=0)
    os.remove('test.png')

И это работает довольно хорошо, но я все еще заинтересован, если я могусделай это без im1.save как-нибудь.Я довольно новичок в программировании, поэтому, пожалуйста, дайте мне подсказки, если мое решение в порядке.

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Решение вашей проблемы очень простое.Из сообщения об ошибке "_tkinter.TclError: image "<PIL.Image.Image image mode=RGB size=100x100 at 0xB4367F0>" doesn't exist" я вижу, что изображение в формате PIL.По сути, вам просто нужно импортировать ImageTk из библиотеки PIL и делать im1 = ImageTk.PhotoImage(im1) в своей функции после захвата экрана.

Вот ваша функция.

def screenshot():
    x = 500
    y = 500
    # Can use ImageGrab to capture the screen as well
    im1 = pyautogui.screenshot(region=(x, y, 100, 100))

    New = Toplevel(root)
    im1 = ImageTk.PhotoImage(im1)      # converting PIL to support Tkinter format
    image1 = Label(New, image = im1)
    image1.image = im1
    image1.place(x=0, y=0)

Если вы используете pyautogui просто для захвата экрана, то я бы порекомендовал from PIL import ImageGrab, ImageTk таким способом, который вам даже не нужен pyautogui и замените его на ImageGrab.grab(bbox)).

Образец:

from tkinter import *
import pyautogui
from PIL import ImageTk, ImageGrab

root = Tk()

def screenshot():
    x = 500
    y = 500

    # ----They both show the same results-----

    # im1 = pyautogui.screenshot(region=(x, y, 100, 100))   
    im1 = ImageGrab.grab((x, y, x+100, y+100)) # bbox =  (x1, y1, x2, y2)  

    New = Toplevel(root)
    im1 = ImageTk.PhotoImage(im1)
    image1 = Label(New, image = im1)
    image1.image = im1
    image1.place(x=0, y=0)

Button(root, text='ScreenShot', padx=10, command=screenshot).pack(padx=10, pady=10)

mainloop()
0 голосов
/ 07 мая 2019

Попробуйте это:

from tkinter import *

# pip install pillow

from PIL import Image, ImageTk
from pyautogui import screenshotUtil

class Window(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.master = master
        self.pack(fill=BOTH, expand=1)

        im=screenshotUtil.screenshot()

        #load = Image.open("my_screenshot.png")
        render = ImageTk.PhotoImage(im)
        img = Label(self, image=render)
        img.image = render
        img.place(x=0, y=0)


root = Tk()
app = Window(root)
root.wm_title("Tkinter window")
root.geometry("200x120")
root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...