0 / 0 / 1
Регистрация: 27.11.2017
Сообщений: 6

Ktinter matplotlib два графика с разними потоками и очередями тормозят

05.06.2018, 14:55. Показов 1727. Ответов 2

Студворк — интернет-сервис помощи студентам
Опираясь на код из этой темы

Код работает, но все жутко тормозит, но казалось бы два потока две разных очереди... Что не так?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import random
import pyodbc
import time
import threading
from time import time as timer
from threading import Thread
from queue import Empty, Queue
import tkinter as tk
from array import array
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
 
def get_y_from_db(id): # id
    cnxn = pyodbc.connect('')
    cursor = cnxn.cursor()
    cursor.execute("")
    row = cursor.fetchone()
    if row:
        return row
    
def poll_db(id, emit, interval=1):
    while True:
        time.sleep(interval)
        emit(get_y_from_db(id))
 
def poll_db_2(id, emit, interval=1):
    while True:
        time.sleep(interval)
        emit(get_y_from_db(id))
 
def start_polling_loop(root, q, delay):     
    
    def loop():
        timeout_millis = round(delay - (1000 * timer()) % delay)
        root.after(timeout_millis, loop)
 
        try:
            data = q.get(block=False)
            x,y = makexy(data)            
            a.plot(x, y)
            canvas.draw()
        except Empty:
            return
        
    root.after_idle(loop)  # start
 
def start_polling_loop_2(root, q_2, delay):     
    
    def loop():
        timeout_millis = round(delay - (1000 * timer()) % delay)
        root.after(timeout_millis, loop)
 
        try:
            data = q_2.get(block=False)
            x,y = makexy(data)            
            a1.plot(x, y)
            canvas.draw()
        except Empty:
            return
        
    root.after_idle(loop)  # start
 
if __name__ == "__main__":
    root = tk.Tk()
    q = Queue() # первая очередь для первого графика
    q_2 = Queue() # вторая очередь для второго
    
    #соответствующие потоки
    threading.Thread(target=poll_db, args=[1, q.put], daemon=True).start()
    threading.Thread(target=poll_db, args=[2, q_2.put], daemon=True).start()
 
    start_polling_loop(root, q, delay=40)     
    start_polling_loop_2(root, q_2, delay=40)
    
    f = Figure(figsize=(4, 4), dpi=100)    
    
    a = f.add_subplot(1,2,1) # расширим сетку для второго графика
    a1 = f.add_subplot(1,2,2) # добавим второй график в сетку
 
    canvas = FigureCanvasTkAgg(f, master=root)
    canvas.show()                        
    canvas.get_tk_widget().grid(row=0,column=0)  
 
    root.mainloop()
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.06.2018, 14:55
Ответы с готовыми решениями:

Ускорение обновления графика matplotlib с использованием matplotlib.animation
Всем добрый день. Я пытаюсь оптимизировать вывод графиков matplotlib в режиме реального времени. Пробовал реализовать через plt.plot и...

Обновления графика в matplotlib
Добрый день! Реализовываю график в реальном времени через matplotlib, нашел пример: #!/usr/bin/env python # -*- coding: UTF-8 -*- ...

Построение графика с matplotlib
Не могу разобраться как построить график. График должен выглядеть как на фотографии. Пытался написать код, но что-то не догоняю ...

2
0 / 0 / 1
Регистрация: 27.11.2017
Сообщений: 6
06.06.2018, 22:22  [ТС]
Прошу хотя бы направить, куда двигаться?

Про решение при помощи триггеров я знаю, но у меня SQL Server так что не подходит.
0
0 / 0 / 1
Регистрация: 27.11.2017
Сообщений: 6
08.06.2018, 15:26  [ТС]
Теперь графики рисуются нормально, толшько окно заблокировано и не двигается.
Как сделать чтобы и графики рисовались и окно двигалось?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import random
import threading
import time
import tkinter as tk
from queue import Empty, Queue
from time import time as timer
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
 
 
def get_xy_from_db(id):  # generate dummy data
    #time.sleep(random.random())  # emulate blocking function
    list_x = list(range(1, 16))
    list_y = list(random.sample(range(0,100),15))
    res_lst = list_x + list_y
    return res_lst
 
 
def poll_db(id, emit):  # NOTE: interval is independant from the delay
    while True:
        #time.sleep(interval)
        emit(get_xy_from_db(id))
 
 
def poll_db_2(id, emit):  # NOTE: interval is independant from the delay
    while True:
        #time.sleep(interval)
        emit(get_xy_from_db(id))
 
 
def make_x_y(list_a):    
    done_x=list_a[:15]
    done_y=list_a[15:]    
    return done_x, done_y    
 
 
def start_polling_loop(root, q, delay):
    def loop():
        timeout_millis = round(delay - (1000 * timer()) % delay)
        root.after(timeout_millis, loop)
        a.clear()
        try:
            data = q.get(block=True)
            x, y = make_x_y(data)
            a.plot(x, y)
            canvas.draw()
        except Empty:
            return
 
    root.after_idle(loop)  # start
 
 
def start_polling_loop_2(root, q_2, delay):
    def loop():
        timeout_millis = round(delay - (1000 * timer()) % delay)
        root.after(timeout_millis, loop)
        a1.clear()
        try:
            data = q_2.get(block=True)
            x, y = make_x_y(data)
            a1.plot(x, y)
            canvas.draw()
        except Empty:
            return
 
    root.after_idle(loop)  # start
 
if __name__ == "__main__":
    root = tk.Tk()
    q = Queue()  
    q_2 = Queue()
 
    
    threading.Thread(target=poll_db, args=[1, q.put], daemon=True).start()
    threading.Thread(target=poll_db_2, args=[2, q_2.put], daemon=True).start()
 
    start_polling_loop(root, q, delay=40)
    start_polling_loop_2(root, q_2, delay=40)
 
    f = Figure(figsize=(8, 4), dpi=100)
 
    a = f.add_subplot(1, 2, 1)
    a1 = f.add_subplot(1, 2, 2)
 
    canvas = FigureCanvasTkAgg(f, master=root)
    canvas.show()
    canvas.get_tk_widget().grid(row=0, column=0)
 
    root.mainloop()
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.06.2018, 15:26
Помогаю со студенческими работами здесь

MatPlotLib вывод графика
def temp(x,h,l,k,To): #Variables pg18 a11 = 7 + (4*h*(l*l))/(5*k) a12 = (2*h*(l*l))/(5*k) - 8 a13 = 1 -...

Изменение графика matplotlib
Здравствуйте, вывожу временной ряд с помощью matplotlib, график выводится, для него я хочу поменять название, подписи, цвет значений, но не...

Графика без Matplotlib
Я хочу работать с графикой, но везде только библиотека Matplotlib, можете подсказать нормальную графическую библиотек, а не эту графическую...

Изображение вне графика. matplotlib
Как использую библиотеку python matplotlib добавить изображение к графику? Что бы изображение было за границей рисования. Примерно...

Построение графика через Matplotlib
Traceback (most recent call last): File "C:\Users\admin\Desktop\регресия\Regressia__kopia.py", line 8, in <module> import...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

Новые блоги и статьи
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Номеклатура. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru