Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 10.06.2018, 13:12   #1
WiCat
Новичок
 
Регистрация: 25.12.2013
Сообщений: 1
Репутация: 10
По умолчанию Потоки блокируют окно 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 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


12:44.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru