Здравствуйте!
Помогите пожалуйста новичку. Ситуация следующая - на Python пишу программу, принимающую котировки с двух терминалов Metatrader5 через TCP/IP и выводящую эти данные на график. Windows 11, Python 3.10(64 бит), matplotlib 3.8.2, пишу в VS,
Чтобы график обновлялся в реальном времени, применяю функцию figure.canvas.draw_idle(). Поначалу все работает отлично, через некоторое время, хотя новые данные продолжают поступать, но линии на графике замирают. Такое впечатление, что ,,,draw_idle() перестает обновлять. Как можно это поправить? В остальном программа работает нормально. Интерпретатор ошибок не выдает.
P.S. Добавлю - если окно программы находится на переднем плане в фокусе, то все работает нормально. Стоит открыть другое приложение поверх, через некоторое время график останавливается.
==========================
Вопрос закрыт, я решил проблему сам.
==========================
Ниже фрагмент кода, отвечающий за отрисовку графиков:
Помогите пожалуйста новичку. Ситуация следующая - на 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()
Последнее редактирование: