首先,如果您发现变量名不是英语,我很抱歉,因为英语不是我的第一语言,使用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>
目前没有回答
相关问题 更多 >
编程相关推荐