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之间 ...
随机推荐
- JavaScript中 this 的指向
很多人都会被JavaScript中this的指向(也就是函数在调用时的调用上下文)弄晕,这里做一下总结: 首先,顶层的this指向全局对象. 函数中的this按照调用方法的不同,其指向也不同: 1.函 ...
- CentOS挂载光盘
mkdir /mnt/cdrom mount /dev/cdrom /mnt/cdrom umount /dev/cdrom /mnt/cdrom 在Ambari集群中配置192.168.0.210: ...
- GPIO推挽输出和开漏输出详解
open-drain与push-pull] GPIO的功能,简单说就是可以根据自己的需要去配置为输入或输出.但是在配置GPIO管脚的时候,常会见到两种模式:开漏(open-drain,漏极开路)和推挽 ...
- GPIO接口解析【转】
本文提供了一个linux下访问GPIO的约定的概述. 这些调用使用gpio_* 命名前缀.没有别的调用会使用这个前缀或是相关的__gpio_*前缀. 转自:http://blog.163.com/w5 ...
- Linux内核驱动--硬件访问I/O【原创】
寄存器与内存 寄存器与内存的区别在哪里呢? 寄存器和RAM的主要不同在于寄存器操作有副作用(side effect或边际效果): 读取某个地址时可能导致该地址内容发生变化,比如很多设备的中断状态寄存器 ...
- 【sky第二期--PID算法】--【智能车论坛】
[sky第二期--PID算法] 想学PID的可以来[智能车论坛]这里有我发布的资料http://bbs.tekbots.eefocus.com/forum.php?mod=viewthread& ...
- 3种shell自动交互的方法【转】
一.背景 shell脚本在处理自动循环或大的任务方面可节省大量的时间,通过创建一个处理任务的命令清单,使用变量.条件.算术和循环等方法快速创建脚本以完成相应工作,这比在命令行下一个个敲入命令要省时省力 ...
- eclipse自定义工具栏
设置:1.Window2.Customize Perspective说明:Tool Bar Visibility定义菜单栏,Shortcuts定义右键new菜单
- 内核中 subsys_initcall 以及初始化标号
今天在看内核中无线的实现时,发现一个调用 subsys_initcall(cfg80211_init);搜索一些资料: subsys_initcall 的定义在 include/linux/init. ...
- 基于react/vue的移动端终极适配方案vw单位(更新css-modules配置)
传送门: https://segmentfault.com/a/1190000014185590