首页 > 解决方案 > 传递要在 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'

标签: pythonmatplotlibtkinter

解决方案


推荐阅读