Toccata in Nowhere.

matplotlib中的按钮与文本输入框

2020.10.22

在 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函数将在每次触发事件后执行。