Замена содержимого FigureCanvasTkAgg при повторном нажатии кнопки в Tkinter - PullRequest
0 голосов
/ 01 апреля 2020

Я застрял в решении этой проблемы. У меня есть кнопка анализа, которая вызывает функцию, которая создает сложный граф с помощью matplotlib и помещает его в фрейм на моем tkinter GUI как FigureCanvasTkAgg. В GUI пользователь должен иметь возможность снова нажать анализ и снова запустить анализ, а существующие рисунок и панель инструментов должны быть заменены новыми. С моим кодом панели инструментов накапливаются при каждом новом нажатии кнопки, и цифры также начинают складываться.

root = tk.ThemedTk()
analyse_button.place(x=70, y=350, anchor='w', height=30, width=210)

def analysis()
    ...
    f = Figure(figsize=(8, 5), dpi=125)
    a = f.add_subplot(111)
    graph = nx.Graph()
    ...

    frm = Frame(root, width=700, height=500)
    frm.place(x=240, y=420, anchor='w')

    canvas = FigureCanvasTkAgg(f, master=frm)
    canvas.draw()
    canvas.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1)

    toolbar = NavigationToolbar2Tk(canvas, root)
    toolbar.configure(bg="white")
    toolbar.update()
    canvas._tkcanvas.pack()

...
root.mainloop()

Я пытался проверить, существуют ли уже frm и toolbar, чтобы уничтожить их, если они это сделают, до создания новых.

if frm.winfo_exists():
    if toolbar.winfo_exists():
        frm.destroy()
        toolbar.destroy()

Это, конечно, дает мне ошибку, что frm и toolbar не определены.

Любые предложения о том, как подойти к этому?

1 Ответ

0 голосов
/ 02 апреля 2020

Вы, кажется, не знаете, что такое локальная переменная. Кроме того, ваши переменные не объявлены сначала. Самое простое решение (хотя обычно глупое) - использовать sth. например:

root = tk.ThemedTk()
analyse_button.place(x=70, y=350, anchor='w', height=30, width=210)

frm = None
toolbar = None

def analysis():
    global frm, toolbar
    if rfm is not None and frm.winfo_exists():
        if toolbar is not None and toolbar.winfo_exists():
            frm.destroy()
            toolbar.destroy()
    ...
    f = Figure(figsize=(8, 5), dpi=125)
    a = f.add_subplot(111)
    graph = nx.Graph()
    ...

    frm = Frame(root, width=700, height=500)
    frm.place(x=240, y=420, anchor='w')

    canvas = FigureCanvasTkAgg(f, master=frm)
    canvas.draw()
    canvas.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1)

    toolbar = NavigationToolbar2Tk(canvas, root)
    toolbar.configure(bg="white")
    toolbar.update()
    canvas._tkcanvas.pack()

...
root.mainloop()

Использование ключевых слов global или nonlocal обычно является плохой практикой, изучите простые принципы OOP, чтобы избежать этого. Надеюсь, что это полезно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...