在 matplotlib 的 figure 上添加按钮与文本框可以被认为是Python中较为容易的GUI实现方式,本文介绍基本的实现与使用。
导入包
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Button, TextBox
构建响应类、变量和每个按钮的响应 Callback 函数
class Index(object):
ind = 0 # public variation here
def next(self, event): # Button 1 Pressed
self.ind += 1
if self.ind >= len(file_list):
self.ind = 0
self.update()
def prev(self, event): # Button 2 Pressed
self.ind -= 1
if self.ind < 0:
self.ind = len(file_list) - 1
self.update()
def submin_ind(self, text): # Text Box Summiting
print('Set index=' + text)
self.ind = int(text)
self.update()
def update(self):
# do something here to update figure
以上代码展示了两个按钮、一个文本框的响应函数。分别对应索引ind
加$1$,索引ind
减$1$,与直接修改索引ind
的提交响应方法。
update
函数则是绘图刷新函数,可以使用 plt.cla()
对绘图进行更新,但会覆盖掉原本覆盖的按钮,故应当在绘图后先获取 ax=plt.gca()
获取当前子图坐标,后使用ax.cla()
清空当前子图进行更新。
另外一种思路是对于绘图中 plt.plot
绘制的单条曲线信息时,可以使用 l, = plt.plot(t, s)
记录绘图曲线。之后使用 l.set_ydata(ydata)
后 plt.draw()
进行重绘。
放置:指定部件位置与激活函数
callback = Index()
axprev = plt.axes([0.7, 0.02, 0.1, 0.05]) # Button 1 Location
axnext = plt.axes([0.81, 0.02, 0.1, 0.05])
bnext = Button(axnext, 'Next') # Button 1 Text
bnext.on_clicked(callback.next) # Button 1 Callback
bprev = Button(axprev, 'Previous')
bprev.on_clicked(callback.prev)
axbox = plt.axes([0.12, 0.02, 0.075, 0.05]) # Textbox location
yMin_box = TextBox(axbox, 'Index:', initial=str('0')) # Textbox default text
yMin_box.on_submit(callback.submin_ind) # Textbox Callback
以上代码指定了按钮及文本框的位置及关联了响应函数。
展示 matplotlib 窗口
plt.show()
在执行plt.show()
后绘图会将部件和plt窗口展示;Callback函数将在每次触发事件后执行。