zvepb
@zvepb

Как правильно реализовать многопоточность в Tkinter?

Проблема в том, что в функции pr -> printing происходят достаточно долгие вычисления, и в этот момент окно виснет и не отвечает, а вывод в поле текста происходит только после окончания основного процесса вычисления. Как правильно реализуются потоки? Использую Треды, но это не помогает в данном примере, все равно виснет окно, как сделать вычисления отдельными от функции mainloop() здесь?

#!/usr/bin/env python
import os
import threading
import time

from tkinter import *
import tkinter as tk
from tkinter import ttk
from tkinter import scrolledtext  


class MainWindow(tk.Frame):
    def __init__(self, root):
        super().__init__(root)
        self.init_main()


    def init_main(self):
        lb_log = Label(text=u"логин ")
        lb_log .pack()
        ent_value_log = Entry(width=40)
        ent_value_log .pack()
        lb_pass = Label(text=u"пароль ")
        lb_pass.pack()
        ent_value_pass = Entry(width=40)
        ent_value_pass.pack()
        btn_print = ttk.Button(text='print', command=lambda: self.printing(ent_value_log.get(), ent_value_pass.get()))
        btn_print .place(x=340, y=20)
        self.console = scrolledtext.ScrolledText(state='disable')
        self.console.pack(pady=15)


    def insert_to_console(self, text):
        self.console.configure(state='normal')  # enable insert
        self.console.insert(END, text)
        self.console.yview(END)  # autoscroll
        self.console.configure(state='disabled')


    def pr(self, login, password):
        self.insert_to_console(login + ' ' + password)
        time.sleep(5)
        self.insert_to_console(login + ' ' + password)
        time.sleep(5)

    def printing(self, login, password):
        pycrypt = threading.Thread(target=self.pr(login, password))
        pycrypt.start()

    def run_app():
        root = tk.Tk()
        app = MainWindow(root)
        root.title("palevo")
        root.geometry("420x400")
        root.mainloop()

zv = MainWindow
zv.run_app()
  • Вопрос задан
  • 921 просмотр
Решения вопроса 1
sanya84
@sanya84
Фанатик Python 3
pycrypt = threading.Thread(target=self.pr, args=(login, password))
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@MEDIOFF
Python Developer
В Python потоки не параллельны(да в прочем они и так не параллельны сами по себе, так как python юзает потоки OS), почитайте про GIL, если вкратце, у вас всегда активен только один поток, и разницы нет что вы в основном потоке считаете, что в отдельном, работает только один и пока он держит GIL все другие ждут(на самом деле у вас прога будет работать даже медленней с потоками, в случае CPU-bound задач ибо у вас тратиться время на переключение контекста еще), так что если ваша задача это вычисления - то выносите эту задачу в отдельные процесс, библиотечка multiprocessing вам в помощь
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы