flapflapjack
@flapflapjack
на треть я прав

Почему происходит ошибка при загрузке изображения в PIL PhotoImage?

Предисловие:
Возможно я делаю все через одно место? И есть другой вариант постоянно снимать изображение игры с дальней шей обработкой и выводом в окошко обработанного изображения? Вроде еще есть PyQT - проще будет сделать? С питоном не знаком, пишу код по документации библиотек в интернете.

******
Задача - сделать скрин области экрана с игрой, поместить его в переменную для дальнейших действий в OpenCV и отобразить эт изображение в окне TkInter.

Инклуды:
from Tkinter import *
import cv2 as cv
import win32gui
from PIL import ImageOps, Image, ImageGrab, ImageTk
from numpy import *


Получаем изображение (основная функция get_screen, результат функции отлично обрабатывается библиотекой OpenCV без ошибок:

WINDOW_SUBSTRING="Game Window Name"

def set_window_coordinates(hwnd, window_info):
    if win32gui.IsWindowVisible(hwnd):
        if WINDOW_SUBSTRING in win32gui.GetWindowText(hwnd):
            rect = win32gui.GetWindowRect(hwnd)
            x = rect[0]
            y = rect[1]
            w = rect[2] - x
            h = rect[3] - y
            window_info['x'] = x
            window_info['y'] = y
            window_info['width'] = w
            window_info['height'] = h
            window_info['name'] = win32gui.GetWindowText(hwnd)
            win32gui.SetForegroundWindow(hwnd)


def get_screen(x1, y1, x2, y2):
    box = (x1 + 8, y1 + 30, x2 - 8, y2)
    screen = ImageGrab.grab(box)
    img = array(screen.getdata(), dtype=uint8).reshape((screen.size[1], screen.size[0], 3))
    return img


def get_window_info():
    # set window info
    window_info = {}
    win32gui.EnumWindows(set_window_coordinates, window_info)
    return window_info


Создаем интерфейс и грузим в него картинку:
def loop():
    window_info = get_window_info()
    root = Tk()
    root.title("GUI on Python")

    img = get_screen(
        window_info["x"],
        window_info["y"],
        window_info["x"] + window_info["width"],
        window_info["y"] + window_info["height"]
    )
    root.geometry(str(window_info["width"]) + "x" + str(window_info["height"]))

    #print img
    photo = PhotoImage(image=img) # - тут выдается ошибка
    #btn = Button(text="Click Me", background="#555", foreground="#ccc",
    #             padx="20", pady="8", font="16", command=click_button)
    photo.pack()
    #btn.pack()

    root.mainloop()


loop()


Появляется ошибка:


C:\Python27\python.exe D:/games/bot-master/t.py
Traceback (most recent call last):
File "D:/games/bot-master/t.py", line 98, in
loop()
File "D:/games/bot-master/t.py", line 87, in loop
photo = PhotoImage(image=img)
File "C:\Python27\lib\lib-tk\Tkinter.py", line 3371, in __init__
Image.__init__(self, 'photo', name, cnf, master, **kw)
File "C:\Python27\lib\lib-tk\Tkinter.py", line 3325, in __init__
self.tk.call(('image', 'create', imgtype, name,) + options)
_tkinter.TclError: unknown option "-image"

Process finished with exit code 1


Не понимаю, почему Unknown option, ведь даже в самом файле библиотеки этот момент обрабатывается - открывал, смотрел.

Питон 2.7
  • Вопрос задан
  • 689 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Это не именованный параметр. Просто
photo = PhotoImage(img)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы