Tkinter创建图像函数错误(pyimage1不存在)

7

我是一名来自外部世界的学生,之前没有编程经验。我一直在学习Python作为我的数学课程的延伸。我一直在尝试使用Tkinter创建生成分形的程序。代码本身可以正常工作,但包含用户输入GUI后会出现错误:

    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Python33\lib\tkinter\__init__.py", line 1475, in __call__
        return self.func(*args)
      File "C:\Python33\FractalGUI.py", line 74, in fractals
        canvas.create_image((0, 0), image = img, state = "normal", anchor = tkinter.NW)
      File "C:\Python33\lib\tkinter\__init__.py", line 2319, in create_image
        return self._create('image', args, kw)
      File "C:\Python33\lib\tkinter\__init__.py", line 2310, in _create
        *(args + self._options(cnf, kw))))
    _tkinter.TclError: image "pyimage1" doesn't exist

以下是代码。请注意,错误直到运行canvas.create_image行才会出现。如果有任何其他信息可以提供,请告诉我。谢谢!:)

    import tkinter
    from tkinter import *

    #Creates widgets for user input
    class Imagespecs(Frame):

        def __init__(self,master):
            Frame.__init__(self,master)
             self.grid()
             self.y_axis()
             self.x_axis()

    #Y axis input
         def y_axis(self):
            self.instruction = Label(self,text = "How many pixels high do you want the image?")
            self.instruction.grid(row = 8, column = 0, columnspan = 2, sticky = N)

            self.height = Entry(self)
            self.height.grid(row = 10, column = 1, sticky = E)

    #Enters info to run fractal generation
            self.submit_button = Button(self,text = "Submit", command = self.fractals)
            self.submit_button.grid(row = 14, column = 2, sticky = E)

    #X axis input
         def x_axis(self):
             self.instruction2 = Label(self,text = "How many pixels wide do you want the image?")
             self.instruction2.grid(row = 4, column = 0, columnspan = 2, sticky = E)

            self.width = Entry(self)
            self.width.grid(row = 6, column = 1, sticky = E)

      #generates fractal
         def fractals(self):
             #Replace non-input
             content = self.width.get()
             content2 = self.height.get()

             if content == "":
                content = 500

             if content2 == "":
                content2 = 500

            #Create window specs
            WIDTH = int(content2); HEIGHT = int(content)
            xa = -2.0; xb = 1.0
            ya = -1.5; yb = 1.5
            maxIt = 256

             window = Tk()
             canvas = Canvas(window, width = WIDTH, height = HEIGHT, bg = "#000000")
             img = PhotoImage(width = WIDTH, height = HEIGHT)

             #The Newton-Raphson iteration
             h = HEIGHT
            for ky in range(HEIGHT):
                print (h)
                h = h - 1
                for kx in range(WIDTH):
                    c = complex(xa + (xb - xa) * kx / WIDTH, ya + (yb - ya) * ky / HEIGHT)
                    z = complex(0.0, 0.0)
                     for i in range(maxIt):
                        z = z * z + c
                        if abs(z) >= 2.0:
                            break
                     rd = hex(i % 4 * 64)[2:].zfill(2)
                     gr = hex(i % 8 * 32)[2:].zfill(2)
                     bl = hex(i % 16 * 16)[2:].zfill(2)
                     img.put("#" + rd + gr + bl, (kx, ky))

             canvas.create_image((0, 0), image = img, state = "normal", anchor = tkinter.NW)

             #Run GUI
             canvas.pack()
             mainloop()

     root = Tk()
     root.title("Fractal GUI")
     root.geometry("300x200")
     app = Imagespecs(root)

     root.mainloop()

11
问题的一部分是您创建了多个 Tk 实例。Tkinter 的设计使得应该只有一个 Tk 实例。您的代码还似乎存在一些缩进错误。 - Bryan Oakley
好的,谢谢!我会再次检查缩进。你知道如何解决Tk问题吗?与此同时,我会尝试修复它,但如果你已经有解决方案,我将不胜感激。 :) - Silmarillion101
6
如果您需要多个窗口,请使用Tk创建第一个窗口,然后其他窗口需要是Toplevel的实例。 - Bryan Oakley
好的,谢谢! :) 窗口现在都打开了,但它告诉我全局名称tkinter未定义...我会在完成生物课后继续努力。感谢您对初学者的帮助和耐心。 - Silmarillion101
可能是一个重复问题,参考 无法将图像关联到 tkinter 标签 - unutbu
4个回答

17

尝试定义一个大师:

PhotoImage(master = canvas, width = WIDTH, height = HEIGHT)

如果您未定义主窗口,则该图像将使用创建的第一个Tk(),如果该Tk被删除,则无法显示图像。

我猜它是否有效,请告诉我。


当我试图在函数调用中导入一个模块时,我遇到了同样的问题。直到我定义(master=canvas),错误信息才被显示出来。感谢您发布这个答案。 - Mohammed
我将 'img = ImageTk.PhotoImage(my_img)' 改为 'img = ImageTk.PhotoImage(master=root, image=my_img)',然后它就正常工作了! - Dgomn D

8

好的,谢谢大家的帮助!我通过将 window = Tk() 改为 window = Toplevel 并将 anchor = tkinter.NW 替换为 anchor = NW 来解决了问题。现在它正好按照我的意图运行。接下来完成输入GUI!:D


1

我知道这个问题已经有答案了,但是想留下这个帖子以便其他人遇到和我一样的问题。我也遇到了上面提到的同样错误信息——我有一个自定义类继承自tk.Tk并尝试在调用super().__init__()之前设置样式,在调用之后添加该行代码即可解决问题。


0

使用以下方法解决

只需执行以下操作

import tkinter as tk

window=tk.TK()


这和直接使用tkinter有什么区别? - Ashwin Balani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接