代码

  1 '''
2 使用matplotlib创建图表,并显示在tk窗口
3 '''
4 import matplotlib.pyplot as plt
5 from matplotlib.pylab import mpl
6 from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
7 import tkinter as tk
8 import numpy as np
9 import time,sys
10 import threading
11
12 mpl.rcParams['font.sans-serif'] = ['SimHei'] # 中文显示
13 mpl.rcParams['axes.unicode_minus'] = False # 负号显示
14
15 global win
16 global tempGraphLabel, tempData, runFlag
17 runFlag = True
18 tempData = []
19
20 '''
21 图表类,定义时参数root为父控件
22 '''
23 class tempGraph():
24 def __init__(self, root):
25 self.root = root # 主窗体
26 self.canvas = tk.Canvas() # 创建一块显示图形的画布
27 self.figure = self.create_matplotlib() # 返回matplotlib所画图形的figure对象
28 self.showGraphIn(self.figure) # 将figure显示在tkinter窗体上面
29
30 '''生成fig'''
31 def create_matplotlib(self):
32 # 创建绘图对象f
33 f = plt.figure(num=2, figsize=(16, 8), dpi=100, edgecolor='green', frameon=True)
34 # 创建一副子图
35 self.fig11 = plt.subplot(1, 1, 1)
36 self.line11, = self.fig11.plot([], [])
37
38 def setLabel(fig, title, titleColor="red"):
39 fig.set_title(title+"温度曲线", color=titleColor) # 设置标题
40 fig.set_xlabel('时间[s]') # 设置x轴标签
41 fig.set_ylabel("温度[℃]") # 设置y轴标签
42 setLabel(self.fig11, "设备1")
43 # fig1.set_yticks([-1, -1 / 2, 0, 1 / 2, 1]) # 设置坐标轴刻度
44 f.tight_layout() # 自动紧凑布局
45 return f
46
47 '''把fig显示到tkinter'''
48 def showGraphIn(self, figure):
49 # 把绘制的图形显示到tkinter窗口上
50 self.canvas = FigureCanvasTkAgg(figure, self.root)
51 self.canvas.draw() # 以前的版本使用show()方法,matplotlib 2.2之后不再推荐show()用draw代替,但是用show不会报错,会显示警告
52 self.canvas.get_tk_widget().pack(side=tk.TOP) #, fill=tk.BOTH, expand=1
53
54 # 把matplotlib绘制图形的导航工具栏显示到tkinter窗口上
55 toolbar = NavigationToolbar2Tk(self.canvas,
56 self.root) # matplotlib 2.2版本之后推荐使用NavigationToolbar2Tk,若使用NavigationToolbar2TkAgg会警告
57 toolbar.update()
58 self.canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=1)
59
60 '''更新fig'''
61 def updateMeltGraph(self, meltData):
62 x = [i for i in range(len(meltData))]
63 self.line11.set_xdata(x) # x轴也必须更新
64 self.line11.set_ydata(meltData) # 更新y轴数据
65 # 更新x数据,但未更新绘图范围。当我把新数据放在绘图上时,它完全超出了范围。解决办法是增加:
66 self.fig11.relim()
67 self.fig11.autoscale_view()
68 plt.draw()
69 # self.canvas.draw_idle()
70 '''
71 更新数据,在次线程中运行
72 '''
73 def updataData():
74 global tempData,runFlag
75 while runFlag:
76 tempData.append(5)
77 time.sleep(1)
78 '''
79 更新窗口
80 '''
81 def updateWindow():
82 global win
83 global tempGraphLabel, tempData, runFlag
84 if runFlag:
85 tempGraphLabel.updateMeltGraph(tempData)
86 win.after(1000, updateWindow) # 1000ms更新画布
87 '''
88 关闭窗口触发函数,关闭S7连接,置位flag
89 '''
90 def closeWindow():
91 global runFlag
92 runFlag = False
93 sys.exit()
94 '''
95 创建控件
96 '''
97 def createGUI():
98 global win
99 win = tk.Tk()
100 displayWidth = win.winfo_screenwidth() # 获取屏幕宽度
101 displayHeight = win.winfo_screenheight()
102 winWidth, winHeight = displayWidth, displayHeight - 70
103 winX, winY = -8, 0
104 # winX, winY = int((displayWidth - winWidth) /
105 # 2), int((displayHeight - winHeight - 70) / 2)
106 win.title("窗口标题")
107 win.geometry(
108 '%dx%d-%d+%d' %
109 (winWidth,
110 winHeight,
111 winX, winY)) # %dx%d宽度x 高度+横向偏移量(距左边)+纵向偏移量(距上边)
112 # win.resizable(0, 0) # 不使能最大化
113 win.protocol("WM_DELETE_WINDOW", closeWindow)
114 # win.iconbitmap(r'resource/images/motor.ico') # 窗口图标
115
116 graphFrame = tk.Frame(win) # 创建图表控件
117 graphFrame.place(x=0, y=0)
118 global tempGraphLabel
119 tempGraphLabel = tempGraph(graphFrame)
120
121 recv_data = threading.Thread(target=updataData) # 开启线程
122 recv_data.start()
123
124 updateWindow() # 更新画布
125 win.mainloop()
126
127 if __name__ == '__main__':
128 createGUI()

实现效果

Python tkinter库将matplotlib图表显示在GUI窗口上,并实时更新刷新数据的更多相关文章

  1. Python扩展库2—matplotlib

    1 载入matplotli的绘图模块,并重命名为plt import matplotlib.pyplot as plt 2 折线图 import matplotlib.pyplot as plt im ...

  2. python 全栈开发,Day75(Django与Ajax,文件上传,ajax发送json数据,基于Ajax的文件上传,SweetAlert插件)

    昨日内容回顾 基于对象的跨表查询 正向查询:关联属性在A表中,所以A对象找关联B表数据,正向查询 反向查询:关联属性在A表中,所以B对象找A对象,反向查询 一对多: 按字段:xx book ----- ...

  3. python gui 之 tkinter库

    http://blog.csdn.net/jcodeer?viewmode=contents http://tieba.baidu.com/p/3082739560 http://blog.sina. ...

  4. python3 井字棋 GUI - 人机对战、机器对战 (threading、tkinter库)

    python3 井字棋 GUI - 人机对战.机器对战 功能 GUI界面 人机对战(可选择机器先走) 机器对战(50局) 流程图 内核 棋盘 [0][1][2] [3][4][5] [6][7][8] ...

  5. Python Tkinter学习笔记

    介绍 入门实例 显示一个窗口,窗口里面有一个标签,显示文字 import tkinter as tk # 一个顶层窗口的实例(Top Level),也称为根窗口 app = tk.Tk() # 设置窗 ...

  6. Python第三方库之openpyxl(12)

    Python第三方库之openpyxl(12) 地面天气图 在工作表上的列或行中安排的数据可以在一个表中绘制.当您想要在两组数据之间找到最佳组合时,一个表面图表是有用的.正如在地形图中一样,颜色和图案 ...

  7. Python标准库、第三方库和外部工具汇总

    导读:Python数据工具箱涵盖从数据源到数据可视化的完整流程中涉及到的常用库.函数和外部工具.其中既有Python内置函数和标准库,又有第三方库和工具. 这些库可用于文件读写.网络抓取和解析.数据连 ...

  8. 140种Python标准库、第三方库和外部工具

    导读:Python数据工具箱涵盖从数据源到数据可视化的完整流程中涉及到的常用库.函数和外部工具.其中既有Python内置函数和标准库,又有第三方库和工具. 这些库可用于文件读写.网络抓取和解析.数据连 ...

  9. python matplotlib 中文显示参数设置

    python matplotlib 中文显示参数设置 方法一:每次编写代码时进行参数设置 #coding:utf-8import matplotlib.pyplot as pltplt.rcParam ...

随机推荐

  1. 3、Linux基础--cp、mv、rm、alias、vi/vim命令

    笔记 1.考试 1.判断网络是否通畅的命令 ping 2.定义系统提示组成的变量 PS1 3.Linux中目录从什么开始 根(/) 4.系统中目录路径类型有哪些,解释一下 绝对路径:以根目录作为参照物 ...

  2. Solution -「AGC 029E」「AT 4504」Wandering TKHS

    \(\mathcal{Description}\)   Link.   给一棵 \(n\) 个点的树,从某个点出发,遍历时必须走到已经走过的连通块所邻接的编号最小的结点.求从每个点出发,走到 \(1\ ...

  3. Rust语言开发

    Rust开发 第一个程序 fn main() { println!("Hello, world!"); // 带!号的都是宏 并不是函数 } fn main() { let nam ...

  4. splunk设置索引周期和索引大小

    步骤一: 编辑/opt/splunk/etc/apps/search/local/indexs.conf ,在每个索引下面 加入最后两行内容 [messages] coldPath = $SPLUNK ...

  5. scrapy爬取《坏蛋是怎样练成的4》

    scrapy具体介绍就不用说了,自己百度一下.或者参考以下文档 https://blog.csdn.net/u011054333/article/details/70165401 直接在cmd里运行 ...

  6. [旧][Android] View 工作原理(二)

    备注 原发表于2016.05.27,资料已过时,仅作备份,谨慎参考 前言 本文大量参照<Android 开发艺术探索>及参考资料的内容整合,主要帮助自己理清 View 的工作原理.深入学习 ...

  7. 【C# 】继承

    背景..什么是继承? 「继承」是对象导向编程的其中一个基本属性. 它可让您定义子类,重复使用(继承).扩充或修改父类别行为. 其成员可供继承的类别称为基底类别. 继承基底类别成员的类别则称为「衍生类别 ...

  8. 【C# 线程】线程局部存储(TLS) 实战部分 ThreadStatic|LocalDataStoreSlot|ThreadLocal<T>

    往袋子里面装苹果 错误案例示范 关于C#多线程的文章,大部分都在讨论线程的起停或者是多线程同步问题.多线程同步就是在不同线程中访问同一个变量(一般是线程工作函数外部的变量),众所周知在不使用线程同步的 ...

  9. bool 类型位逻辑运算符(| & ^)与条件逻辑运算符(|| &&)的区别

    bool 类型的运算符 & ^|   &&  ||   ! 运算符&&和|| 是短路的,这意味着如果左侧表达式的值足以确定结果,则它们将不会评估其右侧表达式. ...

  10. 举例说明EF CORE中模型之间的一对多、多对多关系的实现

    该例子是我临时想出来的,不具有任何的实际意义.类图如图1所示. 图1 类代码: [Table("student")] public class Student { public i ...