canvas tkinter python-3.3 fractals

canvas - Tkinter crea error de función de imagen(pyimage1 no existe)



python-3.3 fractals (2)

Soy un estudiante del mundo exterior sin experiencia previa en programación. He estado aprendiendo Python como una extensión de mi clase de matemática. He estado intentando crear un programa que genere fractales usando Tkinter. El código funciona bien por sí mismo, pero la inclusión de una GUI de entrada de usuario causa un error:

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

El código en sí está abajo. Tenga en cuenta que el error no aparece hasta que se canvas.create_image línea canvas.create_image . Si hay otra información que pueda proporcionar, házmelo saber. ¡Gracias! :)

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


De acuerdo, ¡gracias por la entrada, gente! anchor = tkinter.NW solucionarlo cambiando la window = Tk() en la window = Toplevel y reemplazando anchor = tkinter.NW para anchor = NW . Ahora funciona exactamente como lo pretendí. ¡Enciende para terminar la GUI de entrada! :RE


Pruébalo y define un maestro:

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

Si no define un maestro, esta imagen usa el primer Tk() que se crea y si ese Tk se elimina no hay imagen para mostrar.

Dime si funciona, supongo.