add core Widget
This commit is contained in:
parent
7790801d11
commit
387adbf0c4
125
kivyplots/kivyplot.py
Normal file
125
kivyplots/kivyplot.py
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
import matplotlib
|
||||||
|
matplotlib.use('module://kivy.garden.matplotlib.backend_kivy')
|
||||||
|
from kivy.garden.matplotlib.backend_kivyagg import NavigationToolbar2Kivy
|
||||||
|
from kivy.uix.boxlayout import BoxLayout
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
from kivy.properties import BooleanProperty
|
||||||
|
|
||||||
|
"""
|
||||||
|
def press(event):
|
||||||
|
print('press released from test', event.x, event.y, event.button)
|
||||||
|
|
||||||
|
def release(event):
|
||||||
|
print('release released from test', event.x, event.y, event.button)
|
||||||
|
|
||||||
|
def keypress(event):
|
||||||
|
print('key down', event.key)
|
||||||
|
|
||||||
|
def keyup(event):
|
||||||
|
print('key up', event.key)
|
||||||
|
|
||||||
|
def motionnotify(event):
|
||||||
|
print('mouse move to ', event.x, event.y)
|
||||||
|
|
||||||
|
def resize(event):
|
||||||
|
print('resize from mpl ', event.width, event.height)
|
||||||
|
|
||||||
|
def scroll(event):
|
||||||
|
print('scroll event from mpl ', event.x, event.y, event.step)
|
||||||
|
|
||||||
|
def figure_enter(event):
|
||||||
|
print('figure enter mpl')
|
||||||
|
|
||||||
|
def figure_leave(event):
|
||||||
|
print('figure leaving mpl')
|
||||||
|
|
||||||
|
def close(event):
|
||||||
|
print('closing figure')
|
||||||
|
|
||||||
|
def enter_axes(event):
|
||||||
|
print('enter_axes', event.inaxes)
|
||||||
|
event.inaxes.patch.set_facecolor('yellow')
|
||||||
|
event.canvas.draw()
|
||||||
|
|
||||||
|
def leave_axes(event):
|
||||||
|
print('leave_axes', event.inaxes)
|
||||||
|
event.inaxes.patch.set_facecolor('white')
|
||||||
|
event.canvas.draw()
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
class KivyPlot(BoxLayout):
|
||||||
|
event_mappings = {
|
||||||
|
'button_press_event': 'on_button_press',
|
||||||
|
'button_release_event': 'on_button_release',
|
||||||
|
'key_press_event': 'on_key_press',
|
||||||
|
'key_release_event': 'on_key_release',
|
||||||
|
'motion_notify_event': 'on_mouse_move',
|
||||||
|
'resize_event': 'on_resize',
|
||||||
|
'scroll_event': 'on_scroll',
|
||||||
|
'figure_enter_event': 'on_figure_enter',
|
||||||
|
'figure_leave_event': 'on_figure_leave',
|
||||||
|
'axes_enter_event': 'on_axes_enter',
|
||||||
|
'axes_leave_event': 'on_axes_leave',
|
||||||
|
'close_event': 'on_plot_close'
|
||||||
|
}
|
||||||
|
plot_bar = BooleanProperty(False)
|
||||||
|
def __init__(self, **kw):
|
||||||
|
super().__init__(**kw)
|
||||||
|
self.fig, self.ax = plt.subplots()
|
||||||
|
self.orientation = 'vertical'
|
||||||
|
canvas = self.fig.canvas
|
||||||
|
f = self.event_handler
|
||||||
|
for ev in self.event_mappings.keys():
|
||||||
|
canvas.mpl_connect(ev, f)
|
||||||
|
for ev in self.event_mappings.values():
|
||||||
|
self.add_event_type(ev)
|
||||||
|
|
||||||
|
def add_event_type(self, name):
|
||||||
|
setattr(self, name, self.default_handler)
|
||||||
|
self.register_event_type(name)
|
||||||
|
|
||||||
|
def default_handler(self, event):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def event_handler(self, event):
|
||||||
|
ev = self.event_mappings.get(event.name)
|
||||||
|
self.dispatch(ev, event)
|
||||||
|
|
||||||
|
def __enter__(self):
|
||||||
|
return self.ax
|
||||||
|
|
||||||
|
def __exit__(self, *args):
|
||||||
|
canvas = self.fig.canvas
|
||||||
|
# canvas.draw()
|
||||||
|
if self.plot_bar:
|
||||||
|
nav1 = NavigationToolbar2Kivy(canvas)
|
||||||
|
self.add_widget(nav1.actionbar)
|
||||||
|
self.add_widget(canvas)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
from kivy.app import App
|
||||||
|
import numpy as np
|
||||||
|
class MatplotlibTest(App):
|
||||||
|
title = 'Matplotlib Test'
|
||||||
|
|
||||||
|
def build(self):
|
||||||
|
fl = KivyPlot(plot_bar=True)
|
||||||
|
with fl as ax:
|
||||||
|
print('ak=', ax)
|
||||||
|
N = 5
|
||||||
|
menMeans = (20, 35, 30, 35, 27)
|
||||||
|
menStd = (2, 3, 4, 1, 2)
|
||||||
|
|
||||||
|
ind = np.arange(N) # the x locations for the groups
|
||||||
|
width = 0.35 # the width of the bars
|
||||||
|
rects1 = ax.bar(ind, menMeans, width, color='r', yerr=menStd)
|
||||||
|
ax.set_ylabel('得分')
|
||||||
|
ax.set_title('Scores by group and gender')
|
||||||
|
ax.set_xticks(ind + width)
|
||||||
|
ax.set_xticklabels(('G1', 'G2', 'G3', 'G4', 'G5'))
|
||||||
|
|
||||||
|
|
||||||
|
return fl
|
||||||
|
|
||||||
|
MatplotlibTest().run()
|
Loading…
Reference in New Issue
Block a user