Найти - Пользователи
Полная версия: Не вызывается функция из функции
Начало » Python для новичков » Не вызывается функция из функции
1
alesi
Добрый день, мне необходимо чтобы функция 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()
PEHDOM
alesi у вас оно не заработает так:
 def timer(self):
        self.work_unit()
        while True:
            time.sleep(1)  # in seconds
            ....
ткинтер событийно ориентиреваный фреймоврк, и запуская в нем бесконечный цикл, вы блокируете основной цикл обработки событий root.mainloop() и ваше окно просто подвисает. вам нужно или запускать таймер в отдельном потоке, или использовать метод root.after(), подробнее про метод см. https://effbot.org/tkinterbook/widget.htm
alesi
Большое спасибо
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB