matplotlib部件(widgets)之文本框(TextBox)

文本框概述

文本框是图形化界面(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)funcon_text_change方法绑定的回调函数,回调函数必须调用1个参数,即文本框当前文本。
  • 文本框内容提交改事件处理方法on_submit(func)依靠_notify_submit_observers方法实现功能,_notify_submit_observers方法最终会调回调函数func(self.text)funcon_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

你可能感兴趣的:(Matplotlib,matplotlib,widget,文本框,事件,源码)