У меня возникает ошибка «pyimage1» не существует при открытии изображения в черепахе с помощью кнопки tkinter - PullRequest
0 голосов
/ 18 июня 2020

Хотя он отлично работает со встроенными формами черепах, он не работает с новыми зарегистрированными формами. Ошибка в том, что pyimage1 не существует, и моя программа и файл находятся в тех же каталогах Вот код

      root=Tk()
      import turtle
      def image():
        global img
        img='batman.gif'
        player=turtle.Turtle()
        wn=turtle.Screen()
        wn.register_shape(img)
        player.shape(img)
      B=Button(root,text='click',command=image).pack()```

The error shown is:```Exception in Tkinter callback
Traceback (most recent call last):
 File "C:\Users\dell\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 1705, in __call__
   return self.func(*args)
 File "C:\Users\dell\OneDrive\Desktop\imagetk.py", line 10, in image
   player.shape(img)
 File "C:\Users\dell\AppData\Local\Programs\Python\Python37\lib\turtle.py", line 2777, in shape
   self.turtle._setshape(name)
 File "C:\Users\dell\AppData\Local\Programs\Python\Python37\lib\turtle.py", line 2506, in _setshape
   self._item = screen._createimage(screen._shapes["blank"]._data)
 File "C:\Users\dell\AppData\Local\Programs\Python\Python37\lib\turtle.py", line 723, in _createimage
   return self.cv.create_image(0, 0, image=image)
 File "<string>", line 1, in create_image
 File "C:\Users\dell\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 2489, in create_image
   return self._create('image', args, kw)
 File "C:\Users\dell\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 2480, in _create
   *(args + self._options(cnf, kw))))
_tkinter.TclError: image "pyimage1" doesn't exist```




1 Ответ

1 голос
/ 19 июня 2020

Проблема в том, что при смешивании turtle и tkinter создаются два корня, что приводит к этой ошибке. Вы пытаетесь использовать автономную turtle, тогда как вам следует использовать embedded turtle. Т.е. вы должны использовать RawTurtle вместо Turtle и RawScreen вместо Screen. Но не просто меняйте имена местами, ищите их в документации. Ваш код должен выглядеть примерно так:

from tkinter import *
from turtle import TurtleScreen, RawTurtle

IMAGE = 'batman.gif'

def image():
    player = RawTurtle(screen)
    player.shape(IMAGE)

root = Tk()

Button(root, text='click', command=image).pack()

canvas = Canvas(root)
canvas.pack()

screen = TurtleScreen(canvas)
screen.register_shape(IMAGE)

screen.mainloop()
...