Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2018, 12:12   #1
WiCat
Новичок
Джуниор
 
Регистрация: 25.12.2013
Сообщений: 1
По умолчанию Потоки блокируют окно tkinter и matplotlib

Код работает в два потока и две очереди, но при этом блокируется основное окно. Как исправить чтобы небыло мигания перерисовки и основное окно не блокировалось?

Код:
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):
    #time.sleep(random.random())
    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):
    while True:
        #time.sleep(interval)
        emit(get_xy_from_db(id))
 
 
def poll_db_2(id, emit):
    while True:
        #time.sleep(interval)
        emit(get_xy_from_db(id))
 
# преобразует список в массив координат x и y
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()
WiCat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
matplotlib, numpy и чтение / запись CSV-фалов ViktorR Python 1 26.06.2017 10:15
Python.matplotlib (Отобразить доверительные интервалы функции на графике) PIA111 Python 0 10.02.2016 19:11
Блокируют при парсинге. Schmiss PHP 5 01.02.2013 08:49
Потоки. Почему всё-равно виснет окно? TwiX Общие вопросы Delphi 10 13.12.2009 11:51
TTcpServer и TUdpSocket блокируют порт hawk1 Работа с сетью в Delphi 5 07.12.2006 23:29