Обновление Tkinter Canvas с PyPlot: очень странное поведение - Python3 - PullRequest
0 голосов
/ 19 апреля 2020

Надеюсь, у тебя все хорошо. Я сейчас пишу программу python, и у меня возникла чрезвычайно удивительная и непонятная проблема. Сложная программа воссоздала проблемную часть c. Поэтому я создал простое окно, в которое поместил холст:

canvas = Canvas(main_window, width=1000, height=500)
canvas.grid(row=1, column=0)

image = Image.new('RGB', (900, 400), color='green')
graph = ImageTk.PhotoImage(image)
img = canvas.create_image(0, 0, anchor=NW, image=graph)
canvas.itemconfigure(img, image=graph)

Я также добавил простую кнопку, которая указывает на функцию, позволяющую создать график с помощью PyPlot:

def process_graph():
    plot_fig("Title", "Label", [0, 1, 2, 3], [10, 100, 1000, 10000], 100, 9, 4, False, False)
    image_graph = Image.open("graphnew.jpg")
    graph1 = ImageTk.PhotoImage(image_graph)
    img_graph = canvas.create_image(0, 0, anchor=NW, image=graph1)
    canvas.itemconfigure(img_graph, image=graph1)
    return

А вот функция plot_fig:

def plot_fig(title, lab, x_data, y_data, res=100, width=9.4, height=4.6, x_log=False, y_log=False):
    plt.close('all')
    plt.figure(figsize=(width, height), dpi=res)
    axes = plt.gca()
    plt.plot(x_data, y_data, label=lab)
    if x_log:
        plt.xscale('log')
    else:
        plt.xscale('linear')
    if y_log:
        plt.yscale('log')
    else:
        plt.yscale('linear')
    plt.title(title)
    plt.xlabel("Duration [days]")
    plt.legend()
    plt.savefig("graphnew.jpg", quality=95)
    plt.close('all')
    return

Здесь начинается действительно странное поведение: посмотрите на два параметра x_log и y_log, которые позволяют вам менять оси. Все комбинации работают прекрасно, кроме одной (x_log = False и y_log = False). во всех остальных случаях программа прекрасно работает, но разве она не обновляет sh рисунок ?! Есть что-то, чего я не понимаю? (Я должен указать, что изображение хорошо создано! Но холст трижды останавливается, прежде чем снова становится зеленым). Все остальные комбинации работают хорошо. Вот полный код, если нужно, я был бы очень признателен за вашу помощь, большое спасибо! Матье

import tkinter as tk
from tkinter.filedialog import *
import matplotlib.pyplot as plt
from PIL import Image, ImageTk


main_window = tk.Tk()


def process_graph():
    plot_fig("Title", "Label", [0, 1, 2, 3], [10, 100, 1000, 10000], 100, 9, 4, False, False)
    image_graph = Image.open("graphnew.jpg")
    graph1 = ImageTk.PhotoImage(image_graph)
    img_graph = canvas.create_image(0, 0, anchor=NW, image=graph1)
    canvas.itemconfigure(img_graph, image=graph1)
    return


def plot_fig(title, lab, x_data, y_data, res=100, width=9.4, height=4.6, x_log=False, y_log=False):
    plt.close('all')
    plt.figure(figsize=(width, height), dpi=res)
    axes = plt.gca()
    plt.plot(x_data, y_data, label=lab)
    if x_log:
        plt.xscale('log')
    else:
        plt.xscale('linear')
    if y_log:
        plt.yscale('log')
    else:
        plt.yscale('linear')
    plt.title(title)
    plt.xlabel("Duration [days]")
    plt.legend()
    plt.savefig("graphnew.jpg", quality=95)
    plt.close('all')
    return


button_graph_process = Button(main_window, text="Process", command=process_graph)
button_graph_process.grid(row=0, column=0)

canvas = Canvas(main_window, width=1000, height=500)
canvas.grid(row=1, column=0)
image = Image.new('RGB', (900, 400), color='green')
graph = ImageTk.PhotoImage(image)
img = canvas.create_image(0, 0, anchor=NW, image=graph)
canvas.itemconfigure(img, image=graph)

main_window.mainloop()

1 Ответ

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

Хорошо, я решил проблему. Это была сборка мусора ... Как обновить изображение виджета Tkinter Label? Я сменил Canvas на Label. И добавьте это:

img1 = ImageTk.PhotoImage(Image.open("graphnew.jpg"))
canvas.configure(image=img1)
canvas.image = img1
...