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.