【问题标题】:Tkinter create image function error (pyimage1 does not exist)Tkinter 创建图像函数错误(pyimage1 不存在)
【发布时间】:2014-06-07 02:55:35
【问题描述】:

我是来自外部世界的学生,之前没有任何编程经验。我一直在学习 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()

【问题讨论】:

  • 部分问题是您创建了不止一次的Tk 实例。 Tkinter 的设计使得Tk 的实例应该只有一次。您的代码似乎也有一些缩进错误。
  • 好的,谢谢!我会仔细检查缩进。您知道解决 Tk 问题的方法吗?同时我会尝试修复它,但如果您已经有解决方案,我将不胜感激。 :)
  • 如果您需要多个窗口,请使用Tk 创建第一个窗口,然后其余的需要是Toplevel 的实例。
  • 好的,谢谢! :) 现在两个窗口都打开了,但它告诉我全局名称 tkinter 没有定义……我会在完成 Bio 课后做更多的工作。感谢您对初学者的所有帮助和耐心。

标签: canvas tkinter python-3.3 fractals


【解决方案1】:

尝试定义大师:

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

如果您未定义主控,则此图像使用创建的第一个 Tk(),如果删除该 Tk,则没有要显示的图像。

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

【讨论】:

  • 当我尝试在函数调用中导入模块时遇到了同样的问题。错误消息一直显示,直到我定义(master = canvas)。感谢您发布此答案。
【解决方案2】:

好的,谢谢大家的意见!我设法通过将window = Tk() 更改为window = Toplevel 并将anchor = tkinter.NW 替换为anchor = NW 来修复它。现在它完全按照我的预期运行。完成输入GUI! :D

【讨论】:

    【解决方案3】:

    使用解决它

    做这些

    将 tkinter 导入为 tk

    window=tk.TK()

    【讨论】:

      猜你喜欢
      • 2022-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多