This is my first python project so I understand that this problem may seem a bit stupid.
I am trying to create a Mandelbrot renderer. I am piecing code together from tutorials and code that I understand to make something.
So basically I have all the maths and the basic functions of the GUI for the renderer but I can't get the matplotlib graph to actually graph inside the tkinter GUI.
The matplolib display part is actually a function that needs mandelbrot_image(-0.8,-0.7,0,0.1,cmap='hot')
to run. If that code is introduced, the Mandelbrot set is plotted, but in a different matplotlib window.
Here is all my code, I thank you in advance and once again I apologize.
#big thanks and credit goes to to Jean Puget from IBM, SentDex from pythonprogramming.net, and stackoverflow #for teaching me how to use python and inspiring much of this following codeimport matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figureimport tkinter as tk
from tkinter import ttkimport numpy as np
from numba import jitfrom matplotlib import pyplot as plt
from matplotlib import colors#maths and display code derived/inspired from Jean Francois Puget
#https://www.ibm.com/developerworks/community/blogs/jfp/entry/My_Christmas_Gift?lang=en
@jit
def mandelbrot(z,maxiter,horizon,log_horizon):c = zfor n in range(maxiter):az = abs(z)if az > horizon:return n - np.log(np.log(az))/np.log(2) + log_horizonz = z*z + creturn 0@jitdef mandelbrot_set(xmin,xmax,ymin,ymax,width,height,maxiter):horizon = 2.0 ** 40log_horizon = np.log(np.log(horizon))/np.log(2)r1 = np.linspace(xmin, xmax, width)r2 = np.linspace(ymin, ymax, height)n3 = np.empty((width,height))for i in range(width):for j in range(height):n3[i,j] = mandelbrot(r1[i] + 1j*r2[j],maxiter,horizon, log_horizon)return (r1,r2,n3)#Display setup
fig = Figure()
ax = fig.add_subplot(111)
xmin = -2.0
xmax = 0.5
ymin = -1.25
ymax = 1.25
cmap='hot'
# width=20
# height=20
# maxiter=1000
# gamma=0.3def mandelbrot_image(xmin,xmax,ymin,ymax,width=10,height=10,\maxiter=1000,cmap='jet',gamma=0.3):dpi = 80img_width = dpi * widthimg_height = dpi * heightx,y,z = mandelbrot_set(xmin,xmax,ymin,ymax,img_width,img_height,maxiter)fig, ax = plt.subplots(figsize=(width, height),dpi=72)ticks = np.arange(0,img_width,3*dpi)x_ticks = xmin + (xmax-xmin)*ticks/img_widthplt.xticks(ticks, x_ticks)y_ticks = ymin + (ymax-ymin)*ticks/img_widthplt.yticks(ticks, y_ticks)ax.set_title(cmap)norm = colors.PowerNorm(gamma)ax.figshow(z.T,cmap=cmap,origin='lower',norm=norm)LARGE_FONT= ("Verdana", 12)class base(tk.Tk):def __init__(self, *args, **kwargs):tk.Tk.__init__(self, *args, **kwargs)tk.Tk.iconbitmap(self, "iconz.ico")tk.Tk.wm_title(self, "Mandelbrot Renderer")container = tk.Frame(self)container.pack(side="top", fill="both", expand = True)container.grid_rowconfigure(0, weight=1)container.grid_columnconfigure(0, weight=1)menubar = tk.Menu(container)filemenu = tk.Menu(menubar, tearoff=0)filemenu.add_separator()filemenu.add_command(label="Exit", command=quit)menubar.add_cascade(label="File", menu=filemenu)self.frames = {}for F in (StartPage, MainPage, Donate):frame = F(container, self)self.frames[F] = frameframe.grid(row=0, column=0, sticky="nsew")self.show_frame(StartPage)def show_frame(self, cont):frame = self.frames[cont]frame.tkraise()class StartPage(tk.Frame):def __init__(self, parent, controller):tk.Frame.__init__(self,parent)label = tk.Label(self, text="Start Page", font=LARGE_FONT)label.pack(pady=10,padx=10)button = ttk.Button(self, text="Lets Begin",command=lambda: controller.show_frame(MainPage))button.pack()class Donate(tk.Frame):def __init__(self, parent, controller):tk.Frame.__init__(self, parent)label = tk.Label(self, text="Donate", font=LARGE_FONT)label.pack(pady=10,padx=10)button1 = ttk.Button(self, text="Back",command=lambda: controller.show_frame(MainPage))button1.pack()class MainPage(tk.Frame):def __init__(self, parent, controller):tk.Frame.__init__(self, parent)label = tk.Label(self, text="Graph Page!", font=LARGE_FONT)label.pack(pady=10,padx=10)button1 = ttk.Button(self, text="Back to Home",command=lambda: controller.show_frame(StartPage))button1.pack()button2 = ttk.Button(self, text="Donate",command=lambda: controller.show_frame(Donate))button2.pack()canvas = FigureCanvasTkAgg(fig, self)canvas.show()canvas.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)toolbar = NavigationToolbar2TkAgg(canvas, self)toolbar.update()canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=True) app = base()
app.geometry ("800x600")
app.mainloop()