Надеюсь, у тебя все хорошо. Я сейчас пишу программу 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()