菜单

输出:
100 371 91 29100 342 91 29100 313 91 29100 284 91 29100 255 91 29
import numpy as npimport matplotlib.colors as colorsimport matplotlib.patches as patchesimport matplotlib.mathtext as mathtextimport matplotlib.pyplot as pltimport matplotlib.artist as artistimport matplotlib.image as imageclass ItemProperties(object):def __init__(self, fontsize=14, labelcolor='black', bgcolor='yellow',alpha=1.0):self.fontsize = fontsizeself.labelcolor = labelcolorself.bgcolor = bgcolorself.alpha = alphaself.labelcolor_rgb = colors.to_rgba(labelcolor)[:3]self.bgcolor_rgb = colors.to_rgba(bgcolor)[:3]class MenuItem(artist.Artist):parser = mathtext.MathTextParser("Bitmap")padx = 5pady = 5def __init__(self, fig, labelstr, props=None, hoverprops=None,on_select=None):artist.Artist.__init__(self)self.set_figure(fig)self.labelstr = labelstrif props is None:props = ItemProperties()if hoverprops is None:hoverprops = ItemProperties()self.props = propsself.hoverprops = hoverpropsself.on_select = on_selectx, self.depth = self.parser.to_mask(labelstr, fontsize=props.fontsize, dpi=fig.dpi)if props.fontsize != hoverprops.fontsize:raise NotImplementedError('support for different font sizes not implemented')self.labelwidth = x.shape[1]self.labelheight = x.shape[0]self.labelArray = np.zeros((x.shape[0], x.shape[1], 4))self.labelArray[:, :, -1] = x/255.self.label = image.FigureImage(fig, origin='upper')self.label.set_array(self.labelArray)# we'll update these laterself.rect = patches.Rectangle((0, 0), 1, 1)self.set_hover_props(False)fig.canvas.mpl_connect('button_release_event', self.check_select)def check_select(self, event):over, junk = self.rect.contains(event)if not over:returnif self.on_select is not None:self.on_select(self)def set_extent(self, x, y, w, h):print(x, y, w, h)self.rect.set_x(x)self.rect.set_y(y)self.rect.set_width(w)self.rect.set_height(h)self.label.ox = x + self.padxself.label.oy = y - self.depth + self.pady/2.self.hover = Falsedef draw(self, renderer):self.rect.draw(renderer)self.label.draw(renderer)def set_hover_props(self, b):if b:props = self.hoverpropselse:props = self.propsr, g, b = props.labelcolor_rgbself.labelArray[:, :, 0] = rself.labelArray[:, :, 1] = gself.labelArray[:, :, 2] = bself.label.set_array(self.labelArray)self.rect.set(facecolor=props.bgcolor, alpha=props.alpha)def set_hover(self, event):'check the hover status of event and return true if status is changed'b, junk = self.rect.contains(event)changed = (b != self.hover)if changed:self.set_hover_props(b)self.hover = breturn changedclass Menu(object):def __init__(self, fig, menuitems):self.figure = figfig.suppressComposite = Trueself.menuitems = menuitemsself.numitems = len(menuitems)maxw = max(item.labelwidth for item in menuitems)maxh = max(item.labelheight for item in menuitems)totalh = self.numitems*maxh + (self.numitems + 1)*2*MenuItem.padyx0 = 100y0 = 400width = maxw + 2*MenuItem.padxheight = maxh + MenuItem.padyfor item in menuitems:left = x0bottom = y0 - maxh - MenuItem.padyitem.set_extent(left, bottom, width, height)fig.artists.append(item)y0 -= maxh + MenuItem.padyfig.canvas.mpl_connect('motion_notify_event', self.on_move)def on_move(self, event):draw = Falsefor item in self.menuitems:draw = item.set_hover(event)if draw:self.figure.canvas.draw()breakfig = plt.figure()fig.subplots_adjust(left=0.3)props = ItemProperties(labelcolor='black', bgcolor='yellow',fontsize=15, alpha=0.2)hoverprops = ItemProperties(labelcolor='white', bgcolor='blue',fontsize=15, alpha=0.2)menuitems = []for label in ('open', 'close', 'save', 'save as', 'quit'):def on_select(item):print('you selected %s' % item.labelstr)item = MenuItem(fig, label, props=props, hoverprops=hoverprops,on_select=on_select)menuitems.append(item)menu = Menu(fig, menuitems)plt.show()
