PySimpleGui是一个Python的Gui库,比较接地气易上手。所以我就简单做了个计算插值多项式的程序试试手。第一次写UI代码,c++高手勿扰。
-
运行程序,首先输入插值节点的数量;
-
然后输入各个节点的坐标,图中的数据正好是我这周助教课的作业;
- 得到插值多项式结果;
大概说一下注意点:
- python并不自带PySimpleGui这个库,所以要利用pip或conda安装,即在cmd中运行
pip install PySimpleGUI
- 创建窗口
import PySimpleGUI as sg
form = sg.FlexForm('begin with a blank form')
- 规划用户界面,将gui按行切分; 第一行文本框和输入框,第二行提交框和取消框;
layout = [
[sg.Text('number', size=(5,1)), sg.InputText('')],
[sg.Submit(), sg.Cancel()]
]
- 执行点击操作;
button, values = form.Layout(layout).Read()
- 关闭窗口
form.Close()
- 其他配件
sg.OK() # ok键
sg.InputCombo(['男','女','隐私'],auto_size_text=True) # 下拉选项
sg.Slider(range=(1,10)) # 滑动条及其范围
sg.Radio('游泳',group_id=1),sg.Radio('跑步',group_id=2),sg.Radio('篮球',group_id=3) # 按钮
sg.Checkbox('是'),sg.Checkbox(否') # 选择框
sg.FolderBrowse(target='input') # 文件夹浏览
sg.ProgressBar(100,orientation = 'h', size=(20,20),key='progressbar') # 进度条
- 插值计算,直接调用scipy的插值库函数;
from scipy.interpolate import lagrange
result = lagrange(x,y)
全部代码
"""
Created on 2019-03-16
@author:Jupiter
"""
import PySimpleGUI as sg
from scipy.interpolate import lagrange
# 修改插值多项式格式
def change(ret):
length,nret = ret.order,'y='
if length > 1:
nret += str(round(ret.c[0],4))+'x^'+str(length)
for i in range(length-2):
if ret.c[i+1]>0:
nret += '+' + str(round(ret.c[i+1],4))+'x^'+str(length-i-1)
else :
nret += str(round(ret.c[i+1],4))+'x^'+str(length-i-1)
if length >= 1:
if ret.c[-2] >= 0:
nret += '+'+str(round(ret.c[-2],4))+'x'
else :
nret += str(round(ret.c[-2],4))+'x'
if ret.c[-1] >= 0:
nret += '+'+str(round(ret.c[-1],4))
else :
nret += str(round(ret.c[-1],4))
return nret
# 获取插值节点数量
form1 = sg.FlexForm('输入插值节点数量(n≥2)')
layout = [
#[sg.InputCombo(['男','女','隐私'],auto_size_text=True)],
[sg.Text('number', size=(5,1)), sg.InputText('')],
[sg.Submit(), sg.Cancel()]
]
button, values = form1.Layout(layout).Read()
print(button, values[0])
form1.Close()
# 获取插值节点坐标
form2= sg.FlexForm('输入节点坐标')
layout = []
for i in range(int(values[0])):
layout.append([sg.Text('(x,y)', size=(3,2)),sg.Input(),sg.Input()])
layout.append( [sg.Text('Author:Jupiter')])
layout.append( [sg.Submit(), sg.Cancel()])
button, values = form2.Layout(layout).Read()
form2.Close()
x,y = [],[]1
for i in range(len(values)//2):
x.append(float(values[i*2]))
y.append(float(values[i*2+1]))
print(button,x,y)
#ret = lagrange(x,y)
ret = change(lagrange(x,y))
# 输出多项式插值结果
form3= sg.FlexForm('多项式插值结果')
layout = [[sg.Text('插值多项式',size=(10,1))]]
for i in range(len(x)):
layout.append([sg.Text('(x,y)'),sg.Text(x[i]),sg.Text(y[i])])
layout.append([sg.Text('------------------------------------')])
layout.append([sg.Text(ret)])
layout.append([sg.OK(),sg.Cancel(),sg.Text('Author:Jupiter')])
button, values = form3.Layout(layout).Read()