python - 传递要在 tkinter 选项卡中绘制的图形
问题描述
我正在尝试有一个在 tkinter 中绘制图形的按钮。要绘制的图形是 matplotlib.image.AxesImage
当前代码只是绘制了一个空白图,我不知道为什么
谁能帮忙?
def plot_gui():
fig = plt.Figure(figsize=(6,5), dpi=100)
ax = fig.add_subplot(111)
chart_type = FigureCanvasTkAgg(fig, tab2)
ax = fo2.plotgas()
canvas = FigureCanvasTkAgg(ax,master=tab2)
#canvas.show()
canvas.get_tk_widget().grid(row=9,column=9)
#canvas.draw()
fo2.plotgas() 只是产生我试图显示的数字
编辑这里是最小的可运行示例
import math as m
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import tkinter as tk
import mpl_interactions.ipyplot as iplt
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.backends.backend_tkagg import NavigationToolbar2Tk
from tkinter import ttk
from ttkthemes import ThemedTk
class fo2():
def gas_absolute(T=1000,absolute=-12,P=1):
fO2 = (10**absolute)
R = 0.00198726
TK = T + 273.18
RK = (R*TK)
dG1 = (62.110326 -(2.1444460*10**-2)*(T) +(4.720325*10**-7)*(T**2) -(4.5574288*10**-12)*(T**3) -(7.3430182*10**-15)*(T**4))
K1 = m.exp(-dG1/(R*TK))
dG2 = (62.110326 +(7.3219457*10**-4)*(T) -(3.416474*10**-7)*(T**2) +(4.7858617*10**-11)*(T**3))
K2 = m.exp(-dG2/(R*TK))
Rm = (K1-(3*K1*fO2)-(2*fO2**(3/2)))/(2*K1*fO2 + fO2 + (fO2**(3/2)) + (fO2**(1/2)))
VolCO2 = 100/(1+Rm) # in percent CO2
return(VolCO2)
def plotgas(Tmin=800,Tmax=1300,fbottom=-16,ftop=-8,buff=[],Temp=1200,F=-11):
Dt=Tmax-Tmin
Df=100*np.abs(fbottom-ftop)
z=np.zeros((Dt,(Df)))
x=np.zeros((Dt,(Df)))
y=np.zeros((Dt,(Df)))
for i in range(Dt):
for j in range(Df):
t = Tmin+i
f = ftop-(j/100)
c = fo2.gas_absolute(t,f,1)
x[i,j]=t
y[i,j]=f
z[i,j]=c
z=np.rot90(z,k=4)
# f, (ax1,ax2) = plt.subplots(1, 2, figsize=(4,8))
# figt = ax1.imshow(x,cmap='tab20c')
# figf = ax2.imshow(y,cmap='tab20c')
# figure(num=2, figsize=(12, 8), dpi=480, facecolor='w', edgecolor='k')
fig = plt.imshow(z,extent=[Tmin,Tmax,fbottom,ftop],aspect=50,cmap='Greys')
plt.colorbar().set_label('Volume of $CO_2$')
plt.xlabel('Temperature $^\circ$C')
plt.ylabel('$fO_2$')
if 'FMQ' in buff:
plt.plot(np.linspace(Tmin,Tmax),fo2.FMQ(np.linspace(Tmin,Tmax)),color='C0',lw=1,ls='-',label='FMQ')
if 'NNO' in buff:
plt.plot(np.linspace(Tmin,Tmax),fo2.NNO(np.linspace(Tmin,Tmax)),color='C1',lw=1,ls='--',label='NNO')
if 'IW' in buff:
plt.plot(np.linspace(Tmin,Tmax),fo2.IW(np.linspace(Tmin,Tmax)),color='C2',lw=1,ls=':',label='IW')
if 'CCO' in buff:
plt.plot(np.linspace(Tmin,Tmax),fo2.CCO(np.linspace(Tmin,Tmax)),color='C3',lw=1,ls='-',label='COO')
if 'CoCoO' in buff:
plt.plot(np.linspace(Tmin,Tmax),fo2.CoCoO(np.linspace(Tmin,Tmax)),color='C4',lw=1,ls='--',label='CoCoO')
if 'MH' in buff:
plt.plot(np.linspace(Tmin,Tmax),fo2.MH(np.linspace(Tmin,Tmax)),color='C5',lw=1,ls=':',label='MH')
plt.axvline(x=Temp, color='r',lw=1)
plt.axhline(y=F, color='r',lw=1)
plt.legend()
plt.xlim(Tmin,Tmax)
plt.ylim(fbottom,ftop)
return fig
root = ThemedTk(theme='clam')
#root = tk.Tk()
root.title('Oxygen Fugacity')
root.geometry("500x400")
style = ttk.Style(root)
style.theme_use('scidpurple')
tabs = ttk.Notebook(root)
tab1 = ttk.Frame(tabs)
tab2 = ttk.Frame(tabs)
tab3 = ttk.Frame(tabs)
tab4 = ttk.Frame(tabs)
tabs.add(tab1, text ='Buffers')
tabs.add(tab2, text ='Gas Mixes')
tabs.add(tab3, text ='Plotting')
tabs.add(tab4, text ='Measure')
tabs.grid(row=0,column=0)
def gasmix_abs_GUI():
T = Temp_input_tab2_abs.get()
fug = fo2_input_tab2_abs.get()
volco2output=str(round(fo2.gas_absolute(T,fug),3))
tk.Label(tab2,text=volco2output).grid(row=5,column=1,padx=(10,10),pady=(0,10))
def plot_gui():
fig = plt.Figure(figsize=(6,5), dpi=100)
ax = fo2.plotgas()
canvas = FigureCanvasTkAgg(ax,master=tab2)
canvas.show()
canvas.grid(row=9,column=9)
buffers = ['NNO','FMQ','IW','MH','CoCoO','CCO']
plot = ttk.Button(tab2, text='Plot', command=lambda: plot_gui()).grid(row=7,column=1,padx=(10,10),pady=(0,10))
root.mainloop()
错误是
AttributeError: 'AxesImage' object has no attribute 'set_canvas'