繁体   English   中英

Tkinter中用鼠标画选区

[英]Drawing a selection area with mouse in Tkinter

我正在开发一个应用程序,它以.csv形式从用户那里获取输入,并使用matplotlib绘制相应值的图形。

def plotgraph():
    x = []
    y = []
    data = text.get("1.0", END)
    sepFile = data.split('\n')

    for plotPair in sepFile:
        xAndY = plotPair.split(',')
        if len(xAndY[0]) != 0 and len(xAndY[1]) != 0:
            x.append(float(xAndY[0]))
            y.append(float(xAndY[1]))

    graph = Figure(figsize=(5,4), dpi=100)
    a = graph.add_subplot(111)
    a.plot(x,y)
    a.set_xlabel('Velocity')
    a.set_ylabel('Absorbance')
    canvas = FigureCanvasTkAgg(graph, master=RightFrame)
    canvas.show()
    canvas.get_tk_widget().grid(column=2, row=1, rowspan=2, sticky=(N, S, E, W))

我想要一个类似的 function 像这样 Matplotlib:用鼠标在Tkinter绘制一个矩形的选择区域,选择后会给出x0, x1, y0, y1 我可以使已经问过的问题起作用并根据我的需要对其进行自定义,但不知道我在__init__(self)中做错了什么

root = Tk()
class Annotate(object):
    def __init__(self):
        self.fig = mplfig.Figure(figsize=(1.5, 1.5))
        self.ax = self.fig.add_subplot(111)
        self.ax.plot([0,1,2,3,4],[0,8,9,5,3])        
        self.canvas = tkagg.FigureCanvasTkAgg(self.fig, master=root)
        self.x0 = None
        self.y0 = None
        self.x1 = None
        self.y1 = None
        self.ax.figure.canvas.mpl_connect('button_press_event', self.on_press)
        self.ax.figure.canvas.mpl_connect('button_release_event', self.on_release)
        self.ax.figure.canvas.mpl_connect('motion_notify_event', self.on_motion)

当我运行这段代码时,我得到一个空白的 Tk window。谁能告诉我我应该做什么以及我做错了什么

要使用课程,您需要在列表中输入以下内容

class Annotate(object):
    def __init__(self):
        print "Annotate is runing"
        # rest of your code

root = Tk()
my_object = Annotate()

root.mainloop()

也许您将需要更多的工作。

我认为现在最简单的方法是使用NavigationToolbar2Tk matplotlib class,它提供了一个带有缩放选择器、滚动条等的内置工具栏。

这显示在“Tk 中的嵌入”示例中,在上面的代码中将转换为类似以下内容:

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk

def plotgraph():
    x = []
    y = []
    data = text.get("1.0", END)
    sepFile = data.split('\n')

    for plotPair in sepFile:
        xAndY = plotPair.split(',')
        if len(xAndY[0]) != 0 and len(xAndY[1]) != 0:
            x.append(float(xAndY[0]))
            y.append(float(xAndY[1]))

    graph = Figure(figsize=(5,4), dpi=100)
    a = graph.add_subplot(111)
    a.plot(x,y)
    a.set_xlabel('Velocity')
    a.set_ylabel('Absorbance')
    canvas = FigureCanvasTkAgg(graph, master=RightFrame)
    canvas.show()
    canvas.get_tk_widget().grid(column=2, row=1, rowspan=2, sticky=(N, S, E, W))

    # set pack_toolbar to False to be able to use grid to set position
    toolbar = NavigationToolbar2Tk(canvas, RightFrame, pack_toolbar=False)
    toolbar.grid(column=2, row=3, stick="nw")
    toolbar.update() 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM