使用Matplotlib绘制长方体,用户在Flask中输入

2024-05-02 17:01:43 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,如果您发现变量名不是英语,我很抱歉,因为英语不是我的第一语言,使用flask和html的python代码的目的是在本地创建一个计算器web。计算器工作得很好,但我想多做一点,我想从用户输入中获取长度、宽度、高度,正如你在代码和html中看到的那样,并绘制它,因为这是一个水族馆,我想制作一个长方体,我已经编写了绘制长方体的代码,它工作得很好,我在jupyter中单独测试了它,但是,当我把它与前面的代码放在一起时,即使我使用了plt.savefig(),图像也没有保存。当我将它嵌入到输出下面的html中时,除了图像占位符外,它没有显示任何内容,这几乎是好的

所以我想画长方体(很成功)——>;将打印保存到图像(该图像不起作用)-->;然后把图像放在烧瓶框里

我的代码有什么问题吗? 我在代码中使用了plt.show(),效果非常好,因为当我把输入放在flask框架中时,数字会弹出,所以我认为这是一个好的迹象,但这对我来说有点破坏了计算器,因为当我运行它时,我的命令promp突然给了我这个error: Starting a Matplotlib GUI outside of the main thread will likely fail.

任何帮助都将不胜感激

这是我的密码

from flask import Flask, render_template,request
import math
import math
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt
import io
import base64

app=Flask(__name__)

@app.route('/')
def main():
    return render_template('kel3aquarium.html')


@app.route('/send', methods=['POST'])
def send():
    if request.method=='POST':
        length=request.form['length']
        width=request.form['width']
        height=request.form['height']
        safety=request.form['safety']
        water=request.form['watertype']
        if safety == '0':
            s=1.0
        elif safety =='1':
            s=2.0
        elif safety=='2':
            s=3.0
        elif safety=='3':
            s=4.0
        elif safety=='4':
            s=5.0
        elif safety=='5':
            s=6.0
        elif safety=='6':
            s=7.0
        elif safety=='7':
            s=8.0
        elif safety=='8':
            s=9.0
        elif safety=='9':
            s=10.0
        
        if water=='0':
            rho=10**3
        elif water=='1':
            rho=1025

        l=float(length)
        w=float(width)
        h=float(height)
        T=19.2
        bmax=T/s
        def side(l,h):
            a=l/h
            if a>=0.0 and a<0.5:
                beta=0.085
            elif a>=0.5 and a<0.666:
                beta=0.085
            elif a>=0.66 and a<1.0:
                beta=0.1156
            elif a>=1.0 and a<1.5:
                beta=0.16
            elif a>=1.5 and a<2.0:
                beta=0.26
            elif a>=2.0 and a<2.5:
                beta=0.32
            elif a>=2.5 and a<3.0:
                beta=0.35
            elif a>=3.0:
                beta=0.37
            t=math.sqrt(beta*10**(-8)*rho*h**3/bmax)
            sisi=round(t,1)
            return sisi

        def bottom(l,w):
            b=float(l/w)
            if b>=1.0 and b<1.5:
                beta=0.453
            elif b>=1.5 and b<2.0:
                beta=0.5172
            elif b>=2.0 and b<2.5:
                beta=0.5688
            elif b>=2.5 and b<3.0:
                beta=0.6102
            elif b>=3.0:
                beta=0.7134
            t=math.sqrt(beta*10**(-8)*rho*h*w**2/bmax)
            dasar=round(t,1)
            return dasar

        def gambar(l,w,h):
            gambar=io.BytesIO()
            l=float(length)
            w=float(width)
            h=float(height)
            def cuboid_data(o,size):
                size=(l,w,h)
                x = [[o[0], o[0] + l, o[0] + l, o[0], o[0]],[o[0], o[0] + l, o[0] + l, o[0], o[0]],[o[0], o[0] + l, o[0] + l, o[0], o[0]],[o[0], o[0] + l, o[0] + l, o[0], o[0]]]
                y = [[o[1], o[1], o[1] + w, o[1] + w, o[1]], [o[1], o[1], o[1] + w, o[1] + w, o[1]],[o[1], o[1], o[1], o[1], o[1]],[o[1] + w, o[1] + w, o[1] + w, o[1] + w, o[1] + w]]
                z = [[o[2], o[2], o[2], o[2], o[2]],[o[2] + h, o[2] + h, o[2] + h, o[2] + h, o[2] + h],[o[2], o[2], o[2] + h, o[2] + h, o[2]],[o[2], o[2], o[2] + h, o[2] + h, o[2]]]
                return np.array(x), np.array(y), np.array(z)
            def plotCubeAt(pos=(0,0,0), size=(l,w,h), ax=None,**kwargs):
                if ax !=None:
                    X,Y,Z = cuboid_data(pos,size)
                    ax.plot_surface(X, Y, Z, color=(round(100/256,1),round(218/256,1),round(255/256,1)), **kwargs)
            positions = (0,0,0)
            sizes = (l,w,h)
            fig = plt.figure()
            ax = fig.gca(projection='3d')
            plotCubeAt(pos=positions, size=sizes, ax=ax)
            plt.axis('off')
            plt.grid(b=None)
            plt.savefig(gambar,format='png')
            plt.show()
            gambar.seek(0)
            plot_url=base64.b64encode(gambar.getvalue()).decode()
            return '<img src="data:image/png;base64,{}">'.format(plot_url)
        a=gambar(l,w,h)
        rekomendasi1=side(l,h)
        rekomendasi2=bottom(l,w)
    return render_template('kel3aquarium.html', rekomendasi1=rekomendasi1,rekomendasi2=rekomendasi2,a=a)`

和我的html:

<!DOCTYPE html>
<html lang='en'>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Kelompok 3 Kalkulator Akuarium</title>
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/skeleton/2.0.4/skeleton.min.css">
</head>
<body>
    <h2>Calculator Glass Thickness Aquarium</h2>
    <br>
    <div class="container">
        <h4>Type/Material</h4>
    </div>
    <div class="container">
      <form action="/send" method="POST">
        <label for="Operation">Water Type</label>
        <select class="u-full-width" name="watertype">
          <option value="0">Freshwater</option>
          <option value="1">Saltwater</option>
        </select>

        <label for="Operation">Material</label>
        <select class="u-full-width" name="material">
          <option value="0">Glass</option>
          <option value="1">Acrylic Glass</option>
        </select>

        <label for="Operation">Glass Type</label>
        <select class="u-full-width" name="glasstype">
          <option value="0">Laminated Glass</option>
          <option value="1">Annealed Glass</option>
          <option value="2">Tempered Glass</option>
        </select>

    <h4>Geometry and Safety Factor</h4>
     <form action="/send" method="POST">
       <label for="Number One">Length</label>
       <input
         type="text"
         placeholder="Length (cm)"
         class="u-full-width"
         name="length"
       />

        <label for="Number Two">Width</label>
        <input
          type="text"
          placeholder="Width (cm)"
          class="u-full-width"
          name="width"
        />

        <label for="Number Two">Height</label>
        <input
          type="text"
          placeholder="Height (cm)"
          class="u-full-width"
          name="height"
        />

        <label for="Operation">Safety Factor</label>
        <select class="u-full-width" name="safety">
          <option value="0">1.0</option>
          <option value="1">2.0</option>
          <option value="2">3.0</option>
          <option value="3">4.0</option>
          <option value="4">5.0</option>
          <option value="5">6.0</option>
          <option value="6">7.0</option>
          <option value="7">8.0</option>
          <option value="8">9.0</option>
          <option value="9">10.0</option>
        </select>

        <input type="submit" value="Calculate!" id="calc_btn" />
<br>
{%if rekomendasi1%}<p>Rekomendasi ketebalan kaca untuk dinding akuarium : {{rekomendasi1}} mm </p>{%endif%}
{%if rekomendasi2%}<p>Rekomendasi ketebalan kaca untuk dasar akuarium : {{rekomendasi2}} mm </p>{%endif%}
<img src="data:image/png;base64, {{ plot_url }}">
</body>
</html>