Не работает анимированная опция tkinter matplotlib line2D - PullRequest
0 голосов
/ 25 января 2020

Я пытаюсь создать GUI для инструмента, над которым я работаю, и одно из требований заключается в том, что у него есть интерактивная линия, встроенная в график matplotlib. Первоначально, когда я работал только над интерфейсом командной строки, я использовал опцию line2D animated = True для достижения этого вместе с обратными вызовами, которые позволяли манипулировать строкой. Но когда я пытаюсь сделать то же самое с сюжетом, встроенным в tkinter, он не работает. Любой совет? Вот заполнитель класса контроллера -

class SeaofBTCapp(tk.Tk):

def __init__(self, *args, **kwargs):

    tk.Tk.__init__(self, *args, **kwargs)
    self.shared_data = {
        "OCT_filename": tk.StringVar(),
        "bscan_number": tk.StringVar(),
        "layer_name": tk.StringVar()
        }

    # tk.Tk.iconbitmap(self, default="clienticon.ico")
    tk.Tk.wm_title(self, "Sea of BTC client")


    container = tk.Frame(self)
    container.pack(side="top", fill="both", expand = True)
    container.grid_rowconfigure(0, weight=1)
    container.grid_columnconfigure(0, weight=1)

    self.frames = {}

    for F in (StartPage, PageOne, PageTwo):

        frame = F(container, self)

        self.frames[F] = frame

        frame.grid(row=0, column=0, sticky="nsew")

    self.show_frame(StartPage)

def get_page(self, page_class):
        return self.frames[page_class]

def show_frame(self, cont):

    frame = self.frames[cont]
    frame.tkraise()

    menubar = frame.menubar(self)
    self.configure(menu=menubar)

def plot_frame(self, cont):
    frame = self.frames[cont]

    new_points = []

    direc = os.getcwd()
    filename = self.shared_data["OCT_filename"]
    bscanno = self.shared_data["bscan_number"]
    layername = self.shared_data["layer_name"]
    layerno = layer_dict[layername]

    layer = io.imread(direc + '/Results/'+ filename + '/Output_Images' + f'/Image{bscanno}' + f'/Image{bscanno}_layer{layerno}.png')
    Bscan_segments = io.imread(direc + '/Results/' + filename + '/Output_Images' + '/blends' + f'/Blend{bscanno}.png')
    Bscan = io.imread(direc + '/Results/' + filename + '/Input_Images' + f'/image{bscanno}.png')

    ax.cla()
    frame.focus_set()
    im1 = ax.imshow(Bscan, cmap='gray')
    im2 = ax.imshow(Bscan_segments)
    tog = ed.Toggle(im1, im2, frame) # Class for toggling images

    ind2selc = sorted((np.linspace(0,layer.shape[1]-1,40)).astype('int'))
    ind = np.asarray(np.where(layer[:,:]==255))
    ind = ind[:,ind[1,:].argsort()]
    pointsx = ind[1][ind2selc]
    pointsy = ind[0][ind2selc]

    line = Line2D(pointsx, pointsy, animated=True) # This does not show when animated=True
    ax.add_line(line)
    ax.draw_artist(line)

    frame.tkraise()
    menubar = frame.menubar(self)
    self.configure(menu=menubar)

А вот класс, где должна отображаться фигура -

class PageTwo(tk.Frame):

def __init__(self, parent, controller):
    tk.Frame.__init__(self, parent)
    label = tk.Label(self, text="Graph Page!", font=LARGE_FONT)
    label.pack(pady=10,padx=10)

    button1 = ttk.Button(self, text="Back",
                        command=lambda: controller.show_frame(PageOne))
    button1.pack()

    self.canvas = FigureCanvasTkAgg(fig, master=self)
    self.canvas.draw()
    self.canvas.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)

    self.toolbar = NavigationToolbar2Tk(self.canvas, self)
    self.toolbar.update()
    self.canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=True)

def menubar(self, root):
    menubar = tk.Menu(root)
    pageMenu = tk.Menu(menubar)
    pageMenu.add_command(label='Exit', command= quit)
    menubar.add_cascade(label="File", menu=pageMenu)
    return menubar
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...