1.UI控件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
def func_slider(val): print("进度条", val) def func_button(event): print("按钮", type(event)) def func_radiobtn(label): print("单选选中了", label) def func_checkbtn(label): status = checkBtn.get_status() print("复选框选中状态", status) def func_textbox(text): print("文本框", text) import matplotlib.pyplot as plt import matplotlib.widgets as wdg # === 进度条 === slider = wdg.Slider( # ax=plt.axes([0.1, 0.05, 0.4, 0.03]), # 窗口百分比位置,相对于左下角。left, bottom, width, height label="进度条", # 文字。文字在ax范围之外左边 valmin=10, # 最小值 valmax=1000, # 最大值 valinit=100, # 基准线值 valstep=1) # 步长 # === 按钮 === button = wdg.Button( # ax=plt.axes([0.6, 0.05, 0.3, 0.05]), # label='点击按钮试试', # color='r', # hovercolor='0.975') # # === 单选按钮 === radioBtn = wdg.RadioButtons( # ax=plt.axes([0.1, 0.2, 0.4, 0.3]), # labels=("男的", "女的", "同体的"), # 一组单选按钮的文字 active=1, # 默认选中的-'女的' activecolor='blue') # 选中按钮的颜色 # === 多选按钮 === checkBtn = wdg.CheckButtons( # ax=plt.axes( # [0.1, 0.6, 0.4, 0.3], # facecolor='g'), # labels=('语文', '数学', '英语'), # 一组复选框的文字 actives=(False, False, False)) # 选中状态 # === 标尺 === ax = plt.axes([0.1, 0.6, 0.4, 0.3]) # 覆盖在复选框面板上。会拦截事件。 ax.patch.set_alpha(0.1) # 设置背景几乎完全透明 lineprops = {"color": "y", # 线条颜色 "lw": 1} # 线条粗细 cursor = wdg.Cursor( # 标尺 ax=plt.axes([0.6, 0.2, 0.3, 0.3]), # 位置 # ax=ax, # horizOn=True, # 显示水平线 vertOn=True, # 显示垂直线 useblit=False, # 硬件加速 **lineprops) # 线条样式设置 # === 文本框 === textbox = wdg.TextBox( # 单行显示,不可换行 ax=plt.axes([0.6, 0.6, 0.3, 0.05]), # 位置 label="文本框", # 说明文字 initial='input sth', # 初始输入的文字 color='.95', # 颜色 hovercolor='1', # 鼠标滑过变色 label_pad=.01) # 内边距 # --- 添加事件 --- slider.on_changed(func_slider) button.on_clicked(func_button) radioBtn.on_clicked(func_radiobtn) checkBtn.on_clicked(func_checkbtn) textbox.on_text_change(func_textbox) plt.show() |
区间滑杆
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
import matplotlib.pyplot as plt import matplotlib.widgets as wdg release_range=None def on_rangeslider_release(event): print('鼠标放开') print(release_range) # 鼠标拖到过程中,此方法持续回调 def func_range_slider(val): global release_range release_range = (val[0], val[1]) # type(val) ndarray # print('x=%s, y=%s'%(val[0], val[1])) rangeSlider = wdg.RangeSlider( ax=plt.axes([0.1, 0.05, 0.4, 0.03]), # 位置 label="区间条", # 标签 valmin=0, # 最小值 valmax=100, # 最大值 valinit=None, # 初始参照点,默认(25%,75%) dragging=True, # 默认True支持滑动,过程中也回调 valstep=1, # 步长 orientation="horizontal", # 水平操作。vertical垂直操作。 ) rangeSlider.on_changed(func_range_slider) rangeSlider.connect_event('button_release_event', on_rangeslider_release) rangeSlider.valtext.set_visible(False) # 隐藏 区间值尾巴 plt.show() |
复式标尺
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import matplotlib.pyplot as plt import matplotlib.widgets as wdg fig, (ax1, ax2) = plt.subplots(nrows=2, sharex=True) # sharex子块图使用相同的x轴坐标 ax1.plot([1, 2, 3, 4, 5, 6], [3, 4, 5, 1, 2, 6]) ax2.plot([3, 4, 5, 6, 2, 1], [3, 1, 6, 2, 4, 5]) multi = wdg.MultiCursor( # 复式标尺 fig.canvas, # 画布 (ax1, ax2), # 子面板 horizOn=True, # 水平线 vertOn=True, # 垂直线 color='r', # 线条颜色 lw=10, # 线条粗细 linestyle='--') # 线条样式 plt.show() |
2.选择器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 |
import copy import matplotlib.pyplot as plt import matplotlib.widgets as wdg from matplotlib import patches from matplotlib.path import Path x = [0.0304, 0.2304, 0.3764, 0.5043, 0.6305, 0.9049] y = [0.5457, 0.3097, 0.2045, 0.4017, 0.0708, 0.4984] ax = plt.gca() points = ax.scatter(x, y, s=133, c='g') # matplotlib.collections.PathCollection point_offsets = points.get_offsets().tolist() # 全部点的坐标 二维数组 [ 点[x,y], 点[x,y], ...]。numpy的arry转为普通list point_colors = points.get_facecolors().tolist() # 如果全部点的fc是相同的,numpy内部复用返回的二维数组仅1个fc [ 点[fc] ]。[[r, g, b, a]] if 1 == len(point_colors): # 补齐每个点的fc point_colors = [[j for j in point_colors[0]] for i in range(len(point_offsets))] # [ rgba[0.12, 0.47, 0.70, 1.0], 同, 同, 同, 同 , 同 ] old_point_colors = copy.deepcopy(point_colors) # 套索选择事件 def func_lasso(vertices): print("套索选择") # print('套索圈起的点', verts) # [(x, y), 【...n个点...】] selected_path = Path(vertices) # 鼠标选择的区域 ps = selected_path.contains_points(point_offsets) # 全部点的选中状态选择的true。[true, fase, ...] show_selected(ps) # 跨轴选择事件 def func_span(vmin, vmax): print("跨轴选择") # print('轴范围 %s - %s' % (vmin, vmax)) # 本例direction='vertical',选择的y轴范围 0.0618 - 0.2024 vertices = [ # 图形矩阵,从左下顺时针确定顶点。本例direction='vertical',x轴占满 (0, vmin), # 左下角 (0, vmax), # 左上角 (1, vmax), # 右上角 (1, vmin), # 右下角 (0, vmin)] # 出发点,封闭 selected_path = Path(vertices) # 鼠标选择的区域 ps = selected_path.contains_points(point_offsets) show_selected(ps) # # selector.stay_rect.set_visible(False) # 框选选择事件 def func_rectangle(event_press, event_release): print("框选") x1 = event_press.xdata # 无论鼠标什么方向选择,返回的都是图形左下角 y1 = event_press.ydata x2 = event_release.xdata # 右上角 y2 = event_release.ydata btn = event_press.button # MouseButton.LEFT rect = patches.Rectangle( # xy=(x1, y1), # width=x2 - x1, # height=y2 - y1, # ) ps = rect.contains_points(point_offsets) show_selected(ps) # 钢笔区域选择事件 def func_polygon(vertices): print("钢笔选择") # print(vertices) # 全部锚点 [(x,y), (x,y), ((x,y), ...)] selected_path = Path(vertices) # 鼠标选择的区域 ps = selected_path.contains_points(point_offsets) show_selected(ps) global is_func_polygon_finish is_func_polygon_finish = True # 全局鼠标事件,配合钢笔区域选择事件 def on_polygon_key_release(event): global is_func_polygon_finish if is_func_polygon_finish: event.key = 'escape' selector.on_key_press(event) selector.on_key_release(event) is_func_polygon_finish = False # 圆形区域选择事件 def func_ellipse(event_press, event_release): print("圆圈选择") # (event_press.xdata, event_press.ydata)) # (0.015609, 0.013259) # (event_release.xdata, event_release.ydata)) # (0.201179, 0.402416) # event_press.button) # 用的键是 MouseButton.LEFT ext = selector.extents ellipse = patches.Ellipse( # xy=selector.center, # width=ext[1] - ext[0], # height=ext[3] - ext[2]) ps = ellipse.contains_points(point_offsets) show_selected(ps) # 显示选择的标记 def show_selected(ps): no_selected = True # point_colors = copy.deepcopy(old_point_colors) for i in range(len(ps)): if ps[i]: # 选中的图形为True point_colors[i] = [1, 0, 0, 1] no_selected = False if no_selected: points.set_facecolors(old_point_colors) else: points.set_facecolors(point_colors) ax.figure.canvas.draw_idle() # === 自由套索选择 === selector = wdg.LassoSelector( # ax=plt.gca(), # 面板 onselect=func_lasso, # 事件处理 lineprops={ # "color": "red", # 鼠标划出的线的颜色 "lw": 1}) # 线的粗细 # # === 跨轴范围选择 === selector = wdg.SpanSelector( # ax=plt.gca(), # 面板 onselect=func_span, # 事件处理 direction='vertical', # horizontal只返回x轴坐标,此时y轴全选;vertical返回y轴坐标,x轴范围全选 # span_stays=True, # 鼠标释放后仍显示选择区域 rectprops=dict(alpha=0.5, facecolor='green')) # === 框选选择 === selector = wdg.RectangleSelector( # ax=plt.gca(), # 面板 onselect=func_rectangle, # 事件处理 ) # === PhotoShop钢笔选择 === selector = wdg.PolygonSelector( # ax=plt.gca(), # 面板 onselect=func_polygon, # 事件处理 markerprops={ # 锚点的内圆 # "alpha": 1, # 内圆透明度 # "marker": "p", # 内圆样式 # "mfc": "red", # 内圆填充色 # "markersize": 8, # 内圆大小 # "mec": "b", # 内圆描边颜色 # "markeredgewidth": 1, # 内圆描边粗细 }, # lineprops={ # 锚点的外圆 # "marker": "o", # 外圆样式 # "markersize": 15, # 外圆大小 # "markerfacecolor": "b", # 外圆填充色 # "alpha": 1, # 外圆透明度 # "color": "y", # 连线颜色 # "linestyle": ":", # 连线样式 # "linewidth": 5, # 连线粗细 # "markeredgewidth": 2, # 外圆描边粗细 # "markeredgecolor": "m", # 外圆描边色 } # ) is_func_polygon_finish = False # 模拟escape按键,关闭钢笔选择路径 selector.connect_event('button_release_event', on_polygon_key_release) # 模拟escape按键关闭选择路径 # === 圆形区域选择 === selector = wdg.EllipseSelector( # ax=plt.gca(), # 面板 onselect=func_ellipse, # 事件处理 drawtype='box', # box色块-默认, line线框, none无显示 lineprops={ # drawtype为line的线框样式 "color": "red", # 鼠标划出的线的颜色 "lw": 10}, rectprops=dict( # drawtype为box的线框样式 facecolor="blue", edgecolor="red", alpha=0.9, fill=True) # ) plt.show() |
3.交互事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
import matplotlib.pyplot as plt fig, ax = plt.subplots() y = [0.580327, 0.39728124, 0.8120487, 0.91627899, 0.79692209, 0.14120327] line, = ax.plot(y, marker='*', linestyle='', markersize=10) # picker=5已废弃,使用markersize line.set_picker(True) # 开启可选,否则pick_event事件不响应 def getEventMouse(event): print('鼠标按下', event.key) # 鼠标事件触发时按下的键,值范围同键盘事件KeyEvent中的key属性。 print('鼠标键', event.button) # 按下的鼠标按钮,值范围为:None、1、2、3、up、down(up、down用于滚动事件)。 print('双击', event.dblclick) # dblclick:表示是否双击,布尔值。 def getEventKey(event): print('键盘键', event.key) # 按下的键,值范围为:None、任何字符、'shift'、win或者control。 def getEventPosition(event): print('鼠标距离原点x', event.x) # 距离画布左端的像素数 print('鼠标距离原点y', event.y) # 距离画布底端的像素数 print('处于坐标系', event.inaxes) # 是否处于坐标系中,是则为鼠标所处于的子图实例,否则为None print('鼠标x', event.xdata) # 鼠标的x坐标 print('鼠标y', event.ydata) # 鼠标的y坐标 def getDrawWH(event): w, h = event.renderer.get_canvas_width_height() print('窗口大小', (w, h)) def getResizeWH(event): w = event.width h = event.height print('窗口缩放', (w, h)) def getPickArtist(event): art = event.artist xdata = art.get_xdata() ydata = art.get_ydata() ind = event.ind points = tuple(zip(xdata[ind], ydata[ind])) print('点中的图形位置', points) def onclick(event): print(event.name) if 'axes_enter_event' == event.name: getEventPosition(event) elif 'axes_leave_event' == event.name: getEventPosition(event) elif 'figure_enter_event' == event.name: getEventPosition(event) elif 'figure_leave_event' == event.name: getEventPosition(event) elif 'button_press_event' == event.name: getEventPosition(event) getEventMouse(event) elif 'button_release_event' == event.name: getEventPosition(event) getEventMouse(event) elif 'motion_notify_event' == event.name: getEventPosition(event) getEventMouse(event) elif 'scroll_event' == event.name: getEventPosition(event) getEventMouse(event) elif 'key_press_event' == event.name: getEventPosition(event) getEventKey(event) elif 'key_release_event' == event.name: getEventPosition(event) getEventKey(event) elif 'draw_event' == event.name: getDrawWH(event) elif 'resize_event' == event.name: getResizeWH(event) elif 'pick_event' == event.name: getPickArtist(event) cid = fig.canvas.mpl_connect('axes_enter_event', onclick) # LocationEvent 鼠标进入新的轴域 cid = fig.canvas.mpl_connect('axes_leave_event', onclick) # LocationEvent 鼠标离开轴域 cid = fig.canvas.mpl_connect('figure_enter_event', onclick) # LocationEvent 鼠标进入窗口/图形 cid = fig.canvas.mpl_connect('figure_leave_event', onclick) # LocationEvent 鼠标离开图形 cid = fig.canvas.mpl_connect('button_press_event', onclick) # MouseEvent 鼠标按键 按下 cid = fig.canvas.mpl_connect('button_release_event', onclick) # MouseEvent 鼠标按键 释放-弹起 cid = fig.canvas.mpl_connect('motion_notify_event', onclick) # MouseEvent 鼠标在窗口/图形内移动 cid = fig.canvas.mpl_connect('scroll_event', onclick) # MouseEvent 鼠标滚轮被滚动 cid = fig.canvas.mpl_connect('key_press_event', onclick) # KeyEvent 键盘按键 按下 cid = fig.canvas.mpl_connect('key_release_event', onclick) # KeyEvent 键盘按键 释放 cid = fig.canvas.mpl_connect('draw_event', onclick) # DrawEvent 窗口打开,画布绘图了 cid = fig.canvas.mpl_connect('resize_event', onclick) # ResizeEvent 窗口/画布大小改变,之后会draw_event cid = fig.canvas.mpl_connect('pick_event', onclick) # PickEvent 画布中的对象被选中 plt.show() |
- end
声明
本文由崔维友 威格灵 cuiweiyou vigiles cuiweiyou 原创,转载请注明出处:http://www.gaohaiyan.com/3008.html
承接App定制、企业web站点、办公系统软件 设计开发,外包项目,毕设