html中地图的绘制toolbars,tkinter内嵌Matplotlib系列(二)之函数曲线绘制

目录

前言

前一章节,我们解读了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)框架图解:

a14dce1af99a7ffed0192ea973d3329e.png

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来运行。

f9d57d1eb33cb939119c14a9ba4b3196.png

(五)项目下载:

作者:Mark

日期:2019/02/15 周五

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

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

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

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

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

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

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

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

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

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

Makefile所有内嵌函数

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

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

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

Python3基础 内嵌函数 简单示例

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

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

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

随机推荐

Java--Stream,NIO ByteBuffer,NIO MappedByteBuffer性能对比

目前Java中最IO有多种文件读取的方法,本文章对比Stream,NIO ByteBuffer,NIO MappedByteBuffer的性能,让我们知道到底怎么能写出性能高的文件读取代码. pack ...

Android下Cocos2d创建HelloWorld工程

最近在搭建Cocos2d的环境,结果各种问题,两人弄了一天才能搞好一个环境-! -_-!! 避免大家也可能会遇到我这种情况,所以写一个随笔,让大家也了解下如何搭建吧- 1.环境安装准备 下载 tadp ...

MySQL Workbench “Error Code: 1175” 的解决方法

转自:http://www.linuxidc.com/Linux/2012-04/59333.htm 当用MySQL Workbench进行数据库的批量更新时,执行一个语句会碰到以下错误提示: Err ...

[phonegap]安装phonegap

下载nodejs,安装,单nodejs4.0.0 x64编译时,还需要python2.6 or python2.7: 参考怎么安装python2.7:            http://jingya ...

Android apk的安装、卸载、更新升级(通过Eclipse实现静默安装)

一.通过Intent消息机制发送消息,调用系统应用进行,实现apk的安装/卸载 . (1) 调用系统的安装应用,让系统自动进行apk的安装 String fileName = "/data/ ...

Core知识整理

概述 Commond-Line ASP.NET结构文件 Startup 配置文件 中间件和依赖注入 依赖注入原理 框架自带的依赖注入(IServiceCollection) 依赖注入生命周期 依赖注入 ...

Git之右键没有Git Bash Here的解决办法

1.Win+R 打开运行输入regedit 回车打开注册表 2.找到[HKEY_CLASSES_ROOT\Directory\Background]. 3.在[Background]下如果没有[she ...

EF 踩过的坑

ef + mysql-8.0.12-winx64 这个版本的mysql,当一个类为树型结构,会迁移报错. 数据迁移提示:No connection string named 'TaoBaoEntiti ...

洛谷 P1342 请柬(SPFA)

题目描述 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣传剧院,尤其是古色古香的喜剧片.他们已经打印请帖和所有必要的信息和计划.许多学生被雇来分发这些请 ...

BNU Concentric Rings

http://www.bnuoj.com/bnuoj/problem_show.php?pid=16030 Concentric Rings   There are several different ...

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值