Как использовать файлы jpg в Turtle Graphics? - PullRequest
0 голосов
/ 14 июня 2019

Я знаю, что это может быть повторяющийся вопрос, и я знаю, что модуль Turtle поддерживает только GIF-файлы, но я действительно хочу использовать jpg или png в Turtle.Я прочитал исходный код turtle.py и попытался изменить строки 885 и 1132 с

if name.lower().endswith(".gif"):

на

if data.lower().endswith(".gif") or data.lower().endswith(".jpg"):

, а затем я сохранил файл, но даже если я попробую сейчас

screen.addshape("fireball.jpg")

выдает ошибку:

File "C:\Users\PC\AppData\Local\Programs\Python\Python37\lib\turtle.py", line 1135, in register_shape
    raise TurtleGraphicsError("Bad arguments for register_shape.\n"
turtle.TurtleGraphicsError: Bad arguments for register_shape.

Что я могу сделать, чтобы использовать файлы jpg ???Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 14 июня 2019

Это приходит так часто , давайте напишем патч для черепахи, чтобы все, что PIL.ImageTk.PhotoImage() могло обработать:

patch_turtle_image.py

from turtle import TurtleScreenBase
from PIL import ImageTk

@staticmethod
def _image(filename):
    return ImageTk.PhotoImage(file=filename)

TurtleScreenBase._image = _image

# If all you care about is screen.bgpic(), you can ignore what follows.

from turtle import Shape, TurtleScreen, TurtleGraphicsError
from os.path import isfile

# Methods shouldn't do `if name.lower().endswith(".gif")` but simply pass
# file name along and let it break during image conversion if not supported.

def register_shape(self, name, shape=None):  # call addshape() instead for original behavior
    if shape is None:
        shape = Shape("image", self._image(name))
    elif isinstance(shape, tuple):
        shape = Shape("polygon", shape)

    self._shapes[name] = shape

TurtleScreen.register_shape = register_shape

def __init__(self, type_, data=None):
    self._type = type_

    if type_ == "polygon":
        if isinstance(data, list):
            data = tuple(data)
    elif type_ == "image":
        if isinstance(data, str):
            if isfile(data):
                data = TurtleScreen._image(data) # redefinition of data type
    elif type_ == "compound":
        data = []
    else:
        raise TurtleGraphicsError("There is no shape type %s" % type_)

    self._data = data

Shape.__init__ = __init__

Тестовая программа:

from turtle import Screen, Turtle
import patch_turtle_image

screen = Screen()
screen.bgpic('MyBackground.jpg')

screen.register_shape('MyCursor.png')

turtle = Turtle('MyCursor.png')

turtle.forward(100)

screen.exitonclick()
0 голосов
/ 14 июня 2019

Вы можете использовать Подушка следующим образом:

from PIL import Image
im = Image.open("yourpicture.jpg")
im.rotate(180).show()
...