Найти - Пользователи
Полная версия: Tkinter не получается задействовать метод get()
Начало » Python для новичков » Tkinter не получается задействовать метод get()
1
alesi
Здравствуйте, вопрос : В классе Setting функция def window_setting(self) поле self.entry_timer_trigger нужно снять значение и передать в класс Timer, но у меня даже не получается взять значение из self.entry_timer_trigger так как метод get( ) в функции def transit_date(self):
self.timer_date = self.entry_timer_trigger.get()
даже не активен…..подскажите в чем проблема?

 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)  # размер окна может быть изменён только по горизонтали
timer_after_id = ''  # переменная таймера ведет счет
count_timer = 0  # счетчик таймера
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.listbox_ready_task = Listbox(main, height=25, width=45, selectmode=EXTENDED)  # список выполненных задач с пунктами из листа list
        self.field_call_ready_task = Label(main, text='Выполненные задачи', width=25, font=10, justify=LEFT)
        self.field_call_ready_task.grid(row=0, column=2)
        self.listbox_ready_task.grid(row=1, column=2)
        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.button_pause = Button(main, text='Pause', width=16, font=10, command=self.pause_timer)
        self.button_pause.grid(row=3, column=1)
        self.unit = Unit()  # ссылка на класс исполнители
        self.task = Task()  # ссылка на класс задачи
        self.setting = Setting(main) # ссылка на класс Setting
        #self.trigger_time = 2  # время срабатывания
        self.list_unit_and_task = {}  # массив для хранения исполнителей и задач
        self.count_work_unit = 0  # счетчик остатка задач в функции work_unit
        self.timer_count_operations = 0 # счетчик количества срабатываний таймера
    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 update_display (self): # обновляем отображение в первом окне при срабатывани таймера
        self.listbox.delete(0, END) # очищаем self.listbox чтобы заново заполнить его
        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:  # формируем список из первых задач
            if self.list_unit_and_task[key] == []: # предучматриваем момент если список задач уже пуст
                int_arr_task.append('') # завиваем место пробелом чтобы ниже не выскакивало на диапазон
            else:
                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)
    def timer(self, timer_trigger=3):
        self.trigger_time = timer_trigger
        global timer_after_id, count_timer
        timer_after_id = root.after(1000, self.timer) # таймер срабатывет каждые 1000 миллисекунд или 1 секунда
        count_timer += 1
        print(count_timer)
        if count_timer == self.trigger_time: #
            self.timer_count_operations += 1 # счетчик наличия задач
            self.work_unit()
            for key in self.list_unit_and_task:  # бежим по словарю проверяем остались  ли не выполненные задачи остались ли не пустые value
                if self.list_unit_and_task[key] != []:  # останавливаем работу когда все задачи удалены
                    self.count_work_unit += 1 #  почему то не удаляет все задачи срабатывает раньше чем они удалены
                    print('turn on')
            if self.count_work_unit == 0: # если 0 значит задач нет
                self.update_display()
                root.after_cancel(timer_after_id) # останавливаем работу когда все задачи удалены
                print('turn off = ', self.list_unit_and_task)
                count_timer = 0
            if self.count_work_unit != 0:#продолжаем  работу если задачи еще остались
                self.update_display() # обновдяем первое окно
                self.count_work_unit = 0 #
                count_timer = 0
    def pause_timer(self):
        root.after_cancel(timer_after_id)
    def work_unit(self):  # моделируем работу # на каждое срабатывание таймера бежим по рабочему словарю вычитаем из сложности первой задачи производительность юнита
        for key in self.list_unit_and_task:  # бежим по словарю
            if self.list_unit_and_task[key] == []:
                continue
            lvl_unit = int(key[-3:])  # вытаскиваем из кей значения производительности юнита от строка поэтому тащим срез
            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_ready_task = []  # список выполненных задач
                self.list_ready_task.append('Работник-' + ' ' + key[:-3] + ', ' + 'Задача-' + ' ' + self.list_unit_and_task[key][0][:-3]+''+'t='+str(self.timer_count_operations))
                for i in self.list_ready_task:
                    self.listbox_ready_task.insert(END, i)
                print(self.list_ready_task)
                self.list_unit_and_task[key].pop(0)  # удаляем задачу , она первая в массиве
                #с вероятностью 50 % (выпадет 1 или 2) србатывает фукция сменя первых задач в списке по кругу def change_task
                work_unit_count_task = 0
                for key in self.list_unit_and_task:
                    if self.list_unit_and_task[key] != []:
                        work_unit_count_task +=1
                    if work_unit_count_task == len(self.list_unit_and_task) and random.randint(1, 2) == 2:
                         # с вероятностью 50 % (выпадет 1 или 2) србатывает фукция сменя первых задач в списке по кругу def change_task
                        self.change_task()
                        print('change_task', self.list_unit_and_task)
            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
    def change_task(self):  # меняем в списке list_unit_and_task первые задачи местами
        count_task = 1
        count_key = 0
        arr_keep_keys = []
        for key in self.list_unit_and_task:
            arr_keep_keys.append(key)
        first_task = self.list_unit_and_task[arr_keep_keys[count_key]][0]
        self.list_unit_and_task[arr_keep_keys[count_key]].pop(0)
        for key in self.list_unit_and_task:
            if count_task == len(self.list_unit_and_task):
                if self.list_unit_and_task[key] == []:
                    self.list_unit_and_task[key].append(first_task)
                else:
                    self.list_unit_and_task[key][0] = first_task
                break
            if self.list_unit_and_task[key] == []:
                self.list_unit_and_task[key].append(self.list_unit_and_task[arr_keep_keys[count_task]][0])
                count_task += 1
                continue
            self.list_unit_and_task[key][0] = self.list_unit_and_task[arr_keep_keys[count_task]][0]
            self.list_unit_and_task[arr_keep_keys[count_task]].pop(0)
            count_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 Unit():  # класс исполнитель
    def __init__(self, sum=3, min_speed=30, 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=250):
        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))))
class Setting():  # окно настройка
    def __init__(self, main):
        self.button_set = Button(main, text='Setting', width=16, font=10, command=self.window_setting)
        self.button_set.grid(row=3, column=2)
    def window_setting(self):  # открываем окно с настройкаами
        self.window_open = Toplevel()  # инициализируем новое окно
        self.window_open.title('Setting')  # титул окна
        self.window_open.geometry('800x200')  # размер окна
        self.field_timer_trigger = Label(self.window_open, text='Время срабатывания таймера. сек ', borderwidth=3, width=40, font=10).grid(row=0, column=0)  # название поля ввода
        self.entry_timer_trigger = Entry(self.window_open, width=8, font=15).grid(row=0, column=1)  # создаем окно ввода
        # минимальное и максимальное количество исполнителей
        self.field_number_unit_max = Label(self.window_open, text='Количество исполнителей. Максимальное:', justify='left', borderwidth=3, width=40, font=10).grid(row=1, column=0)  # название поля ввода
        self.field_number_unit_max = Entry(self.window_open, width=8, font=15).grid(row=1, column=1)  # создаем окно ввода
        self.field_number_unit_min = Label(self.window_open, text='Минимальное:', borderwidth=3, width=12, font=10, justify='right').grid(row=1, column=2)  # название поля ввода
        self.field_number_unit_min = Entry(self.window_open, width=8, font=15).grid(row=1, column=3)  # создаем окно ввода
        # минимальная и максимальная производительность исполнителя
        self.field_level_perform_max = Label(self.window_open, text='Производительность исполнителя. Макс:', borderwidth=3, width=40, font=10, justify='right').grid(row=2, column=0)  # название поля ввода
        self.field_level_perform_max = Entry(self.window_open, width=8, font=15).grid(row=2, column=1)  # создаем окно ввода
        self.field_level_perform_min = Label(self.window_open, text='Минимальное:', borderwidth=3, width=12, font=10, justify='right').grid(row=2, column=2)  # название поля ввода
        self.field_level_perform_min = Entry(self.window_open, width=8, font=15).grid(row=2, column=3)  # создаем окно ввода
        # минимальное и максимальное количество задач
        self.field_amount_task_max = Label(self.window_open, text='Количество задач. Макс:', borderwidth=3, width=40, font=10, justify='right').grid(row=3, column=0)  # название поля ввода
        self.field_amount_task_max = Entry(self.window_open, width=8, font=15).grid(row=3, column=1)  # создаем окно ввода
        self.field_amount_task_min = Label(self.window_open, text='Минимальное:', borderwidth=3, width=12, font=10, justify='right').grid(row=3, column=2)  # название поля ввода
        self.field_amount_task_min = Entry(self.window_open, width=8, font=15).grid(row=3, column=3)  # создаем окно ввода
        # минимальная и максимальная сложность задачи
        self.field_complexity_task_max = Label(self.window_open, text='Сложность задач. Макс:', borderwidth=3, width=40, font=10, justify='right').grid(row=4, column=0)  # название поля ввода
        self.field_complexity_task_max = Entry(self.window_open, width=8, font=15).grid(row=4, column=1)  # создаем окно ввода
        self.field_complexity_task_min = Label(self.window_open, text='Минимальное:', borderwidth=3, width=12, font=10, justify='right').grid(row=4, column=2)  # название поля ввода
        self.field_complexity_task_min = Entry(self.window_open, width=8, font=15).grid(row=4, column=3)  # создаем окно ввода
        # кнопки ок и кенсел
        self.button_ok = Button(self.window_open, text='OK', width=16, font=10, command=self.transit_date).grid(row=5, column=0)  # создаем кнопку ОК
        self.button_cancel = Button(self.window_open, text='Cancel', width=16, font=10, command=self.close_win_setting).grid(row=5, column=1)  # создаем кнопку кенсел с командой закрытия окна
    def transit_date(self):
        self.timer_date = self.entry_timer_trigger.get()
    def close_win_setting(self):  # функция закрывающая окно по кнопке cancel
        self.close_win_setting = self.window_open.destroy()  # команда закрывающая окно
window_unit = WindowUnit(root)
WindowTask = WindowTask(root)
#WindowWork = WindowWork(root)
#ButtonSetting = Setting(root)

PEHDOM
ну плиин, вот что это?
 self.entry_timer_trigger = Entry(self.window_open, width=8, font=15).grid(row=0, column=1)
что по вашему должен вернуть метод grid()?
хотите сохранить ссылку на обьект делайте вот так
 self.entry_timer_trigger = Entry(self.window_open, width=8, font=15)
а уже потом располагайте его на форме.
 self.entry_timer_trigger.grid(row=0, column=1)
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