Предисловие: в настоящее время я пробовал большинство вещей, и на вопрос о том, как это сделать, накладывается несколько запросов, и я наклоняю, похоже, обертываю вокруг себя, поэтому им понадобится помощь
приложение: целью этой программы является анимировать овал и изображение, овал отлично работает, но изображение борется, вы можете удалить изображение или 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"
Через некоторое время я отредактировал код и заставил его работать. вот полный код
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(), и появилось еще одно изображение, расположенное далеко, так что, похоже, что-то было сохранено в моей памяти. поэтому я решил перезапустить ядро, и все прошло гладко
У вас есть несколько мест в вашем коде, где вы забыли 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)