Функция figure.canvas.draw_idle() от matplotlib со временем перестает обновлять график

Viteck116

Новичок
Пользователь
Дек 19, 2023
4
1
3
Здравствуйте!
Помогите пожалуйста новичку. Ситуация следующая - на Python пишу программу, принимающую котировки с двух терминалов Metatrader5 через TCP/IP и выводящую эти данные на график. Windows 11, Python 3.10(64 бит), matplotlib 3.8.2, пишу в VS,
Чтобы график обновлялся в реальном времени, применяю функцию figure.canvas.draw_idle(). Поначалу все работает отлично, через некоторое время, хотя новые данные продолжают поступать, но линии на графике замирают. Такое впечатление, что ,,,draw_idle() перестает обновлять. Как можно это поправить? В остальном программа работает нормально. Интерпретатор ошибок не выдает.
P.S. Добавлю - если окно программы находится на переднем плане в фокусе, то все работает нормально. Стоит открыть другое приложение поверх, через некоторое время график останавливается.
==========================
Вопрос закрыт, я решил проблему сам.
==========================
Ниже фрагмент кода, отвечающий за отрисовку графиков:
Python:
# create the main window
root = Tk()
# title at the top of the window
root.title("MT5 Socket Server Vital$oft(c) 2023")
# main window dimensions
root.geometry("1280x600")
# main window color
root['bg'] = 'gainsboro'
# create a frame for the chart
frameUp = Frame(root, borderwidth = 1, relief=RAISED)
# frame location
frameUp.place(x=10, y=100, width=1260, height=450)
# create a figure
figure =plt.Figure(figsize=(6, 4), dpi=100, facecolor = 'gainsboro')
# create FigureCanvasTkAgg object
figure_canvas = FigureCanvasTkAgg(figure, master=frameUp)
# create the toolbar
toolbar = NavigationToolbar2Tk(figure_canvas, root)
#toolbar['bg'] = 'gainsboro'
toolbar.update()
# create axes
#axes = figure.add_subplot(1, 1, 1)
axes = figure.subplots()
# to draw the second line
axes2 = axes.twinx()
# background graphics black
axes.set_facecolor('black')
widg = figure_canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)

# draw lines based on the received data
# socket 1
def graph1(X,Y):
    # clear
    axes.clear()
    # grid
    #axes.grid()
    # line draw
    axes.plot(X, Y, color='red', linewidth=1)
    figure.canvas.draw_idle()
    figure.canvas.flush_events()
    time.sleep(0.02)
 
# socket 2
def graph2(X,Y):
    # clear
    axes2.clear()
    # grid
    #axes.grid()
    # line draw
    axes2.plot(X, Y, color='blue', linewidth=1)
    figure.canvas.draw_idle()
    figure.canvas.flush_events()
    time.sleep(0.02)
 
 
    # working in the main process
    root.mainloop()
 
Последнее редактирование:

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 584
458
83
Вопрос закрыт, я решил проблему сам.
было бы неплохо описать, как вы ее решили, для будущих посетителей
 

Viteck116

Новичок
Пользователь
Дек 19, 2023
4
1
3
было бы неплохо описать, как вы ее решили, для будущих посетителей
Применил after tcl команды. Честно говоря, действовал методом перебора вариантов. Поэтому так и не понял, почему не работало раньше и почему заработало сейчас. Но заработало.

Python:
# draw lines based on the received data
# socket 1
def graph1(X,Y):
    # clear
    axes.clear()
    # grid
    #axes.grid()
    # line draw
    axes.plot(X, Y, color='red', linewidth=1)
     
# socket 2
def graph2(X,Y):
    # clear
    axes2.clear()
    # grid
    #axes2.grid()
    # line draw
    axes2.plot(X, Y, color='blue', linewidth=1)    
   
# updating the canvas so that the lines move is launched in a separate thread
def CanvasDraw():
    # root.after()
    root.after(100, CanvasDraw)
    # lines refresh
    figure.canvas.draw_idle()
    figure.canvas.flush_events()
    

   
    # root.after()
root.after_idle(CanvasDraw)
#---
# working in the main process
root.mainloop()
 
  • Мне нравится
Реакции: regnor

Форум IT Специалистов