Python: Tkinter TclError: не может вызвать команду «изображение»

1

Предисловие: в настоящее время я пробовал большинство вещей, и на вопрос о том, как это сделать, накладывается несколько запросов, и я наклоняю, похоже, обертываю вокруг себя, поэтому им понадобится помощь

приложение: целью этой программы является анимировать овал и изображение, овал отлично работает, но изображение борется, вы можете удалить изображение или alien2, и программа должна работать нормально.

КОД

форма изображения

from tkinter import *
import time
from PIL import Image,ImageFilter
from PIL import ImageTk

class alien(object):
     def __init__(self):


        self.root = Tk()
        self.canvas = Canvas(self.root, width=400, height = 400)
        self.canvas.pack()
        self.cardPath = Image.open('bubble.png')
        self.resCard = cardPath.resize((100,100))
        self.CardVar = ImageTk.PhotoImage(resCard,master=root)
        self.alien1 = self.canvas.create_oval(20, 260, 120, 360, outline='white',fill='blue')
        self.alien2 = self.canvas.create_image(100,100,CardVar,anchor=CENTER)
        self.canvas.pack()
        self.root.after(0, self.animation)
        self.root.mainloop()


     def animation(self):
        track = 0
        while True:
            x = 5
            y = 0
            if track == 0:
               for i in range(0,51):
                    time.sleep(0.025)
                    self.canvas.move(self.alien1, x, y)
                    self.canvas.move(self.alien2, x, y)
                    self.canvas.update()
               track = 1
               print("check")

            else:
               for i in range(0,51):
                    time.sleep(0.025)
                    self.canvas.move(self.alien1, -x, y)
                    self.canvas.move(self.alien2, -x, y)
                    self.canvas.update()
               track = 0
            print(track)

alien()

ОШИБКА:

образ

runfile ('/Users/Stian/.spyder-py3/animation_test.py', wdir = '/Users/Stian/.spyder-py3') Traceback (последний последний вызов):

Файл "", строка 1, в файле runfile ('/Users/Stian/.spyder-py3/animation_test.py', wdir = '/Users/Stian/.spyder-py3')

Файл "/anaconda3/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", строка 705, в файле execfile (имя файла, пространство имен)

Файл "/anaconda3/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", строка 102, в execfile exec (компиляция (f.read(), имя файла, "exec"), пространство имен)

Файл "/Users/Stian/.spyder-py3/animation_test.py", строка 57, в foreign()

Файл "/Users/Stian/.spyder-py3/animation_test.py", строка 25, в init self.CardVar = ImageTk.PhotoImage(resCard, master = root)

Файл "/anaconda3/lib/python3.6/site-packages/PIL/ImageTk.py", строка 124, в init self.__ photo = tkinter.PhotoImage(** kw)

Файл "/anaconda3/lib/python3.6/tkinter/init.py", строка 3542, в режиме " Инициализация изображения". init (self, 'photo', name, cnf, master, ** kw)

Файл "/anaconda3/lib/python3.6/tkinter/init.py", строка 3498, в init self.tk.call(('образ', 'create', imgtype, name,) + опции)

TclError: не может вызвать команду "image": приложение было уничтожено


Я знаю, что код не красив, но это тестовая среда, и, как уже говорилось, все должно работать безупречно, но оно ломается, когда изображение используется вместо овала, которое не должно иметь большого значения. Заранее спасибо!


ЗАДАЧА РЕШЕНА

выясняется, что проблема возникла при назначении мастера внутри PhotoImage(), когда я удалил приложение, которое не получило TclError

НОВАЯ ПРОБЛЕМА

изменения, внесенные мной в код, были следующими:

        self.cardPath = Image.open('bubble.png')
        self.resCard = cardPath.resize((100,100))
        self.CardVar = ImageTk.PhotoImage(resCard,master=root)

к этому:

    self.cardPath = Image.open('bubble.png')
    self.resCard = cardPath.resize((100,100))
    self.CardVar = ImageTk.PhotoImage(resCard)

НОВОЕ ОШИБКА

форма изображения


Файл "", строка 1, в файле runfile ('/Users/Stian/.spyder-py3/animation_test.py', wdir = '/Users/Stian/.spyder-py3')

Файл "/anaconda3/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", строка 705, в файле execfile (имя файла, пространство имен)

Файл "/anaconda3/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", строка 102, в execfile exec (компиляция (f.read(), имя файла, "exec"), пространство имен)

Файл "/Users/Stian/.spyder-py3/animation_test.py", строка 56, in alien()

Файл "/Users/Stian/.spyder-py3/animation_test.py", строка 27, в init self.alien2 = self.canvas.create_image (100 100, CardVar, anchor = CENTER)

Файл "/anaconda3/lib/python3.6/tkinter/init.py", строка 2486, в create_image return self._create ('image', args, kw)

Файл "/anaconda3/lib/python3.6/tkinter/init.py", строка 2477, в _create * (args + self._options (cnf, kw))))

TclError: неизвестный параметр "pyimage21"

  • 0
    Нам не нужно видеть код или ошибки в виде изображения. Но было бы неплохо, если бы вы предоставили изображение "bubble.png".
Теги:
python-3.x
spyder
tkinter
compiler-errors

2 ответа

0
Лучший ответ

Через некоторое время я отредактировал код и заставил его работать. вот полный код

from tkinter import *
import time
import PIL
from PIL import Image,ImageFilter
from PIL import ImageTk

class alien(object):
    def __init__(self):

    self.root = Tk()
    self.canvas = Canvas(self.root, width=400, height = 400)
    self.canvas.pack()

    CardVar = ImageTk.PhotoImage(file='bubble.png')
    self.alien1 = self.canvas.create_oval(20, 260, 120, 360, outline='white',fill='blue')
    self.alien2 = self.canvas.create_image((100,100),image=CardVar,anchor=CENTER)
    self.canvas.pack()
    self.root.after(0, self.animation)
    self.root.mainloop()


 def animation(self):
    track = 0
    while True:
        x = 5
        y = 0
        if track == 0:
           for i in range(0,51):
                time.sleep(0.025)
                self.canvas.move(self.alien1, x, y)
                self.canvas.move(self.alien2, x, y)
                self.canvas.update()
           track = 1
           print("check")

        else:
           for i in range(0,51):
                time.sleep(0.025)
                self.canvas.move(self.alien1, -x, y)
                self.canvas.move(self.alien2, -x, y)
                self.canvas.update()
           track = 0
        print(track)
alien()

Эта проблема

cardVar никогда не смог найти правильное изображение, хотя он был в той же папке, поэтому я попытался сделать cardVar.show(), и появилось еще одно изображение, расположенное далеко, так что, похоже, что-то было сохранено в моей памяти. поэтому я решил перезапустить ядро, и все прошло гладко

1

У вас есть несколько мест в вашем коде, где вы забыли self. Но причиной вашей основной ошибки является то, что вам нужно передать имя изображения в качестве ключевого слова arg. Здесь исправлена версия вашего кода.

from tkinter import *
import time
from PIL import Image,ImageFilter
from PIL import ImageTk

class alien(object):
     def __init__(self):
        self.root = Tk()
        self.canvas = Canvas(self.root, width=400, height=400)
        self.canvas.pack()
        self.cardPath = Image.open('bubble.png')
        self.resCard = self.cardPath.resize((100, 100))
        self.CardVar = ImageTk.PhotoImage(self.resCard)
        self.alien1 = self.canvas.create_oval(20, 260, 120, 360, outline='white', fill='blue')
        self.alien2 = self.canvas.create_image(100, 100, image=self.CardVar, anchor=CENTER)
        self.canvas.pack()
        self.root.after(0, self.animation)
        self.root.mainloop()

     def animation(self):
        track = 0
        while True:
            x = 5
            y = 0
            if track == 0:
               for i in range(51):
                    time.sleep(0.025)
                    self.canvas.move(self.alien1, x, y)
                    self.canvas.move(self.alien2, x, y)
                    self.canvas.update()
               track = 1
               print("check")
            else:
               for i in range(51):
                    time.sleep(0.025)
                    self.canvas.move(self.alien1, -x, y)
                    self.canvas.move(self.alien2, -x, y)
                    self.canvas.update()
               track = 0
            print(track)

alien()

Кстати, не рекомендуется использовать time.sleep в программах GUI. Это заставляет все спать, поэтому GUI не может обновить себя или ответить на любой пользовательский ввод. Было бы лучше реорганизовать ваш код, чтобы animation использовала метод .after.

Вот версия метода animation, которая не использует sleep. Вам нужно добавить self.count = 0 в метод __init__.

 def animation(self):
    y = 0
    x = 5 if self.count < 50 else -5
    self.count = (self.count + 1) % 100
    self.canvas.move(self.alien1, x, y)
    self.canvas.move(self.alien2, x, y)
    self.root.after(25, self.animation)
  • 0
    Спасибо за ваш отзыв, он очень признателен! я тоже это заметил, дело в том, что мне никогда не приходилось назначать его в качестве kwarg в моем основном приложении, но я решил попробовать, и это все равно выдает мне ту же ошибку. Я также попробовал ваш код, но, к сожалению, все еще не повезло :( Также, спасибо за ваши усилия и комментарий об использовании time.sleep () в графическом интерфейсе, мы также рассмотрим это! Редактировать: я бы поднял вас если бы у меня была сила
  • 0
    @ Stanley Это странно, все работает нормально на моей машине (используя одно из моих собственных изображений PNG вместо bubble.png). Попробуйте запустить его непосредственно из командной строки, а не внутри Spyder.
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню