Python ошибка черепахи при попытке установить bgpi c изображение "pyimage3" не существует - PullRequest
0 голосов
/ 27 марта 2020

это мои коды:

import turtle as t
import inspect
import tkinter as tk

class GUI:

    def __init__(self, mPos = [0, 0], mAngle = 0, mjellynum = 1, mSpd = 4, bPoses = [[100, 100]]):
        self.lvl = self.Level(gui = self, jellyPoses = bPoses)
        self.tur = self.Turtle(gui = self, pos = mPos, angle = mAngle, jellynum = mjellynum, spd = mSpd)

        self.updateChilds()

    def __del__(self):
        print("gui deleted")

    def updateChilds(self):
        try:
            self.lvl.gui = self
            self.tur.gui = self
        except:
            pass
        t.Screen().ontimer(self.updateChilds, 1)



    class Turtle:
        def __init__(self, gui, pos = [0, 0], angle = 0, jellynum = 1, spd = 4):
            self.gui = gui
            t.ht()
            t.Screen().setup(width = 0.5, height = 0.94, startx = 960, starty = 0)
            self.pos = pos
            self.angle = angle
            self.jellynum = jellynum
            self.m = t.Turtle()
            self.m.speed = 0
            self.m.penup()
            self.m.goto(self.pos)
            self.m.seth(self.angle)
            self.m.shape("turtle")
            self.m.speed = spd
            self.checkJellyfish()

        def __del__(self):
            print("turtle deleted")

        def goto(self, x, y = None):
            if y != None:
                #self.checkjellyfish([x, y])
                self.m.goto(x, y)
            else:
                #self.checkjellyfish(x)
                self.m.goto(x)
            self.pos = self.m.pos()

        def lookAt(self, x, y = None):
            if y != None:
                if self.m.heading() <= self.m.towards(x, y):
                    self.m.rt(self.m.heading() - self.m.towards(x, y))
                else:
                    self.m.lt(self.m.heading() - self.m.towards(x, y))
            else:
                if self.m.heading() <= self.m.towards(x):
                    self.m.rt(self.m.heading() - self.m.towards(x))
                else:
                    self.m.lt(self.m.heading() - self.m.towards(x))
            self.angle = self.m.heading()

        def fd(self, dis):
            self.m.fd(dis)
            self.pos = self.m.pos()

        def forward(self, dis):
            self.fd(dis)

        def setAngle(self, angle):
            self.m.seth(angle)
            self.angle = self.m.heading()

        def turn(self, angle):
            self.m.rt(angle)
            self.angle = self.m.heading()


        def jellyfish(self, i):
            return self.gui.lvl.jellyfishs[i]


        def checkJellyfish(self):
            try:
                for i in self.gui.lvl.jellyfishs:
                    if self.m.distance(i.pos()) <= 0.1:
                        self.gui.lvl.hide(i)
                        self.jellynum -= 1
                        if self.jellynum == 0:
                            print("You Won")
            except AttributeError as er:
                print(er)
            t.Screen().ontimer(self.checkJellyfish, 1)


        def reset(self):
            self.m.ht()
            t.reset()
            t.ht()



    class Jellyfish(t.Turtle):
        def goto(self, x, y=None):
            curframe = inspect.currentframe()
            calframe = inspect.getouterframes(curframe, 2)
            if not calframe[1][1].endswith("temp.py"):
                if y is None:
                    self._goto(t.Vec2D(*x))
                else:
                    self._goto(t.Vec2D(x, y))



    class Level:
        def __init__(self, gui, jellyPoses):
            self.jellyfishs = []
            self.gui = gui
            self.image = "C:\\Users\\yuvro\\OneDrive\\Desktop\\Python\\scripts\\Codeturtle\\assets\\images\\jellyfish.gif"
            t.Screen().addshape(self.image)
            t.Screen().bgpic(self.image)

            for i in jellyPoses:
                self.createJellyfish(i)

        def __del__(self):
            for i in self.jellyfishs:
                i.ht()
            print("level deleted")

        def createJellyfish(self, pos):
            self.jellyfishs.append(self.gui.Jellyfish())
            self.jellyfishs[-1].pu()
            self.jellyfishs[-1].goto(pos)
            self.jellyfishs[-1].shape(self.image)
        def hide(self, trtl):
            self.jellyfishs[self.jellyfishs.index(trtl)].hideturtle()


import tkinter as tk
from gui import *
import keyboard as k
import importlib
import os

class UserInterface:
    def __init__(self):
        self.root = tk.Toplevel()
        self.root.title("Codeturtle")
        self.txtBox = tk.Text(self.root)
        self.txtBox.grid(columnspan = 8)
        self.runBut = tk.Button(self.root, text = "Run", command = self.run)
        self.runBut.grid(row = 1)
        self.turBut = tk.Button(self.root, text = "turtle", command = None)
        self.turBut.bind("<ButtonRelease>", self.writeM)
        self.turBut.grid(row = 1, column = 1)
        self.jellyBut = tk.Button(self.root, text = "jellyfish", command = None)
        self.jellyBut.bind("<ButtonRelease>", self.writeJ)
        self.jellyBut.grid(row = 1, column = 2)
        self.gotoBut = tk.Button(self.root, text = ".goto()", command = None)
        self.gotoBut.bind("<ButtonRelease>", self.writeG)
        self.gotoBut.grid(row = 1, column = 3)
        self.lookAtBut = tk.Button(self.root, text = ".lookAt()", command = None)
        self.lookAtBut.bind("<ButtonRelease>", self.writeL)
        self.lookAtBut.grid(row = 1, column = 4)
        self.forwardBut = tk.Button(self.root, text = ".forward()", command = None)
        self.forwardBut.bind("<ButtonRelease>", self.writeF)
        self.forwardBut.grid(row = 1, column = 5)
        self.setAngleBut = tk.Button(self.root, text = ".setAngle()", command = None)
        self.setAngleBut.bind("<ButtonRelease>", self.writeA)
        self.setAngleBut.grid(row = 1, column = 6)
        self.turnBut = tk.Button(self.root, text = ".turn()", command = None)
        self.turnBut.bind("<ButtonRelease>", self.writeT)
        self.turnBut.grid(row = 1, column = 7)
        self.gui = GUI()
        self.turtle = self.gui.tur

    def run(self):
        self.turtle.reset()
        self.turtle.__del__()
        self.gui.lvl.__del__()
        self.gui.__del__()
        o = open("temp.py", "w")
        o.write("def run(turtle):\n\tdef jellyfish(i):\n\t\treturn turtle.jellyfish(i)\n\n\n\t" + self.txtBox.get("1.0", tk.END).replace("\n", "\n\t") + "\n\n\treturn turtle")
        o.close()
        gui = GUI()
        turtle = gui.tur
        import temp
        importlib.reload(temp)
        try:
            self.turtle = temp.run(turtle)
        except:
            print("an error occurred")
            turtle.reset()
            turtle.__del__()
            gui.lvl.__del__()
            gui.__del__()
            self.gui = GUI()
            self.turtle = self.gui.tur
        try:
            os.remove("temp.py")
        except:
            pass
        #for i in self.txtBox.get("1.0", tk.END).split("\n"):
        #    if i != "" and i != None and not i[0] == "#":
        #        eval(i)
        #self.turtle = turtle
        self.gui = gui


    def writeM(self, b):
        k.write("turtle")
    def writeG(self, b):
        k.write(".goto()")
    def writeL(self, b):
        k.write(".lookAt()")
    def writeF(self, b):
        k.write(".forward()")
    def writeA(self, b):
        k.write(".setAngle()")
    def writeT(self, b):
        k.write(".turn()")
    def writeJ(self, b):
        k.write("jellyfish")


if __name__ == "__main__":
    user = UserInterface()

и это ошибка:

Traceback (most recent call last):
  File "C:\Users\yuvro\OneDrive\Desktop\Python\scripts\Codeturtle\userInterface.py", line 89, in <module>
    user = UserInterface()
  File "C:\Users\yuvro\OneDrive\Desktop\Python\scripts\Codeturtle\userInterface.py", line 36, in __init__
    self.gui = GUI()
  File "C:\Users\yuvro\OneDrive\Desktop\Python\scripts\Codeturtle\gui.py", line 8, in __init__
    self.lvl = self.Level(gui = self, jellyPoses = bPoses)
  File "C:\Users\yuvro\OneDrive\Desktop\Python\scripts\Codeturtle\gui.py", line 126, in __init__
    t.Screen().bgpic(self.image)
  File "C:\Program Files (x86)\Python38-32\lib\turtle.py", line 1482, in bgpic
    self._setbgpic(self._bgpic, self._bgpics[picname])
  File "C:\Program Files (x86)\Python38-32\lib\turtle.py", line 738, in _setbgpic
    self.cv.itemconfig(item, image=image)
  File "<string>", line 1, in itemconfig
  File "C:\Program Files (x86)\Python38-32\lib\tkinter\__init__.py", line 2898, in itemconfigure
    return self._configure(('itemconfigure', tagOrId), cnf, kw)
  File "C:\Program Files (x86)\Python38-32\lib\tkinter\__init__.py", line 1627, in _configure
    self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
_tkinter.TclError: image "pyimage3" doesn't exist

Может кто-нибудь, пожалуйста, помогите мне, inte rnet говорит, чтобы изменить его от tk.Tk () до tk.Toplevel (), но это уже так. (строка 9 в коде 2) Я думаю, это происходит потому, что tkinter.Toplevel () находится в другом коде, но я не уверен. Похожая ошибка «изображения« pyimage2 »не существует» происходит, когда я пытаюсь установить форму черепахи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...