Добрый день, мне необходимо чтобы функция def unit_and_task_arr(self): вызывала функцию def timer(self): , функция def timer(self): должна вызвать(запустить) функцию def work_unit(self): и потом при каждом выполнении условия if self.count_timer == self.trigger_time: вызывать (запускать ) функцию def work_unit(self): снова. Проблема в том что сам таймер запускается в функции def timer(self): , а команды self.work_unit() не срабатывают и функция def work_unit(self) не запускается
from tkinter import *
import random
import time
root = Tk()
root.title('Round robin') # надпись на верху
root.geometry('850x500+300+200') # ширина=500, высота=400, x=300, y=200 размер окна
root.resizable(True, False) # размер окна может быть изменён только по горизонтали
class WindowUnit():
def __init__(self, main):
self.listbox = Listbox(main, height=25, width=35, selectmode=EXTENDED) # список с пунктами из листа list_performer
self.field_call = Label(main, text='Список исполнителей', width=18, font=10, justify=LEFT)
self.field_call.grid(row=0, column=0)
self.listbox.grid(row=1, column=0)
self.button_new = Button(main, text='New', width=16, font=10, command=self.unit_and_task_arr) # кнопка New на первом листе
self.button_new.grid(row=3, column=0, sticky='s') # расположение кнопки New
self.unit = Unit() # ссылка на класс исполнители
self.task = Task() # ссылка на класс задачи
self.count_timer = 0 # счетчик таймера
self.trigger_time = 5 # время срабатывания
self.list_unit_and_task = {} # массив для хранения исполнителей и задач
def unit_and_task_arr(self): # формируем два списока исполнителей и задач self.list_unit_and_task-для работы и self.list_unit_and_task_to_display для отображения
self.unit.unit_generate() # запускаем в классе Unit функцию unit_generate(), формируем список исполнителей
self.task.task_generate() # # запускаем в классе Task функцию task_generate(), формируем список задач
shift = 0
for keys in self.unit.arr_unit: # формируем рабочий словарь self.list_unit_and_task вида {'Ivan 7': ['Пашет', 'Лудит', 'Закапывает'], 'Vasya 5': ['Сеет', 'Паяяет', 'Откапывает']}
self.list_unit_and_task[keys] = [self.task.arr_task[val] for val in range(shift, len(self.task.arr_task), len(self.unit.arr_unit))] # генератор списков в словаре
# Первому ключу из self.unit.arr_unit присваивается первое значение из self.task.arr_task,
# второму -- вторая и т. д. N+1 - я задача снова назначается первому ключу, и так далее по кругу.
shift += 1
# формируем отдельный словарь для отображения в программе исполнитель и первая завдача в списке
int_arr_unit = []
for key in self.list_unit_and_task: # формируем список из ключей
int_arr_unit.append(key)
int_arr_task = []
for key in self.list_unit_and_task: # формируем список из первых задач
int_arr_task.append(self.list_unit_and_task[key][0])
self.list_unit_and_task_to_display = []
for i in range(len(int_arr_unit)): # обьеденяем два списка в один вложенный список [['Алекс 8', 'Выпил 8'], ['Абросимова 9', 'Сьел 9'], [' Алекс 7', ' Вдохнул 7']]
inter_arr_displey = str(int_arr_unit[i]) + ' ' + str(int_arr_task[i])
self.list_unit_and_task_to_display.append(inter_arr_displey)
# это обьединялка в один словарь self.list_unit_and_task_to_display{}
for unit in self.list_unit_and_task_to_display: # пробегаем по словарю передаем в программу
self.listbox.insert(END, unit)
self.timer() # запускаем функцию работу таймера
def timer(self):
self.work_unit()
while True:
time.sleep(1) # in seconds
self.count_timer += 1
print(self.count_timer)
if self.count_timer == self.trigger_time:
self.count_timer = 0
self.work_unit()
def work_unit(self): # моделируем работу # на каждое срабатывание таймера бежим по рабочему словарю вычитаем из сложности первой задачи производительность юнита
count = 0
for key in self.list_unit_and_task: # бежим по словарю
if self.list_unit_and_task[key] != []: # останавливаем работу когда все задачи удалены
count += 1
if count == 0:
break
for key in self.list_unit_and_task: # бежим по словарю
if self.list_unit_and_task[key] == []:
continue
lvl_unit = int(key[-2:]) # вытаскиваем из кей значения производительности юнита от строка поэтому тащим срез
lvl_first_task = int(self.list_unit_and_task[key][0][-3:]) # вытаскиваем производительность задачи , она тоже строка поэтому срез
rest_of_task = lvl_first_task - lvl_unit # минусуем из сложности производительность
if rest_of_task <= 0: # если задача выполнена те сложность меньше нуля
self.list_unit_and_task[key].pop(0) # удаляем задачу , она первая в массиве
if rest_of_task > 0:
inter_list_unit_and_task = self.list_unit_and_task[key][0][:-3]
inter_list_unit_and_task_1 = inter_list_unit_and_task + ' ' + str(rest_of_task)
self.list_unit_and_task[key][0] = inter_list_unit_and_task_1
class WindowTask():
def __init__(self, main):
self.field_result = Label(main, height=25, width=55) # список с пуктами из листа list
self.field_call = Label(main, text='Список задач', width=18, font=10, justify=LEFT)
self.field_call.grid(row=0, column=1)
self.field_result.grid(row=1, column=1)
self.window_unit = WindowUnit(main)
main.bind('<Button-1>', self.click_on_key)
def click_on_key(self, event):
cursor = list(self.window_unit.listbox.curselection()) # Метод curselection() позволяет получить в виде кортежа индексы выбранных элементов экземпляра Listbox.
for keys in cursor:
# чтобы сделать в столбик вместо Label работать с классом Listbox
inter_list_unit_and_task = list(self.window_unit.list_unit_and_task.values()) # можно отобразить список задач без {} фигурных скобок инф в Tkinter2
if True:
self.field_result['text'] = inter_list_unit_and_task[keys]
class WindowWork():
def __init__(self, main):
self.listbox = Listbox(main, height=25, width=35, selectmode=EXTENDED) # список с пунктами из листа list
self.list = [] # список пунктов в списке
for i in self.list:
self.listbox.insert(END, i)
self.field_call = Label(main, text='Список работ', width=15, font=10, justify=LEFT)
self.field_call.grid(row=0, column=2)
self.listbox.grid(row=1, column=2)
class Unit(): # класс исполнитель
def __init__(self, sum=3, min_speed=1, max_speed=99):
self.sum_unit = sum # количество исполнителей
self.min_speed_unit = min_speed # мин производительность
self.max_speed_unit = max_speed # макс производительность
def unit_generate(self): # генерируем список исполнитерлей вида "Вася 5" случайным образом, где вася имя спонителя а 5 его производительность
unit_names = ('Варвара', 'Вася', 'Наталья', 'Лидия', 'Федор', 'Петя', 'Агафона', 'Алла', 'Светлана', 'Рената', 'Анна', 'Алекс', 'Жанна', 'Пол', 'Мария', 'Тор')
self.arr_unit = []
for i in range(self.sum_unit):
self.arr_unit.append("".join(random.choice(unit_names) + " " + str(random.randint(self.min_speed_unit, self.max_speed_unit))))
class Task(): # класс задачи
def __init__(self, sum=10, min_complex=200, max_complex=500):
self.sum_task = sum # количество задач
self.min_complexity_task = min_complex # мин сложность задачи
self.max_complexity_task = max_complex # макс сложность задачи
def task_generate(self): # генерируем список задач вида "лудит 5" случайным образом, где Лудит вид задачи а 5 ее сложность
task_names = ('Пашет', 'Сеет', 'Собирает', 'Починяет', 'Лудит', 'Паяяет', 'Культивирует', 'Копает', 'Закапывает', 'Откапывает', 'Режет', 'Чистит', 'Полирует', 'Выращивает')
self.arr_task = []
for i in range(self.sum_task):
self.arr_task.append("".join(random.choice(task_names) + " " + str(random.randint(self.min_complexity_task, self.max_complexity_task))))
window_unit = WindowUnit(root)
WindowTask = WindowTask(root)
WindowWork = WindowWork(root)
ButtonSetting = Setting(root)
root.mainloop()