Python图形编程探索系列-09-tkinter与matplotlib结合案例
案例1
案例来自于:https://bbs.csdn.net/topics/390326088
代码示例:
import matplotlib
matplotlib.use('TkAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from tkinter import *
root = Tk()
root.title("tkinter and matplotlib")
f = Figure(figsize=(5, 4), dpi=100)
f_plot = f.add_subplot(111)
def other_picture_alg(): #数据相关的算法应该与plot分离开
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [3, 6, 9, 12, 15, 18, 15, 12, 15, 18]
return x, y
def draw_picture():
f_plot.clear()
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] #关于数据的部分可以提取出来
y = [3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
f_plot.plot(x, y)
canvs.draw()
def draw_picture2():
f_plot.clear()
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] #关于数据的部分可以提取出来
y = [2, 4, 6, 8, 10, 8, 6, 4, 2, 0]
f_plot.plot(x, y)
canvs.draw()
def draw_picture3():
f_plot.clear()
x, y = other_picture_alg() # 使用由算法生成的数据,可以避免重复的运算过程
f_plot.plot(x, y)
canvs.draw()
canvs = FigureCanvasTkAgg(f, root)
canvs.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1)
Button(root, text='pic', command=draw_picture).pack()
Button(root, text='pic2', command=draw_picture2).pack()
Button(root, text='pic3', command=draw_picture3).pack()
root.mainloop()
运行结果:



案例2
这个案例网上流传的比较多,这里只是一个参考例子,原始版本看代码示例2。
代码示例1:
import tkinter as tk
import matplotlib
from numpy import arange, sin, pi
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.backends.backend_tkagg import NavigationToolbar2TkAgg
from matplotlib.backend_bases import key_press_handler
from matplotlib.figure import Figure
# matplotlib.use('TkAgg')
root = tk.Tk()
root.title("matplotlib in tkinter")
# set a figure
f = Figure(figsize=(5, 4), dpi=100)
a = f.add_subplot(111)
t = arange(0.0, 3.0, 0.01)
s = sin(2*pi*t)
a.plot(t, s)
canvas = FigureCanvasTkAgg(f, master=root)
canvas.show()
canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)
toolbar = NavigationToolbar2TkAgg(canvas, root)
toolbar.update()
def on_key_event(event):
print('you press %s' %event.key)
key_press_handler(event, canvas, toolbar)
canvas.mpl_connect('key_press_event', on_key_event)
def _quit():
root.quit()
root.destroy()
button = tk.Button(root, text='quit', command=_quit)
button.pack(side=tk.BOTTOM)
root.mainloop()
运行结果:

代码实例2
https://stackoverflow.com/questions/35829961/using-matplotlib-with-tkinter-tkagg
import matplotlib
matplotlib.use('TkAgg')
from numpy import arange, sin, pi
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
# Implement the default mpl key bindings
from matplotlib.backend_bases import key_press_handler
from matplotlib.figure import Figure
import sys
if sys.version_info[0] < 3:
import Tkinter as Tk
else:
import tkinter as Tk
root = Tk.Tk()
root.wm_title("Embedding in TK")
f = Figure(figsize=(5, 4), dpi=100)
a = f.add_subplot(111)
t = arange(0.0, 3.0, 0.01)
s = sin(2*pi*t)
a.plot(t, s)
# A tk.DrawingArea
canvas = FigureCanvasTkAgg(f, master=root)
canvas.show()
canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)
toolbar = NavigationToolbar2TkAgg(canvas, root)
toolbar.update()
canvas._tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)
def on_key_event(event):
print('you pressed %s' % event.key)
key_press_handler(event, canvas, toolbar)
canvas.mpl_connect('key_press_event', on_key_event)
def _quit():
root.quit() # Stops mainloop
root.destroy() # This is necessary on Windows to prevent
# Fatal Python Error: PyEval_RestoreThread: NULL tstate
button = Tk.Button(master=root, text='Quit', command=_quit)
button.pack(side=Tk.BOTTOM)
Tk.mainloop()
案例3
参考 http://www.cnblogs.com/chaosimple/p/4029687.html
import numpy as np
from tkinter import *
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
def drawPic():
try:
sampleCount=int(inputEntry.get())
except:
sampleCount=50
print('请输入整数')
nputEntry.delete(0, END)
inputEntry.insert(0, '50')
#清空图像,以使得前后两次绘制的图像不会重叠
drawPic.f.clf()
drawPic.a = drawPic.f.add_subplot(111)
#在[0,100]范围内随机生成sampleCount个数据点
x = np.random.randint(0, 100, size=sampleCount)
y = np.random.randint(0, 100, size=sampleCount)
color = ['b', 'r', 'y', 'g']
#绘制这些随机点的散点图,颜色随机选取
drawPic.a.scatter(x, y, s=3, color=color[np.random.randint(len(color))])
drawPic.a.set_title('Demo: Draw N Random Dot')
drawPic.canvas.show()
if __name__ == '__main__':
root = Tk()
#在Tk的GUI上放置一个画布,并用.grid()来调整布局
drawPic.f = Figure(figsize=(5, 4), dpi=100)
drawPic.canvas = FigureCanvasTkAgg(drawPic.f, master=root)
drawPic.canvas.show()
drawPic.canvas.get_tk_widget().grid(row=0, columnspan=3)
#放置标签、文本框和按钮等部件,并设置文本框的默认值和按钮的事件函数
Label(root, text='请输入样本数量:').grid(row=1, column=0)
inputEntry = Entry(root)
inputEntry.grid(row=1, column=1)
inputEntry.insert(0, '50')
Button(root, text='画图', command=drawPic).grid(row=1, column=2, columnspan=3)
#启动事件循环
root.mainloop()
运行结果:


代码第二版本
参考:https://www.cnblogs.com/hhh5460/p/5172134.html
有些场合,我们需要对数据可视化。单是靠 tkinter 难度太大,而且做出来的效果不一定理想。此时,将 tkinter 与 matplotlib 结合,是最好的选择。知识点:将 tkinter 与 matplotlib 结合的整个套路是固定的,只需要关心我们的绘图逻辑和程序逻辑即可。
import matplotlib
matplotlib.use('TkAgg')
import numpy as np
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg,
from matplotlib.backends.backend_tkagg import NavigationToolbar2TkAgg
from matplotlib.figure import Figure
import tkinter as tk
class Application(tk.Tk):
'''
文件夹选择程序
界面与逻辑分离
'''
def __init__(self):
'''初始化'''
super().__init__() # 有点相当于tk.Tk()
self.wm_title("Embed matplotlib in tkinter")
self.createWidgets()
def createWidgets(self):
'''界面'''
fig = Figure(figsize=(5, 4), dpi=100)
self.ax = fig.add_subplot(111)
self.canvas = FigureCanvasTkAgg(fig, master=self)
self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)
self.canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=1)
toolbar = NavigationToolbar2TkAgg(self.canvas, self)
toolbar.update()
footframe = tk.Frame(master=self).pack(side=tk.BOTTOM)
tk.Button(master=footframe, text='重画', command=self.draw).pack(side=tk.BOTTOM)
tk.Button(master=footframe, text='退出', command=self._quit).pack(side=tk.BOTTOM)
self.draw() # 绘图
def draw(self):
'''绘图逻辑'''
x = np.random.randint(0, 50, size=100)
y = np.random.randint(0, 50, size=100)
# self.fig.clf() # 方式一:①清除整个Figure区域
# self.ax = self.fig.add_subplot(111) # ②重新分配Axes区域
self.ax.clear() # 方式二:①清除原来的Axes区域
self.ax.scatter(x, y, s=3) # 重新画
self.canvas.show()
def _quit(self):
'''退出'''
self.quit() # 停止 mainloop
self.destroy() # 销毁所有部件
if __name__ == '__main__':
# 实例化Application
app = Application()
# 主消息循环:
app.mainloop()
结果:

Python图形编程探索系列-09-tkinter与matplotlib结合案例的更多相关文章
- Python图形编程探索系列-07-程序登录界面设计
设计任务 初步设计程序登录界面,详细分析设计步骤. 程序详细分析 基本框架设计 import tkinter as tk import tkinter.messagebox root = tk.Tk( ...
- Python图形编程探索系列-04-网上图片与标签组件的结合
跳转到自己的博客 任务设定 任务:从网上找到一张图片,然后将其显示在标签上? 网上图片网站:http://pic.58pic.com/58pic/17/56/38/52w58PICtER_1024.j ...
- Python图形编程探索系列-03-标签组件(Label)
跳转到自己的博客 tkinter.Label介绍 什么是标签? 通俗的将就相当于word的功能,能够进行显示不可修改的文字.图片或者图文混排. 直观体会一下 图1 背景图构成:内容区(黑色),填充区( ...
- Python图形编程探索系列-08-再次认识标签
标签的各种属性 代码展示: import tkinter as tk root = tk.Tk() root.geometry = '500x300' label1 = tk.Label(root, ...
- Python图形编程探索系列-06-按钮批量生产函数
设计任务 初步设计一个批量生产按钮的函数,根据需要的按钮数量,自动生成多少按钮. 函数设计 import tkinter as tk # 导入tkinter库 root = tk.Tk() # 建立程 ...
- Python图形编程探索系列-05-用控制变量构建对话程序
跳转到自己的博客 控制变量 变量 符号 意义 默认值 1 var = tk.BooleanVar() 布尔型 0 2 var = tk.StringVar() 字符串控制变量 空字符串 3 var = ...
- Python图形编程探索系列-02-框架设计
跳转到我的博客 设计任务 在主窗口root中放置三个容器用于容纳组件,容器采用框架设计. 代码初步设计 import tkinter as tk root = tk.Tk() root.geometr ...
- Python图形编程探索系列-01-初级任务
设计任务 设计一个主窗口,在其中添加三个标签和三个按钮,当点击按钮时,对标签的内容和色彩进行修改. 代码初步设计 import tkinter as tk root = tk.Tk() def f1( ...
- linux python 图形编程 qt开发环境搭建
我的系统是 ubuntu14.04 我们使用的是python2.7,建议安装qt4+pyqt4+eric4 eric是pyqt的界面设计器的代码生成软件. 1.安装sip 这个是python和qt之间 ...
随机推荐
- Linux内核中常见内存分配函数【转】
转自:http://blog.csdn.net/wzhwho/article/details/4996510 1. 原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页 ...
- 一个有趣的小例子,带你入门协程模块-asyncio
一个有趣的小例子,带你入门协程模块-asyncio 上篇文章写了关于yield from的用法,简单的了解异步模式,[https://www.cnblogs.com/c-x-a/p/10106031. ...
- How to scroll down with Phantomjs to load dynamic content
page.open('http://example.com/?q=houston', function () { // Checks for bottom div and scrolls down f ...
- js使用中的小问题----textarea是否有value属性
使用jquery的选择器时想给textarea设置一个默认值时,采取了下面的方法: 不过失败了,但是看教程上确实成功的,那么肯定是有问题的. 经过上网查找以及自己验证发现: 1.textarea标签确 ...
- 作业8_exer1128.txt
1.规范化理论是关系数据库进行逻辑设计的理论依据,根据这个理论,关系数据库中的关系必须满足:每 一个属性都是(B). A.长度不变的 B.不可分解的 C.互相关联的 D.互不相关的 2.已知关系模式R ...
- 第一个Spring Boot程序
Windows 10家庭中文版,java version "1.8.0_152", Eclipse Oxygen.1a Release (4.7.1a),Spring Tools ...
- expdp和impdp快速导出导入,不用创建虚拟目录
expdp 和impdp不用创建虚拟目录:在cmd直接 expdp 用户名/密码 回车 就导出了,(如果提示输入用户名和密码就输入).再将导出的文件放在oracle默认的dpdump文件夹里面,然 ...
- h5新API之WebStorage解决页面数据通信问题
localStorage相信大家都不陌生,今天我们要讨论的不是怎么存储数据,获取数据.而是看看WebStorage的一些妙用,相信大家在开发中遇到过这样一个场景,一个页面中嵌套一个iframe,ifr ...
- STM32F412应用开发笔记之十:多组分气体分析仪设计验证
本次将NUCLEO-F412ZG应用于我们的多组分气体分析仪的实现试验,从整体上测试实际项目的应用情况. 一.项目概述 多组分气体分析仪是我公司近期研发的三个主要产品之一.采用模块化设计,可增减配置, ...
- poj2528贴海报,,
对于区间段的离散化需要注意一下,和点离散化不同 离散后如何识别一段区间还是一段区间,而不是两个顶点,就是如果两个点的距离大于1,就往离散的数据里插入一个中间值,即用三个点来表示一段区间 /* 离散化长 ...