Python:Tkinter TclError:无法调用“图片”命令

时间:2018-08-23 12:43:37

标签: python python-3.x tkinter compiler-errors spyder

前言:我目前已经尝试了大多数事情,并且在stackoverflow上对此问题提出的问题很少,我似乎无法解决问题,所以即时通讯需要一些帮助

应用程序 :该程序的目的是为椭圆和图片设置动画,该椭圆可以正常工作,但图片很费力,您可以删除图片或 alien2 ,该程序应该可以正常运行。

CODE

image form

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()

错误:

image

  

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)

新错误

image form


  

文件“”,第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”

2 个答案:

答案 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(),并且显示了另一个位置较远的图像,因此似乎保存了某些内容我的记忆。所以我决定重启内核,一切顺利