Tkinter зависает при выполнении программы
Проект - имитация работы магазина. Как понял, зависание Tkinter явление частое, даже при выполнении несложных функций. Как тут можно реализовать многопоточность, чтобы избежать зависания интерфейса?
import random
import time
from tkinter import *
from Shop import Shop
from CashDesk import CashDesk
from Client import Client
from Division import Division
def start_imitation():
global flag
flag = True
global button_imitation
button_imitation = Button(text="Завершить", command=end_imitation)
global msg
msg = Label(window, text="Нажмите, чтобы заврешить имитацию работы магазина\nи посмотреть статистику", fg="#ABC8E4", bg="#0832CB", height=5)
imitation()
def end_imitation():
global flag
flag = False
def imitation():
while flag:
# Внутри магаза
if random.randint(1, 3) == 1:
shop.set_seasonal_products()
shop.process_seasonal()
shop.end_seasonal()
shop.bringing_products()
shop.spoilage_of_products()
clients_after_service = []
for cash_desk in list_cash_desks:
for client in cash_desk.get_clients_after_service():
clients_after_service.append(client)
# Клиенты, которые еще не закончили покупать
for client_now in clients_after_service:
lenght_queue = random.randint(2, 10)
client = Client(lenght_queue, client_now, shop)
right_divisions = client.get_right_division(shop.get_list_division())
min_queue = 10000000000
right_cash_desk = None
for division in right_divisions:
for cash_desk in division.get_list_cash_desk():
queue = len(cash_desk)
if queue < min_queue:
min_queue = queue
right_cash_desk = cash_desk
if min_queue < lenght_queue:
right_cash_desk.add_to_queue(client_now)
else:
shop.refund_products(client_now)
for cash_desk in list_cash_desks:
cash_desk.client_after_service_none()
# Клиенты
quantity_clients = random.randint(0, 3)
for i in range(quantity_clients):
shop.client_came(quantity_clients)
shopping_list = {}
quantity_products = random.randint(2, 10)
for i in range(quantity_products):
quantity_product = random.randint(1, 10)
shopping_list[random.choice(shop.get_names_products())] = quantity_product
lenght_queue = random.randint(2, 10)
client = Client(lenght_queue, shopping_list, shop)
client.filling_the_basket(client.get_shopping_list())
right_divisions = client.get_right_division(shop.get_list_division())
client.search_min_queue(right_divisions)
for cash_desk in shop.get_list_cash_desks():
cash_desk.sales_process()
time.sleep(2)
window = Tk()
window.title("Магазин")
window.geometry("300x200")
window["bg"] = "#0832CB"
msg = Label(window, text="Нажмите, чтобы начать\nимитацию работы магазина", fg="#ABC8E4", bg="#0832CB", height=5)
msg.pack()
button_imitation = Button(text="Начать", command=start_imitation)
button_imitation.pack()
flag = False # Отвечает за цикл while
dairy_products = ['Молоко', 'Творог', 'Йогурт', 'Кефир', 'Сметана', 'Сливки', 'Ряженка', 'Сгущеное молоко']
meat_products = ['Курица', 'Свинина', 'Говядина', 'Колбаса', 'Сосиски', 'Куриные крылышки', 'Котлеты', 'Сардельки']
fruits = ['Яблоко', 'Банан', 'Персик', 'Абрикос', 'Груша', 'Киви', 'Апельсин', 'Виноград']
vegetables = ['Картофель', 'Томат', 'Авакадо', 'Огурец', 'Лук', 'Капуста', 'Кабачок', 'Редис']
cash_desk_dairy1 = CashDesk(dairy_products)
cash_desk_dairy2 = CashDesk(dairy_products)
cash_desk_dairy3 = CashDesk(dairy_products)
cash_desks_dairy = [cash_desk_dairy1, cash_desk_dairy2, cash_desk_dairy3]
division_dairy = Division(dairy_products, cash_desks_dairy, "Молочные продукты")
for cash_desk in cash_desks_dairy:
cash_desk.set_division(division_dairy)
cash_desk_meat1 = CashDesk(meat_products)
cash_desk_meat2 = CashDesk(meat_products)
cash_desk_meat3 = CashDesk(meat_products)
cash_desk_meat4 = CashDesk(meat_products)
cash_desks_meat = [cash_desk_meat1, cash_desk_meat2, cash_desk_meat3, cash_desk_meat4]
division_meat = Division(meat_products, cash_desks_meat, "Мясные продукты")
for cash_desk in cash_desks_meat:
cash_desk.set_division(division_meat)
cash_desk_fruit1 = CashDesk(fruits)
cash_desk_fruit2 = CashDesk(fruits)
cash_desk_fruit3 = CashDesk(fruits)
cash_desks_fruit = [cash_desk_fruit1, cash_desk_fruit2, cash_desk_fruit3]
division_fruit = Division(fruits, cash_desks_fruit, "Фрукты")
for cash_desk in cash_desks_fruit:
cash_desk.set_division(division_fruit)
cash_desk_vegetables1 = CashDesk(vegetables)
cash_desk_vegetables2 = CashDesk(vegetables)
cash_desks_vegetables = [cash_desk_vegetables1, cash_desk_vegetables2]
division_vegetables = Division(vegetables, cash_desks_vegetables, "Овощи")
for cash_desk in cash_desks_vegetables:
cash_desk.set_division(division_vegetables)
list_divisions = [division_dairy, division_meat, division_fruit, division_vegetables]
list_cash_desks = [cash_desk_dairy1, cash_desk_dairy2, cash_desk_dairy3, cash_desk_meat1, cash_desk_meat2,
cash_desk_meat3, cash_desk_meat4, cash_desk_fruit1, cash_desk_fruit2, cash_desk_fruit3,
cash_desk_vegetables1, cash_desk_vegetables2]
shop = Shop(list_divisions, list_cash_desks)
shop.create_list_products_sold()
for cash_desk in list_cash_desks:
cash_desk.set_shop(shop)
clients_after_service = [] # Клиенты, которые еще должны пройти на другие кассы
window.mainloop()
Источник: Stack Overflow на русском