concurrent.futures, селен и проблема заморозки ткинтера - PullRequest
0 голосов
/ 28 марта 2020

У меня есть проблема, которую я не могу понять с этими библиотеками.

Мой основной код выглядит так:

import tkinter as tk
import concurrent.futures
from news_bar import NewsBar        
from fbscout import FbScout         #it bases on sellenium

def run():
    scout.login(USER_EMAIL, USER_PASS)

    while True:
        news = str(scout.check_news())
        if news:
            news_bar.add_text(news)

if __name__ == "__main__":
root = tk.Tk()
news_bar = NewsBar(root)
scout = FbScout.Scrpper()
scout.set_groups(GROUPS)

with concurrent.futures.ThreadPoolExecutor() as executor:
    gui = executor.submit(news_bar.mainloop())
    sc = executor.submit(scout.run_browser())
    run = executor.submit(run())

Программа зависает и не выполняет остальную часть кода после работает tkinter's gui mainl oop.

gui = executor.submit(news_bar.mainloop())

Я не знаю, как приказать программе не ждать бесконечного выполнения l oop ... Когда я закрываю окно tkinter, он идет правильным путем дальше

КОММЕНТАРИЙ: Подводя итог. У меня есть две функции news_bar.mainl oop (), которая ожидает события, и run (), которая бесконечна l oop. И я хочу, чтобы они работали одновременно и независимо друг от друга.

Ответы [ 2 ]

1 голос
/ 28 марта 2020

Функция mainl oop не завершена, пока вы не закроете окно (при условии, что вы не передали аргумент).

Возможно, другой поток решит вашу проблему?

0 голосов
/ 28 марта 2020

Works! Необходимо создать новый класс, унаследовавший первый основной класс tkinter, внутри которого был размещен базовый модуль селена.

class FbBar(NewsBar):
def __init__(self, master):
    NewsBar.__init__(self, master)
    scout = FbScout.Scrpper()
    scout.set_groups(GROUPS)
    self.update()
    t = threading.Thread(target=self.prepare_browser, args=[scout])
    t.start()

@staticmethod
def prepare_browser(scout):
    scout.run_browser()
    scout.login(USER_EMAIL, USER_PASS)



root = tk.Tk()
news_bar = FbBar(root)
news_bar.mainloop()
...