python从原始代码(matplotlib)到加图形界面(tkinter),最后到制作软件(一元二次方程软件)(如何做一个python软件)

Posted 亭下雨荷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python从原始代码(matplotlib)到加图形界面(tkinter),最后到制作软件(一元二次方程软件)(如何做一个python软件)相关的知识,希望对你有一定的参考价值。

一、基本介绍

1.使用的python开发工具是Anaconda中的Spyder

这个工具比较好用,安装步骤直接百度即可。
2.原始代码用到了几个库,用到了matplotlib库等,百度添加相应的库即可。
3.原始代码的主要流程:main函数------>生成界面------>点击按钮调用输入函数------->调用一元二次方程代码函数。

二、具体代码

这样就得到了图形界面与代码的结合。

import tkinter as tk
import matplotlib.pyplot as plt
from mpl_toolkits.axisartist.axislines import SubplotZero
import numpy as np
import math

def parabola(d):
    plt.rcParams['font.sans-serif'] = ['SimHei']    # 用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False      # 用来正常显示负号
     
    """生成画布"""
    fig = plt.figure(1, (10, 10))       # 最终生成的图片大小
    axis = SubplotZero(fig, 1, 1, 1)    # 把画布分成1 * 1的格子, 把图形放在第1格
    fig.add_subplot(axis)
     
    """新建坐标轴"""
    axis.axis["xzero"].set_visible(True)
    axis.axis['yzero'].set_visible(True)
     
    """生成坐标箭头"""
    axis.axis["xzero"].set_axisline_style("-|>")
    axis.axis["yzero"].set_axisline_style("-|>")
     
    axis.axis["top", "right", "left", "bottom"].set_visible(False)  # 隐藏默认坐标轴
    axis.grid(True, linestyle='-.')                                 # 设置网格样式
     
    """设置图形绘制范围"""
    x_boundary = 20  # 图形的边界区间设置为x_boundary 的绝对值
    granularity = 0.01
    x = np.arange(-x_boundary, x_boundary, granularity)
    a, b, c = list(map(float, d.split(' ')))    # 输入a、b、c的值
    y = a * pow(x, 2) + b * x + c  # 计算y的值
    axis.plot(x, y)
    # 添加标题
    plt.title('y  =  ax^2  +  bx  +  c\\na={:.2f}, b={:.2f}, c={:.2f}'.format(a, b, c),
              bbox=dict(facecolor='g', edgecolor='blue', alpha=0.65), fontsize='20')
     
    """根据a、b、c的值画图"""
    if a == 0: # 如果a == 0, 画一条y = bx + c的线, 并提示a不要为0
        plt.text(0, 0, r'$this\\ is\\ a\\ line\\ !!!$', fontdict={'size': '20', 'color': 'red'})
        plt.text(0, -1, r'$please\\ make\\ sure\\ the\\ first\\ number\\ is\\ not\\ 0!!!$', fontdict={'size': '20', 'color': 'red'})
        # 如果a == 0,则没有极值, 坐标轴默认大小
        extremum_x = 0
        extremum_y = 0
    else:
        # 计算极值点
        extremum_x = - (b / (2 * a))
        extremum_y = (4 * a * c - pow(b, 2)) / (4 * a)
        # 标注极值点
        plt.scatter(extremum_x, extremum_y)
        # 根据a的符号更新描述信息
        if a > 0:
            point_describe = "小"
        else:
            point_describe = "大"
        # 距离极值点1个单位打印极值点描述
        plt.text(extremum_x, extremum_y - (a / a.__abs__()),
                 '(%.2f, %.2f)是极%s值点' % (extremum_x, extremum_y, point_describe),
                 fontdict={'size': '18', 'color': 'b'})
        # 如果等于0的解存在, 则求根
        delta = pow(b, 2) - 4 * a * c
        if delta < 0:  # 没有实根
            # 距离极值点1个单位打印无实根
            plt.text(extremum_x, extremum_y - 2 * (a / a.__abs__()),
                     '此方程没有实根',
                     fontdict={'size': '18', 'color': 'red'})
        elif delta == 0:  # 有重根
            x1 = (-b + math.sqrt(delta)) / (2 * a)
            # 标注y = 0的点
            plt.scatter(x1, 0)
            # 距离实根1个单位打印坐标
            plt.text(x1, 0 + 1 * (a / a.__abs__()),
                     '(%.2f, 0)是唯一实根' % x1,
                     fontdict={'size': '18', 'color': '#0cf'})
        else:  # 有两个实根
            x1 = (-b + math.sqrt(delta)) / (2 * a)
            x2 = (-b - math.sqrt(delta)) / (2 * a)
            # 标注y = 0的点
            plt.scatter(x1, 0)
            plt.scatter(x2, 0)
            # 距离实根1个单位打印第1个根的坐标
            plt.text(x1, 0 - 1 * (a / a.__abs__()),
                     '(%.2f, 0)是第一个根' % x1,
                     fontdict={'size': '18', 'color': '#000'})
            # 距离实根1个单位打印第2个根的坐标
            plt.text(x2, 0 + 1 * (a / a.__abs__()),
                     '(%.2f, 0)是第二个根' % x2,
                     fontdict={'size': '18', 'color': '#000'})
     
    """根据极值点动态调整坐标轴范围"""
    axis.set_xlim([extremum_x - 10, extremum_x + 10])
    axis.set_ylim([-extremum_y.__abs__() - 10, extremum_y.__abs__() + 10])
    plt.text(extremum_x + 10, 0.5, 'x', fontdict={'size': '18', 'color': '#000'})
    plt.text(0.5, extremum_y.__abs__() + 9.2, 'y', fontdict={'size': '18', 'color': '#000'})
     
    """显示图片"""
    plt.show()
 
def control_entry():
    #获取输入值
    d = entry_parabola.get()
    #调用函数
    parabola(d)
    
    
if __name__ == '__main__':
    # 初始化
    root = tk.Tk()
    # 图形界面的标题
    root.title('一元函数画图')
    # 窗口的尺寸,分别对应的宽和高
    root.geometry('250x100')
    # 文本提示
    label_parabola = tk.Label(root, text='y=ax^2+bx+c,请输入a,b,c的值,用空格隔开')
    # 随机数展示的entry
    entry_parabola = tk.Entry(root)
    # 生成随机数的按钮,按下按钮触发函数
    #执行标签代码
    label_parabola.pack()
    #执行输入框代码
    entry_parabola.pack()
    
    button_gen = tk.Button(
    root,
    text='点击按钮',
    command=control_entry)
    
    #执行按钮代码
    button_gen.pack()
    
    # 保持图形界面不被销毁
    root.mainloop()

三、制作软件

1.直接百度:python打包 即可。
打包完成后,后缀为exe文件,如图:

2.软件演示

四、总结

如此就可以制作一个简单的python软件。界面做的更美观些,多添加几个函数,就可以做成我的博客中的基本函数画图软件。


以上是关于python从原始代码(matplotlib)到加图形界面(tkinter),最后到制作软件(一元二次方程软件)(如何做一个python软件)的主要内容,如果未能解决你的问题,请参考以下文章

将轮廓(MatplotLib 或 OpenCV)转换为与原始大小相同的图像

Python数据可视化利器Matplotlib从入门到高级4

matplotlib 刻度线的位置和数值的动态调整

python matplotlib 从函数更新散点图

Matplotlib“实时”在python中绘图

Matplotlib 箱线图使用预先计算(汇总)统计