代码之家  ›  专栏  ›  技术社区  ›  Stanley

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

  •  1
  • Stanley  · 技术社区  · 6 年前

    :我目前已经试了很多东西,在stackoverflow上很少有人问我这个问题,而且我似乎无法把我的头绕在上面,所以我需要一些帮助

    应用 :此程序的目的是设置椭圆形和图片的动画,椭圆形工作正常,但图片正在挣扎,您可以删除图像或 阿利恩2 程序应该运行良好。

    代码

    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

    运行文件('/Users/Stian/.spyder-py3/animation\u test.py',wdir='/Users/Stian/.spyder-py3')

    文件“”,第1行,在 运行文件('/Users/Stian/.spyder-py3/animation\u test.py',wdir='/Users/Stian/.spyder-py3')

    文件“/anaconda3/lib/python3.6/site packages/spyder/utils/site/sitecommize.py”,第705行,在runfile中 execfile(文件名,命名空间)

    文件“/anaconda3/lib/python3.6/site packages/spyder/utils/site/sitecommize.py”,第102行,在execfile中 exec(编译(f.read(),文件名,“exec”),命名空间)

    文件“/Users/Stian/.spyder-py3/animation\u test.py”,第57行,in 外星人()

    文件“/Users/Stian/.spyder-py3/animation\u test.py”,第25行,in self.CardVar=ImageTk.PhotoImage(重新扫描,master=root)

    初始 self.\uu photo=tkinter.PhotoImage(**kw)

    文件“/anaconda3/lib/python3.6/tkinter/ .py“,3542行,英寸 初始 形象。 初始 (本人,“照片”,姓名,cnf,船长,**千瓦)

    文件“/anaconda3/lib/python3.6/tkinter/ 初始 .py“,第3498行,英寸 初始 self.tk.call((“image”,“create”,imgtype,name,)+选项)

    TclError:无法调用“image”命令:应用程序已被破坏


    我知道代码并不漂亮,但它是一个测试环境,正如前面提到的,所有的东西都应该完美无缺地工作,但是当使用图像而不是椭圆形时,它就会崩溃,而椭圆形应该不会有太大的区别。提前谢谢!


    问题解决了

    原来分配时出现的问题 主人 里面 图像() ,当我删除应用程序未获取

    新问题

    我对代码所做的更改来自:

            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\u test.py',wdir='/Users/Stian/.spyder-py3')

    文件“/anaconda3/lib/python3.6/site packages/spyder/utils/site/sitecommize.py”,第705行,在runfile中 execfile(文件名,命名空间)

    文件“/anaconda3/lib/python3.6/site packages/spyder/utils/site/sitecommize.py”,第102行,在execfile中 exec(编译(f.read(),文件名,“exec”),命名空间)

    文件“/Users/Stian/.spyder-py3/animation\u test.py”,第56行,in 外星人()

    文件“/Users/Stian/.spyder-py3/animation\u test.py”,第27行,in 初始 self.alien2=self.canvas.create_图像(100100,CardVar,anchor=CENTER)

    文件“/anaconda3/lib/python3.6/tkinter/ 初始 .py“,第2486行,在create_image中 返回self.\u create('image',args,kw)

    初始 *(args+self.\u选项(cnf,kw)))

    TclError:未知选项“pyimage21”

    2 回复  |  直到 6 年前
        1
  •  1
  •   PM 2Ring    6 年前

    你的代码中有几个地方忘记了 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程序中。它把 一切 animation 使用 .after 方法。

    这是一个版本的 不使用的方法 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)
    
        2
  •  0
  •   Stanley    6 年前

    过了一会儿,我编辑了代码并使之生效。这是完整的代码

    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(),另一个位于远处的图像显示出来,因此似乎有东西保存在我的内存中。所以我决定 重新启动内核 一切都很顺利