【发布时间】:2014-09-05 01:56:52
【问题描述】:
我正在开发一个应用程序,它允许用户根据他们的选择缩放图表的一部分。我能够得到初始的 x, y 坐标(x0, y0) 以及最终的 x, y 坐标(x1, y1)。但完全不知道为什么选择区域没有出现。
from Tkinter import *
matplotlib.use('TkAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
root = Tk()
graph = Figure(figsize=(5,4), dpi=100)
ax = graph.add_subplot(111)
plot = ax.plot([1,2,3,4],[5,6,2,8])
canvas = FigureCanvasTkAgg(graph, master=root)
canvas.show()
canvas.get_tk_widget().grid(column=2, row=1, rowspan=2, sticky=(N, S, E, W))
class Zoom(object):
def __init__(self):
self.graph = Figure(figsize=(5,4), dpi=100)
self.ax = graph.add_subplot(111)
self.rect = ax.patch
self.rect.set_facecolor('green')
self.ax.plot([1,2,3,4],[5,6,2,8])
self.is_pressed = False
self.x0 = None
self.y0 = None
self.x1 = None
self.y1 = None
self.aid = graph.canvas.mpl_connect('button_press_event', self.on_press)
self.bid = graph.canvas.mpl_connect('button_release_event', self.on_release)
self.cid = graph.canvas.mpl_connect('motion_notify_event', self.on_motion)
def on_press(self, event):
print 'press'
self.is_pressed = True
self.x0 = event.xdata
self.y0 = event.ydata
print(self.x1, self.x0)
print(self.y1, self.y0)
def on_motion(self, event):
if self.is_pressed is True:
print 'panning'
self.x1 = event.xdata
self.y1 = event.ydata
print(self.x1, self.x0)
print(self.y1, self.y0)
self.rect.set_width(self.x1 - self.x0)
self.rect.set_height(self.y1 - self.y0)
self.rect.set_xy((self.x0, self.y0))
self.rect.set_linestyle('dashed')
self.ax.figure.canvas.draw()
def on_release(self, event):
print 'release'
self.is_pressed = False
self.x1 = event.xdata
self.y1 = event.ydata
print(self.x1, self.x0)
print(self.y1, self.y0)
self.rect.set_width(self.x1 - self.x0)
self.rect.set_height(self.y1 - self.y0)
self.rect.set_xy((self.x0, self.y0))
self.rect.set_linestyle('solid')
self.ax.figure.canvas.draw()
my_object = Zoom()
root.mainloop()
我从这个问题中得到了帮助Matplotlib: draw a selection area in the shape of a rectangle with the mouse 我得到的输出是
press
(0.0, 1.4007056451612905)
(0.0, 6.9296116504854366)
panning
(1.4007056451612905, 1.4007056451612905)
(6.8932038834951452, 6.9296116504854366)
panning
(None, 1.4007056451612905)
(None, 6.9296116504854366)
panning
(None, 1.4007056451612905)
(None, 6.9296116504854366)
release
(None, 1.4007056451612905)
(None, 6.9296116504854366)
【问题讨论】:
-
平移时是否离开画布?
-
@MrAlias 不,我只是移动了一下,鼠标光标从原始位置的像素运动会生成
None。
标签: python matplotlib tkinter