前言:我目前已经尝试了大多数事情,并且在stackoverflow上对此问题提出的问题很少,我似乎无法解决问题,所以即时通讯需要一些帮助
应用程序 :该程序的目的是为椭圆和图片设置动画,该椭圆可以正常工作,但图片很费力,您可以删除图片或 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') 追溯(最近一次通话):
文件“”,第1行,在 运行文件('/Users/Stian/.spyder-py3/animation_test.py',wdir ='/ Users / Stian / .spyder-py3')
runfile中的文件“ /anaconda3/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py”,第705行 execfile(文件名,命名空间)
execfile中的文件“ /anaconda3/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py”,第102行 exec(compile(f.read(),文件名,'exec'),命名空间)
文件“ /Users/Stian/.spyder-py3/animation_test.py”,第57行,在 Alien()
“ strong> init 中的文件“ /Users/Stian/.spyder-py3/animation_test.py”,第25行 self.CardVar = ImageTk.PhotoImage(resCard,master = root)
init 中的文件“ /anaconda3/lib/python3.6/site-packages/PIL/ImageTk.py”,第124行 self .__ photo = tkinter.PhotoImage(** kw)
文件“ /anaconda3/lib/python3.6/tkinter/init.py”,第3542行,位于 init 图片。初始化(自己,“照片”,姓名,cnf,master,** kw)
文件“ /anaconda3/lib/python3.6/tkinter/init.py”,行3498,位于 init 中 self.tk.call((''image','create',imgtype,name,)+选项)
TclError:无法调用“图像”命令:应用程序已被破坏
我知道代码不是很漂亮,但是它是一个测试环境,并且如上所述,所有内容都应该可以正常工作,但是当使用图像而不是椭圆形时,它会中断,这不会有太大的不同。预先感谢!
当我删除应用程序未得到 TclError <时,在 PhotoImage()中分配 master 时出现了问题/ p>
我对代码所做的更改来自此:
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行,在 运行文件('/Users/Stian/.spyder-py3/animation_test.py',wdir ='/ Users / Stian / .spyder-py3')
runfile中的文件“ /anaconda3/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py”,第705行 execfile(文件名,命名空间)
execfile中的文件“ /anaconda3/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py”,第102行 exec(compile(f.read(),文件名,'exec'),命名空间)
文件“ /Users/Stian/.spyder-py3/animation_test.py”,第56行, Alien()
“ strong> init 中的文件“ /Users/Stian/.spyder-py3/animation_test.py”,第27行 self.alien2 = self.canvas.create_image(100,100,CardVar,anchor = CENTER)
文件“ /anaconda3/lib/python3.6/tkinter/init.py”,行2486,位于create_image中 返回self._create('image',args,kw)
文件_create中的文件“ /anaconda3/lib/python3.6/tkinter/init.py”,第2477行 *(args + self._options(cnf,kw))))
TclError:未知选项“ pyimage21”
答案 0 :(得分: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()
顺便说一句,在GUI程序中使用time.sleep
不是一个好主意。它使一切进入睡眠状态,因此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)
答案 1 :(得分: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(),并且显示了另一个位置较远的图像,因此似乎保存了某些内容我的记忆。所以我决定重启内核,一切顺利