文本框概述
文本框是图形化界面(GUI)中常见的控件,matplotlib
中的文本框属于部件(widgets),matplotlib
中的部件都是中性(neutral )
的,即与具体后端实现无关。
文本框具体实现定义为matplotlib.widgets.TextBox
类,继承关系为:Widget->AxesWidget->TextBox
。
TextBox
类的签名为class matplotlib.widgets.TextBox(ax, label, initial='', color='.95', hovercolor='1', label_pad=0.01)
TextBox
类构造函数的参数为:
ax
:放置文本框的容器,类型为matplotlib.axes.Axes
的实例。label
:文本框标签文本。initial
:文本框的初始值,类型为字符串,默认值为空字符串。color
:文本框背景颜色。hovercolor
:鼠标悬停在文本框时文本框的背景颜色,默认为蓝色。label_pad
:文本框标签与文本框之间的距离。
TextBox
类的属性为:
ax
:放置按钮的容器,类型为matplotlib.axes.Axes
的实例。label
:文本框标签文本。color
:文本框背景颜色。hovercolor
:鼠标悬停在文本框时文本框的背景颜色。text
:当前文本框中的文本。
TextBox
类最常用的方法为:
on_submit(func)
:参数为回调函数,用于绑定文本框内容提交事件。on_text_change(func)
:参数为回调函数,用于绑定文本框内容修改事件。set_val(val)
:用于修改文本框的文本。
案例
案例说明
功能:通过文本框修改子图标题。
程序运行时,文本框的内容为空,子图标题为“原始标题”。
文本框输入内容时,触发on_text_change
方法,子图标题修改为“标题修改为:以及当前文本框的内容”。
在文本框输入回车或鼠标离开文本框,触发on_submit
方法,子图标题修改为“标题最终为:以及当前文本框的内容”。
代码分析
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import TextBox
plt.rcParams['font.family'] = 'SimHei'
fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2)
ax.set_title("原始标题")
plt.plot([1,2])
# 定义on_submit方法回调函数
def submit(expression):
ax.set_title('标题最终为:'+expression)
plt.draw()
# 定义on_change方法回调函数
def change(expression):
ax.set_title('标题修改为:'+expression)
plt.draw()
# 实例化文本框
axbox = fig.add_axes([0.1, 0.05, 0.8, 0.075])
text_box = TextBox(axbox, "请输入:")
# 绑定事件
text_box.on_submit(submit)
text_box.on_text_change(change)
# text_box.set_val("修改文本")
plt.show()
文本框相关方法原理解析
以下为RadioButtons
类部分源码,根据源码可知:
- 文本框内容修改事件处理方法
on_text_change(func)
依靠_notify_change_observers
方法实现功能,_notify_change_observers
方法最终会调回调函数func(self.text)
,func
为on_text_change
方法绑定的回调函数,回调函数必须调用1个参数,即文本框当前文本。 - 文本框内容提交改事件处理方法
on_submit(func)
依靠_notify_submit_observers
方法实现功能,_notify_submit_observers
方法最终会调回调函数func(self.text)
,func
为on_submit
方法绑定的回调函数,回调函数必须调用1个参数,即文本框当前文本。 - 文本框内容修改方法
set_val(val)
修改文本框的当前文本后,会依次调用on_text_change(func)
和on_submit(func)
。
self.connect_event('button_press_event', self._click)
self.connect_event('button_release_event', self._release)
self.connect_event('motion_notify_event', self._motion)
self.connect_event('key_press_event', self._keypress)
self.connect_event('resize_event', self._resize)
def text(self):
return self.text_disp.get_text()
def _notify_submit_observers(self):
if self.eventson:
for cid, func in self.submit_observers.items():
func(self.text)
def _notify_change_observers(self):
if self.eventson:
for cid, func in self.change_observers.items():
func(self.text)
def set_val(self, val):
newval = str(val)
if self.text == newval:
return
self.text_disp.set_text(newval)
self._rendercursor()
self._notify_change_observers()
self._notify_submit_observers()
def on_text_change(self, func):
"""
When the text changes, call this *func* with event.
A connection id is returned which can be used to disconnect.
"""
cid = self.cnt
self.change_observers[cid] = func
self.cnt += 1
return cid
def on_submit(self, func):
"""
When the user hits enter or leaves the submission box, call this
*func* with event.
A connection id is returned which can be used to disconnect.
"""
cid = self.cnt
self.submit_observers[cid] = func
self.cnt += 1
return cid