目录

前言

前一章节,我们解读了tkinter内嵌Matplotlib的教程,了解其内嵌的原理,就是在tkinter创建matplotlib的画布控件,再利用其返回的画布对象进行绘图,其他附加功能,使用tkinter控件实现。

(一)对matplotlib画布的封装:

(1)说明:

我们希望对官方的实例代码进行封装成一个函数,并返回一个画布对象,外部再调用该函数,并获取画布对象,进行绘制操作。

(2)封装后的代码:

"""
画布文件,实现绘图区域的显示,并返回画布的对象。
"""
import tkinter as tk # 创建画布需要的库
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
# 创建工具栏需要的库
from matplotlib.backends.backend_tkagg import NavigationToolbar2Tk
# 快捷键需要的库
from matplotlib.backend_bases import key_press_handler
# 导入画图常用的库
from matplotlib.figure import Figure def plot_fun(root):
"""
该函数实现的是内嵌画布,不负责画图,返回画布对象。
:param root:父亲控件对象, 一般是容器控件或者窗体
:return: 画布对象
"""
# 画布的大小和分别率
fig = Figure(dpi=100)
axs = fig.add_subplot(111) # 创建画布
canvas = FigureCanvasTkAgg(fig, master=root) # A tk.DrawingArea.
canvas.draw()
# 显示画布
canvas.get_tk_widget().pack() # 创建工具条
toolbar = NavigationToolbar2Tk(canvas, root)
toolbar.update()
# 显示工具条
canvas.get_tk_widget().pack() # 调用快捷键
def on_key_press(event):
key_press_handler(event, canvas, toolbar) canvas.mpl_connect("key_press_event", on_key_press) # 返回画布的对象
return axs

(二)思路分析:

1.需求说明:

(1)背景:

作为学生的我们,你是否有那么一个场景,唉……,这个数学函数好难求哦,要是知道它的图像这么画就好了。

(2)需求:

给出数学表达式,绘制出该数学表达式的函数曲线,一来可以观察函数的变化趋势,二来可以根据两条曲线的交点,来求解出方程的大致结果。

2.框架的设置:

(1)说明:

分模块编程,向来是众人所提倡的,再python里更是很好的实现。

再动手敲代码之前,我们先来大致的设置一下,小项目的框架。

(2)框架图解:

3.文件说明:

(1)main.py

主程序文件,负责程序的启动与结束和窗体的大致设置。

(2)widget.py

控件文件,负责程序控件的创建与布局

(3)figure.py

画布文件,实现绘图区域的显示,并返回画布的对象。

(4)plot.py

绘图文件,负责函数曲线的绘制

(三)各文件的源代码

1.main.py

"""
主程序文件,负责程序的启动与结束和窗体的大致设置。
""" import tkinter as tk
import widget def win_w_h(root):
"""
控制窗口的大小和出现的位置
:param root:
:return: 窗口的大小和出现的位置
"""
# 设置标题:
win.title("数学函数绘图") # 绘图区标签
label_plot = tk.Label(root, text="绘 图 区",
font=("微软雅黑", 10), fg="blue")
label_plot.place(relx=0.26, rely=0) label_func = tk.Label(root, text="功 能 区",
font=("微软雅黑", 10), fg="blue")
label_func.place(relx=0.75, rely=0)
# 获取屏幕的大小;
screen_height = root.winfo_screenheight()
screen_width = root.winfo_screenwidth()
# 窗体的大小
win_width = 0.8 * screen_width
win_height = 0.8 * screen_height
# 窗体出现的位置:控制的是左上角的坐标
show_width = (screen_width - win_width) / 2
show_height = (screen_height - win_height) / 2 # 返回窗体 坐标
return win_width, win_height, show_width, show_height win = tk.Tk()
# 大小 位置
win.geometry("%dx%d+%d+%d" % (win_w_h(win))) # 创建一个容器, 没有画布时的背景
frame1 = tk.Frame(win, bg="#c0c0c0")
frame1.place(relx=0.00, rely=0.05, relwidth=0.62, relheight=0.89) # 控件区
frame2 = tk.Frame(win, bg="#808080")
frame2.place(relx=0.62, rely=0.05, relwidth=0.38, relheight=0.89) # 调用控件模块
widget.widget_main(win, frame2)
win.mainloop()

2.widget.py

"""
控件文件,负责程序控件的创建与布局
"""
import tkinter as tk
# 对话框所需的库
import tkinter.messagebox as mb
# 画布文件
import figure
# 绘图文件
import plot def widget_main(win, root):
"""
负责程序控件的创建与布局
:param win: 主窗体的对象。
:param root: 绘图区的容器对象。
:return: 无
"""
# 控件区的容器对象
frame1 = None # ===========功能区============================
# 绘图的功能函数
def plot_f():
string = entry.get()
# 判断输入框是否为空
if string == "":
mb.showerror("提示", "没有输入值,请重新输入:")
else:
# 判断是否已经创建画布
if frame1==None:
mb.showerror("提示", "没有创建画布,不能画图,请先创建画布")
else:
axs = figure.plot_fun(frame1)
plot.plot_main(string, axs) # 清除的功能函数
def clear():
nonlocal frame1
entry.delete(0, "end")
if frame1==None:
mb.showerror("提示", "已经没有画布,无法清除画布")
else:
frame1.destroy()
frame1 = None # 创建画布的功能函数
def create():
nonlocal frame1
if frame1 != None:
mb.showerror("提示", "画布已经存在,请不要重复创建画布")
else:
frame1 = tk.LabelFrame(win, bg="#80ff80", text="画-----布", labelanchor="n", fg="green")
frame1.place(relx=0.00, rely=0.05, relwidth=0.62, relheight=0.95) # =============控件区======================
# 标签控件
label = tk.Label(root,
text="请输入含x的数学公式:",
font=("微软雅黑", 18),
fg="blue")
label.place(relx=0.2, rely=0.1) # 输入框
entry = tk.Entry(root, font=("华文楷体", 15))
entry.place(relx=0.1, rely=0.2, relwidth=0.8) # 创建画布区
btn_draw = tk.Button(root,
text="创建",
cursor="hand2",
width=10,
bg="orange",
relief="raised",
command=create
)
btn_draw.place(relx=0.1, rely=0.3) # 绘图按钮
btn_draw = tk.Button(root,
text="绘图",
cursor="hand2",
width=10,
bg="green",
relief="raised",
command=plot_f
)
btn_draw.place(relx=0.4, rely=0.3) # 清除按钮
btn_clear = tk.Button(root,
text="清除",
cursor="hand2",
width=10,
bg="yellow",
relief="raised",
command=clear
)
btn_clear.place(relx=0.7, rely=0.3)

3.figure.py

"""
画布文件,实现绘图区域的显示,并返回画布的对象。
"""
import tkinter as tk # 创建画布需要的库
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
# 创建工具栏需要的库
from matplotlib.backends.backend_tkagg import NavigationToolbar2Tk
# 快捷键需要的库
from matplotlib.backend_bases import key_press_handler
# 导入画图常用的库
from matplotlib.figure import Figure def plot_fun(root):
"""
该函数实现的是内嵌画布,不负责画图,返回画布对象。
:param root:父亲控件对象, 一般是容器控件或者窗体
:return: 画布对象
"""
# 画布的大小和分别率
fig = Figure(dpi=100)
axs = fig.add_subplot(111) # 创建画布
canvas = FigureCanvasTkAgg(fig, master=root) # A tk.DrawingArea.
canvas.draw()
# 显示画布
canvas.get_tk_widget().pack() # 创建工具条
toolbar = NavigationToolbar2Tk(canvas, root)
toolbar.update()
# 显示工具条
canvas.get_tk_widget().pack() # 调用快捷键
def on_key_press(event):
key_press_handler(event, canvas, toolbar) canvas.mpl_connect("key_press_event", on_key_press) # 返回画布的对象
return axs

4.plot.py

"""
绘图文件,负责函数曲线的绘制
"""
import numpy as np def plot_main(string, plt):
"""
负责函数曲线的绘制
:param string: 数学表达式
:param plt: 画布的对象
:return: 无
"""
list_expr = []
list_expr = string.split(",")
string1 = []
for sub_expr in list_expr:
string1.append(sub_expr)
x = np.linspace(-10, 10, 100)
y = []
num = string.count('x')
for i in x:
t = (i, ) * num
string = string.replace("x", "(%f)")
i = eval(string % t)
y.append(i)
plt.plot(x, y)
plt.grid(True)
plt.legend(labels=string1)

(四)文件结构

四个文件均处于同一个文件夹下,用main.py来运行。

(五)项目下载:

百度网盘下载

链接:https://pan.baidu.com/s/13G_hWqagxqHRkdHaYcxiQQ

提取码:codq

作者:Mark

日期:2019/02/15 周五

tkinter内嵌Matplotlib系列(二)之函数曲线绘制的更多相关文章

  1. tkinter内嵌Matplotlib系列(一)之解读官网教材

    目录 目录 前言 (一)小目标 1.首页卷面: 2.绘制一条函数曲线: 3.绘制多条曲线: (二)官方教材 1.对GUI框架的支持: 2.内嵌于tkinter的说明文档: (三)对官方教程的解读 目录 ...

  2. matlab-非线性方程求根函数及函数曲线绘制

    Matlab中提供了很多求解非线性方程(y=f(x))的函数,刚開始使用,真的很困惑.全部.这里依据matlab的help文档对这些函数做一些小小的总结 fsolve函数 用来求解非线性方程组:F(x ...

  3. 基于canvas二次贝塞尔曲线绘制鲜花

    canvas中二次贝塞尔曲线参数说明: cp1x:控制点1横坐标 cp1y:控制点1纵坐标 x: 结束点1横坐标 y:结束点1纵坐标 cp2x:控制点2横坐标 cp2y:控制点2纵坐标 z:结束点2横 ...

  4. 4.2Python数据处理篇之Matplotlib系列(二)---plt.scatter()散点图

    目录 目录 前言 (一)散点图的基础知识 (二)相关性的举例 ==1.正相关== ==1.负相关== ==1.不相关== (三)实战项目以一股票的分析 目录 前言 散点图是用于观测数据的相关性的,有正 ...

  5. Android画图系列(二)——自己定义View绘制基本图形

    这个系列主要是介绍下Android自己定义View和Android画图机制.自己能力有限.假设在介绍过程中有什么错误.欢迎指正 前言 在上一篇Android画图系列(一)--自己定义View基础中我们 ...

  6. Makefile所有内嵌函数

    一.文本处理函数以下是GNU make内嵌的文本(字符串)处理函数.1       $(subst FROM,TO,TEXT) 函数名称:字符串替换函数—subst. 函数功能:把字串“TEXT”中的 ...

  7. python 内嵌函数, 闭包, 函数装饰器

    一.  函数内嵌 闭包 在python中,函数可以作为返回值, 可以给变量赋值. 在python中, 内置函数必须被显示的调用, 否则不会执行. #!/usr/bin/env python #-*- ...

  8. Python3基础 内嵌函数 简单示例

    镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...

  9. WebBrowser内嵌页面的跨域调用问题

    很早之前我写过一篇Blog:网页通过External接口与WebBrowser交互,文中的交互其实只介绍了JS调用C++的部分,而C++调用JS由于微软自己的例子太多,那篇文章就没介绍,不过我最近遇到 ...

随机推荐

  1. springboot shiro开启注释

    shiroconfiguration中增加 @Bean public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceA ...

  2. 光盘作为yum源

    1.挂载光盘 mkdir /media/cdrom       //在/media下建立cdrom目录,默认情况是没有的  mount /dev/cdrom /mnt/cdrom2.进入 /etc/y ...

  3. mybatis教程3(映射文件)

    MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% ...

  4. SpringMVC入门学习(一)

    SpringMVC入门学习(一) ssm框架 spring  SpringMVC是一个Java WEB框架,现在我们知道Spring了,那么,何为MVC呢? MVC是一种设计模式,其分为3个方面 mo ...

  5. Java设计模式学习记录-GoF设计模式概述

    前言 最近要开始学习设计模式了,以前是偶尔会看看设计模式的书或是在网上翻到了某种设计模式,就顺便看看,也没有仔细的学习过.前段时间看完了JVM的知识,然后就想着JVM那么费劲的东西都看完了,说明自己学 ...

  6. laravel 制作购物车流程

    ① 购入车数据如何存放? 创建数据表 用户ID 购物时间 缺点: 对服务器有压力. 方案: 定时删除 coolie中: 缺点: 数据不能跨客户端 优点:不会对服务器产生压力 放东西和数量 显示购物车 ...

  7. kali网卡配置文件

    kali的网卡配置文件为/etc/network/interfaces 下面定义了lo.eth0和eth1的配置 auto lo # auto表示开机启动该网卡设备 iface lo inet loo ...

  8. 记一次安装Nginx+php-fpm安装后无法解析.php文件,状态码200,但显示空白页

    安装环境: Nginx:Nginx1.12.2 PHP:PHP 7.2 系统:CentOS 7.4 安装方式: Nginx与PHP都是yum安装的,具体步骤: 1.安装epel源再安装Nginx: r ...

  9. Ubuntu安装与配置

    四.ubuntu下生成ngrok服务器主程序 4.1.步骤与先决条件 如果你只是临时穿透或调试用,到第三步基本就可以了,但如果想作为稳定的商业服务,用别人的服务器还是受制于人,这里我们准备搭建自己的n ...

  10. c#连接访问数据库(菜鸡篇)

    C#如何访问数据库(小白篇) 刚入坑不久学习的路上还是遇到了不小的问题,昨天学习C#的时候需要连接数据库获取数据. 网上有很多这样的文章,说实话对于我这样的小白还真是有点难理解,经过一番周折总算是了解 ...