Поведение переданной ссылки на участок, отличное в прямой ссылке и в списке - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь написать функцию для обновления диаграммы matplotlib после выбора в выпадающем списке.Я не понимаю разницу в поведении.В полной программе и в упрощенной версии ниже я создаю подпункт «а» и могу передать его функции («тестер»), и он изменит атрибуты подпунктов, как и ожидалось.Но если я передам субплот как запись в лямбда-функции в запись Comboboxselected, она не будет работать.Почему разница?

Когда выполняется следующее, ось x графика выглядит как «XAXIS RESET BY TESTER», как и ожидалось, учитывая вызов tester ().Когда выбрана новая запись в выпадающем списке, update_chart () правильно печатает выбор в выпадающем списке, правильно печатает сопровождающий тестовый параметр "ZERO", но ось x на диаграмме не изменяется.Почему разница в поведении?

Следующий автономный код воспроизводит проблему:

# -*- coding: utf-8 -*-
from tkinter import ttk
import tkinter as tk
from tkinter.scrolledtext import ScrolledText
import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg,
                                               NavigationToolbar2TkAgg)
from matplotlib.figure import Figure

def make_chart_page(nb, chartPage):
    labelFrameChart = tk.LabelFrame(chartPage, text="Chart control:")
    labelFrameChart.pack(side="left", fill="y", padx=5, pady=5)
    comboChart = ttk.Combobox(labelFrameChart, values=["Foos", "Bars", "Widgets"], width=25)
    comboChart.pack(anchor="w", padx=5)
    f = Figure(figsize=(7,5), dpi=100)
    a = f.add_subplot(111)
    canvas = FigureCanvasTkAgg(f, chartPage)
    canvas.show()
    canvas.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)
    canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
    data = [ "ZERO", a ]
    comboChart.bind("<<ComboboxSelected>>", lambda event, args=data: callback(event, args))

    tester(a)

def tester(a):
    a.set_xlabel("XAXIS RESET BY TESTER")

def update_chart(combo, var0, chart):
    print ("Combobox choice is: ", combo)
    print ("Args[0] is: ", var0)
    chart.set_xlabel("Xaxis reset by Update_Chart")

def callback(eventObject, args):
    update_chart(eventObject.widget.get(), args[0], args[1])

def demo():
    root = tk.Tk()
    nb = ttk.Notebook(root)
    chartPage = ttk.Frame(nb)

    make_chart_page(nb, chartPage)

    nb.add(chartPage, text='Charts')
    nb.pack(expand=1, fill="both")

    root.mainloop()

if __name__ == "__main__":
    demo()

Спасибо, Рэнди

1 Ответ

0 голосов
/ 25 июня 2019

Вам просто нужно перерисовать холст снова, позвонив canvas.draw_idle().

def make_chart_page(nb, chartPage):
    ...
    global canvas
    canvas = FigureCanvasTkAgg(f, chartPage)
    ...

def update_chart(combo, var0, chart):
    print("Combobox choice is: ", combo)
    print("Args[0] is: ", var0)
    chart.set_xlabel("Xaxis reset by Update_Chart")
    canvas.draw_idle()
...