def add_file_browser(self, f, button_txt, init_txt , r, c, help_txt=''): b = Button(f,text=button_txt) b.grid(row=r, column=c, sticky=W+E) f_var = StringVar() f_var.set(init_txt) e = Entry(f, textvariable=f_var) e.grid(row=r, column=c+1) b.configure(command=lambda: self.browse_file(f_var, b)) return f_var
def add_file_browser(self, f, button_txt, init_txt, r, c, help_txt=''): b = Button(f, text=button_txt) b.grid(row=r, column=c, sticky=W + E) f_var = StringVar() f_var.set(init_txt) e = Entry(f, textvariable=f_var) e.grid(row=r, column=c + 1) b.configure(command=lambda: self.browse_file(f_var, b)) return f_var
def setup_query_segment(self): '''set up SPARQL query segment''' dct = self.user_input # dct['out_dir'] = self.button_component('Browse', 'N/A', 0, 0, mode=DISABLED) sparql_btn = Button(self,text='Execute SPARQL Enrichment') sparql_btn.grid(row=4, column=0, columnspan=2, sticky=W) sparql_btn.configure(command=lambda : self.sparql_extraction(sparql_btn))
def setup_launcher(self): '''create buttons to execute the job and for default values''' def_button = Button(self, text='Defaults') def_button.grid(row=30, column=0, padx=5, pady=5, sticky=W) def_button.configure(command=self.defaults) go_button = Button(self, text="Run!") go_button.grid(row=30, column=1, padx=5, pady=5, sticky=E) go_button.configure(command=lambda: self.go(go_button))
def setup_launcher(self): '''create buttons to execute the job and for default values''' def_button = Button(self,text='Defaults') def_button.grid(row=30, column=0, padx=5, pady=5, sticky=W) def_button.configure(command=self.defaults) go_button = Button(self,text="Run!") go_button.grid(row=30, column=1, padx=5, pady=5, sticky=E) go_button.configure(command=lambda: self.go(go_button))
def setup_query_segment(self): '''set up SPARQL query segment''' dct = self.user_input # dct['out_dir'] = self.button_component('Browse', 'N/A', 0, 0, mode=DISABLED) sparql_btn = Button(self, text='Execute SPARQL Enrichment') sparql_btn.grid(row=4, column=0, columnspan=2, sticky=W) sparql_btn.configure( command=lambda: self.sparql_extraction(sparql_btn))
def button_component(self, button_txt, init_txt, r, c, help_txt='', mode=NORMAL): '''adds a button component associated with an entry (the label only activates when help_txt != '')''' b = Button(self, text=button_txt) b.grid(row=r, column=c, sticky=W+E) b.config(state=mode) dir_var = StringVar() dir_var.set(init_txt) Entry(self, textvariable=dir_var).grid(row=r, column=c+1) Label(self, text=help_txt).grid(row=r, column=c+2, sticky=W) b.configure(command=lambda: self.browse_dir(dir_var, b)) return dir_var
def button_component(self, button_txt, init_txt, r, c, help_txt='', mode=NORMAL): '''adds a button component associated with an entry (the label only activates when help_txt != '')''' b = Button(self, text=button_txt) b.grid(row=r, column=c, sticky=W + E) b.config(state=mode) dir_var = StringVar() dir_var.set(init_txt) Entry(self, textvariable=dir_var).grid(row=r, column=c + 1) Label(self, text=help_txt).grid(row=r, column=c + 2, sticky=W) b.configure(command=lambda: self.browse_dir(dir_var, b)) return dir_var
class Bill(): """LOST: Класс, содержащий в себе виджеты списока блюд и ингредиентов, подлежащих списанию, набора кнопок управления, односящихся к этому списку.""" def __init__(self, master): self.frame = Frame(master) self.frame.pack(side = LEFT) self.frame_lower_button = Frame(self.frame) self.frame_lower_button.pack(side=BOTTOM, fill=Y) #------------------------ Поле под списком --------#7 self.memo = Text(self.frame, height=LOST_COMMENT_HEIGHT, width = LOST_WIDTH+1, font=('Lucida Console', BILL_FONT_SIZE)) self.memo.pack(side=BOTTOM) Label(self.frame, text=u'Дополнительный комментарий:', font=('Lucida Console', FONT_SIZE)).pack(side=BOTTOM, pady=5) #------------------------ Кнопки слева от списка ---------# self.frame_left_button = Frame(self.frame) self.frame_left_button.pack(side=LEFT, fill=Y) self.button_up = Button(self.frame_left_button, image=data.IMG_INTERFACE[2], command=self.b_up) self.button_up.pack(side=TOP, padx=5, pady=10) self.button_down = Button(self.frame_left_button, image=data.IMG_INTERFACE[1], command=self.b_down) self.button_down.pack(side=TOP, padx=5, pady=0) #------------------------ Собственно список ---------------# self.scrollbar = Scrollbar(self.frame) self.listbox = Listbox(self.frame, yscrollcommand=self.scrollbar.set, width = LOST_WIDTH, height=LOST_HEIGHT, activestyle='dotbox', font=('Lucida Console', BILL_FONT_SIZE)) self.listbox.pack(side=LEFT, fill=BOTH) self.scrollbar.config(command=self.listbox.yview) self.scrollbar.pack(side=LEFT, fill=Y) #------------------------ Кнопки справа от списка --------# self.frame_right_button = Frame(self.frame) self.frame_right_button.pack(side=LEFT, fill=Y) self.button_plus = Button(self.frame_right_button, image=data.IMG_INTERFACE[6],command=self.b_plus) self.button_plus.pack(side=TOP, padx=5, pady=2) self.button_minus = Button(self.frame_right_button, image=data.IMG_INTERFACE[7],command=self.b_minus) self.button_minus.pack(side=TOP, padx=5, pady=2) self.button_info = Button(self.frame_right_button, image=data.IMG_INTERFACE[9],command=self.b_info) self.button_info.pack(side=TOP, padx=5, pady=2) self.button_del = Button(self.frame_right_button, image=data.IMG_INTERFACE[5],command=self.b_del, state=DISABLED) self.button_del.pack(side=TOP, padx=5, pady=25) #-------------------------- Кнопки снизу от списка ------------№ self.button_clear = Button(self.frame_lower_button, text=u'Очистить\nсписок', style='Little.TButton',command=self.b_clear) self.button_clear.pack(side=LEFT, padx=10, pady=10, fill=X) self.button_save = Button(self.frame_lower_button, text=u'Сохранить\nсписок', style='Little.TButton', command=self.b_save, state=DISABLED) self.button_save.pack(side=LEFT, padx=10, pady=10, fill=X) self.button_accept = Button(self.frame_lower_button, text=u'Провести\nсписание', style='Little.TButton', command=self.b_accept) self.button_accept.pack(side=LEFT, padx=10, pady=10, fill=X) #------------------- Причина списания под списком -----------------# self.lost_reason_frame = Frame(self.frame_lower_button, relief=GROOVE, width=LOST_REASON_WIDTH, height=50) self.lost_reason_frame.pack_propagate(False) self.lost_reason_frame.pack(side=LEFT, fill=X) self.lostReasonsMenu = Menubutton(self.lost_reason_frame, text=u'Причина: ----', direction='below',style='TMenubutton') self.lostReasonsMenu.pack(fill=X, pady=5, padx=5) self.lostReasonsMenu.update() #Подгонка по высоте self.lost_reason_frame.configure( height=self.lostReasonsMenu.winfo_height() + 10) self.lostReasonsMenu.menu = Menu(self.lostReasonsMenu, tearoff=0) self.lostReasonsMenu['menu'] = self.lostReasonsMenu.menu for item in queries.lost_reasons_list(): self.lostReasonsMenu.menu.add_command(label=item.reason, font=('Verdana', FONT_SIZE_MENU), command=lambda key=item.id: self.reason_change(key)) # Текущая скидка. if queries.lost_reasons_list(): self.reason = queries.lost_reasons_list()[0] self.lostReasonsMenu.configure(text=u'Причина: %s' % self.reason.reason) else: self.reason = None self.bill = [] # Содержание текущего списка (Wasted) #----------------------------------------------------------- def verify_calc(self, item, item_quantity): """Подсобная функция для работы функции verify(). Проверяет наличие на складе ингредиентов, входящих в сложный товар на момент списания. Возвращает True или False в зависимости от наличия необходиомого количества товара на складе для списания.""" result = True for calc in queries.item_calculation(item): if calc.ingredient.calculation: for calc2 in queries.item_calculation(calc.ingredient): quantity = int(queries.items_in_storage( calc2.ingredient)) need_quantity = (item_quantity * calc2.quantity * calc.quantity) if quantity < need_quantity: tkMessageBox.showwarning(u'Внимание!', u'Вы пытаетесь списать %d единицы товара "%s".' % (need_quantity, calc2.ingredient.name) + u'\nНа складе имеется всего %d единицы!'% quantity) result = False else: quantity = int(queries.items_in_storage(calc.ingredient)) need_quantity = item_quantity * calc.quantity if quantity < need_quantity: tkMessageBox.showwarning(u'Внимание!', u'Вы пытаетесь списать %d единицы товара "%s".' % (need_quantity, calc.ingredient.name) + u'\nНа складе имеется всего %d единицы!'% quantity) result = False return result def verify(self): """Проверяет наличие на складе товаров, входящих в счет, на момент списания. Возвращает True или False в зависимости от наличия необходиомого количества товара на складе для продажи.""" all_present = True for element in self.bill: if element.item.calculation: if not self.verify_calc(element.item, element.quantity): all_present = False else: quantity = int(queries.items_in_storage(element.item)) if quantity < element.quantity: tkMessageBox.showwarning(u'Внимание!', u'Вы пытаетесь списать %d единицы товара "%s".' % (element.quantity, element.item.name) + u'\nНа складе имеется всего %d единицы!' % quantity) all_present = False return all_present def reason_change(self, key): """Меняет текущую причину для списания.""" self.lostReasonsMenu.configure(text=u'Причина: %s' % queries.get_lost_reason_by_id(key).reason) self.reason = queries.get_lost_reason_by_id(key) def make_list_string(self, lost): """Вспомогательная функция создания строки для списка списания""" string = u' %-' + unicode(27 + (LOST_WIDTH - 63) /2) + u's %6d %3s - %s' string = string % (lost.item.name, lost.quantity, lost.item.measure, lost.reason.reason) return string def add_eat(self, eat, number): """Добавляет товар в текущий список. Изменяет как отображение в списке виджета, так и данные в self.bill""" if self.reason: self.button_del.configure(state=NORMAL) lost = Wasted(eat, number, self.reason) self.bill.append(lost) string = self.make_list_string(lost) self.listbox.insert(END, string) else: tkMessageBox.showwarning('Однако!', 'Списание невозможно, так как в настоящий момент\n' + 'не предусмотрено ни одной причины для списания!') def b_up(self): """Срабатывает при нажатии кнопки "вверх" на панели списка. Поднимаем выделение в списке на предыдущую позицию (вверх)""" selected = self.listbox.curselection() if selected: index = int(selected[0]) if index > 0: self.listbox.selection_clear(index) self.listbox.selection_set(index-1) self.listbox.see(index-2) else: count = self.listbox.size() if count: self.listbox.selection_set(count - 1) self.listbox.see(count - 1) def b_down(self): """Срабатывает при нажатии кнопки "вниз" на панели списка. Опускаем выделение в списке на следующую позицию (вниз)""" selected = self.listbox.curselection() if selected: index = int(selected[0]) if index < self.listbox.size() - 1: self.listbox.selection_clear(index) self.listbox.selection_set(index + 1) self.listbox.see(index + 1) else: if self.listbox.size(): self.listbox.selection_set(0) self.listbox.see(0) def b_plus(self): """Срабатывает при нажатии кнопки "+" на панели списка. Добавляет +1 к позиции в списке""" selected = self.listbox.curselection() if selected: index = int(selected[0]) lost = self.bill[index] lost.quantity += 1 self.listbox.delete(index) string = self.make_list_string(lost) self.listbox.insert(index, string) self.listbox.selection_set(index) self.listbox.see(index) def b_minus(self): """Срабатывает при нажатии кнопки "-" на панели списка. Убирает 1 к позиции в списке или удаляет, если и так была 1""" selected = self.listbox.curselection() if selected: index = int(selected[0]) lost = self.bill[index] if lost.quantity == 1: self.b_del() else: lost.quantity -= 1 self.listbox.delete(index) string = self.make_list_string(lost) self.listbox.insert(index, string) self.listbox.selection_set(index) self.listbox.see(index) def b_del(self): """Срабатывает при нажатии кнопки "удалить" на панели списка. Полностью удаляем позицию в списка""" selected = self.listbox.curselection() if selected: index = int(selected[0]) del self.bill[index] self.listbox.delete(index) if self.listbox.size() == 0: self.button_del.configure(state=DISABLED) self.listbox.see(index) def b_info(self): """Срабатывает при нажатии кнопки "инфо" на панели списка. Меняет причину списания выделенного элемента списка на текущую""" selected = self.listbox.curselection() if selected: index = int(selected[0]) lost = self.bill[index] lost.reason = self.reason self.listbox.delete(index) string = self.make_list_string(lost) self.listbox.insert(index, string) self.listbox.selection_set(index) self.listbox.see(index) def b_clear(self): """Срабатывает при нажатии кнопки "Очистить список". Соответственно, очищает список.""" self.bill = [] self.listbox.delete(0, END) self.button_del.configure(state=DISABLED) def b_save(self): """Срабатывает при нажатии кнопки "Сохранить список". Сохраняет чек в файл на диске""" pass #Не дописано. def b_accept(self): """Срабатывает при нажатии "Провести операцию" на панели списка. Полностью проводит списание по бухгалтерии, и убирая соответствющий товар. Изменяет базу данных""" if not self.bill: tkMessageBox.showwarning('Однако!', 'Список пуст, списывать нечего.') elif not self.reason: tkMessageBox.showwarning('Однако!', 'Повторно напоминаю, что у вас не\n', + 'предусмотрено ни одной причины для списания!') elif self.verify() and tkMessageBox.askokcancel('Внимание!', 'Вы подтверждаете операцию проведения списания?'): list_item, list_quantity, list_reason = [], [], [] for lost in self.bill: list_item.append(lost.item) list_quantity.append(lost.quantity) list_reason.append(lost.reason) queries.execute_lost(list_item, list_quantity, list_reason, self.memo.get(1.0,END)) self.b_clear() #Возвращаем панель категорий на место show_lost.master.destroy() lostBottomFrame = Canvas(MasterFrame, highlightthickness=0) show_lost.master = lostBottomFrame if USE_BACKGROUND: lostBottomFrame.create_image(0,0, anchor='nw', image=data.photo) lostBottomFrame.pack(side=LEFT, fill=BOTH, expand=YES) show_lost_cathegory(lostBottomFrame)
class Bill(): """SELL: Класс, содержащий в себе виджеты списка заказанных блюд (счет), набора кнопок управления, односящихся к этому счету, включая отображение итоговой суммы по счету и кнопку скидки.""" def __init__(self, master): self.frame = Frame(master) self.frame.pack(side = LEFT) self.frame_lower_button = Frame(self.frame) self.frame_lower_button.pack(side=BOTTOM, fill=Y) #------------------------ Кнопки слева от счета ---------# self.frame_left_button = Frame(self.frame) self.frame_left_button.pack(side=LEFT, fill=Y) self.button_up = Button(self.frame_left_button, image=data.IMG_INTERFACE[2], command=self.b_up) self.button_up.pack(side=TOP, padx=5, pady=10) self.button_down = Button(self.frame_left_button, image=data.IMG_INTERFACE[1], command=self.b_down) self.button_down.pack(side=TOP, padx=5, pady=0) #------------------------ Собственно счет ---------------# self.scrollbar = Scrollbar(self.frame) self.listbox = Listbox(self.frame, yscrollcommand=self.scrollbar.set, width = BILL_WIDTH, height=BILL_HEIGHT, activestyle='dotbox', font=('Lucida Console', BILL_FONT_SIZE)) self.listbox.pack(side=LEFT, fill=BOTH) self.scrollbar.config(command=self.listbox.yview) self.scrollbar.pack(side=LEFT, fill=Y) #------------------------ Кнопки справа от счета --------# self.frame_right_button = Frame(self.frame) self.frame_right_button.pack(side=LEFT, fill=Y) self.button_plus = Button(self.frame_right_button, image=data.IMG_INTERFACE[6],command=self.b_plus) self.button_plus.pack(side=TOP, padx=5, pady=2) self.button_minus = Button(self.frame_right_button, image=data.IMG_INTERFACE[7],command=self.b_minus) self.button_minus.pack(side=TOP, padx=5, pady=2) self.button_del = Button(self.frame_right_button, image=data.IMG_INTERFACE[5],command=self.b_del, state=DISABLED) self.button_del.pack(side=TOP, padx=5, pady=25) #-------------------------- Кнопки снизу от счета ------------№ self.button_print = Button(self.frame_lower_button, text=u'Распечатать\nчек', style='Little.TButton',command=self.b_print) self.button_print.pack(side=LEFT, padx=10, pady=10, fill=X) self.button_save = Button(self.frame_lower_button, text=u'Сохранить\nчек', style='Little.TButton', command=self.b_save, state=DISABLED) self.button_save.pack(side=LEFT, padx=10, pady=10, fill=X) self.button_accept = Button(self.frame_lower_button, text=u'Провести\nоперацию', style='Little.TButton', command=self.b_accept) self.button_accept.pack(side=LEFT, padx=10, pady=10, fill=X) #------------------------- Метка с "итого" под счетом --------# self.label1 = Label(self.frame_lower_button, text=u'Итого: 0.00 грн.', font=('Lucida Console', FONT_SIZE_BIG), bg='white') self.label1.pack(side=LEFT, padx=10, pady=10, fill=X) #------------------------- скидка под счетом -----------------# self.discountMenu = Menubutton(self.frame_lower_button, text=u'Скидка 0%', direction='below',style='TMenubutton') self.discountMenu.pack(side=LEFT, fill=X) self.discountMenu.menu = Menu(self.discountMenu, tearoff=0) self.discountMenu['menu'] = self.discountMenu.menu for item in queries.discount_list(): self.discountMenu.menu.add_command(label=item.sinopsys, font=('Verdana', FONT_SIZE_MENU), command=lambda key=item.id: self.discount_change(key)) self.discount = 0 # Текущая скидка. self.bill = [] # Содержание текущего счета (товар) self.quantity = [] # Содержание счета (количество товара) def verify_calc(self, item, item_quantity): """Подсобная функция для работы функции verify(). Проверяет наличие на складе ингредиентов, входящих в сложный товар на момент продажи. В случае недостатка предлагает совершить мгновенный приход товара. Возвращает True или False в зависимости от итогового наличия необходиомого количества товара на складе для продажи.""" result = True for calc in queries.item_calculation(item): if calc.ingredient.calculation: for calc2 in queries.item_calculation(calc.ingredient): quantity = int(queries.items_in_storage( calc2.ingredient)) need_quantity = (item_quantity * calc2.quantity * calc.quantity) if quantity < need_quantity: if tkMessageBox.askyesno(u'Внимание!', u'Вы пытаетесь продать %d единицы товара "%s".' % (need_quantity, calc2.ingredient.name) + u'\nНа складе имеется всего %d единицы!'% quantity + u'\nВыполнить мгновенную поставку товара?'): incoming = panel() if not queries.execute_incoming_express( calc2.ingredient, incoming) or (need_quantity > incoming + quantity): result = False else: result = False else: quantity = int(queries.items_in_storage(calc.ingredient)) need_quantity = item_quantity * calc.quantity if quantity < need_quantity: if tkMessageBox.askyesno(u'Внимание!', u'Вы пытаетесь продать %d единицы товара "%s".' % (need_quantity, calc.ingredient.name) + u'\nНа складе имеется всего %d единицы!'% quantity + u'\nВыполнить мгновенную поставку товара?'): incoming = panel() if not queries.execute_incoming_express( calc.ingredient, incoming) or (need_quantity > incoming + quantity): result = False else: result = False return result def verify(self): """Проверяет наличие на складе товаров, входящих в счет, на момент продажи, в случае недостатка предлагает совершить мгновенный приход товара. Возвращает True или False в зависимости от итогового наличия необходиомого количества товара на складе для продажи.""" all_present = True for item, item_quantity in zip(self.bill, self.quantity): if item.calculation: if not self.verify_calc(item, item_quantity): all_present = False else: quantity = int(queries.items_in_storage(item)) if quantity < item_quantity: if tkMessageBox.askyesno(u'Внимание!', u'Вы пытаетесь продать %d единицы товара "%s".' % (item_quantity, item.name) + u'\nНа складе имеется всего %d единицы!' % quantity + u'\nВыполнить мгновенную поставку товара?'): incoming = panel() if not queries.execute_incoming_express(item, incoming) or (item_quantity > incoming + quantity): all_present = False else: all_present = False return all_present def discount_change(self, key): """Меняет текущую скидку.""" self.discountMenu.configure(text=u'Скидка %2s' % str(queries.get_discount_by_id(key).discount) + '%') self.discount = queries.get_discount_by_id(key).discount self.itogo() def itogo(self): """Обсчитывает итоговую сумму счета, применяет скидку и выводит в соответствующую метку под счетом.""" summ = 0 for item, quantity in zip(self.bill, self.quantity): if queries.price_is_sales(item): summ += quantity * queries.item_price(item) else: summ += quantity * queries.item_price(item) * (100 - self.discount) / 100 summ = round(summ, 2) self.label1.configure(text='Итого:%8s грн.' % ('%5.2f' % summ)) return summ def make_list_string (self, eat, quantity): """Вспомогательная функция создания строки для счета""" if queries.price_is_sales(eat): str_1 = u'*' else: str_1 = u' ' string = str_1 + u'%-' + unicode(BILL_WIDTH - 36) + \ u's %2d %6.2f грн. %6.2f грн.' string = string % (eat.name, quantity, queries.item_price(eat), quantity * queries.item_price(eat)) return string def add_eat(self, cath, eat): """Добавляет товар в текущий счет. Изменяет как отображение в списке виджета, так и данные в self.bill""" self.button_del.configure(state=NORMAL) if eat in self.bill: eat_index = self.bill.index(eat) self.quantity[eat_index] += 1 self.listbox.delete(eat_index) string = self.make_list_string(eat, self.quantity[eat_index]) self.listbox.insert(eat_index, string) else: self.bill.append(eat) self.quantity.append(1) string = self.make_list_string(eat, 1) self.listbox.insert(END, string) self.itogo() def b_up(self): """Срабатывает при нажатии кнопки "вверх" на панели счета. Поднимаем выделение в счете на предыдущую позицию (вверх)""" selected = self.listbox.curselection() if selected: index = int(selected[0]) if index > 0: self.listbox.selection_clear(index) self.listbox.selection_set(index-1) self.listbox.see(index-2) else: count = self.listbox.size() if count: self.listbox.selection_set(count - 1) self.listbox.see(count - 1) def b_down(self): """Срабатывает при нажатии кнопки "вниз" на панели счета. Опускаем выделение в счете на следующую позицию (вниз)""" selected = self.listbox.curselection() if selected: index = int(selected[0]) if index < self.listbox.size() - 1: self.listbox.selection_clear(index) self.listbox.selection_set(index + 1) self.listbox.see(index + 1) else: if self.listbox.size(): self.listbox.selection_set(0) self.listbox.see(0) def b_plus(self): """Срабатывает при нажатии кнопки "+" на панели счета. Добавляет +1 к позиции в счете""" selected = self.listbox.curselection() if selected: index = int(selected[0]) eat = self.bill[index] self.quantity[index] += 1 self.listbox.delete(index) string = self.make_list_string(eat, self.quantity[index]) self.listbox.insert(index, string) self.listbox.selection_set(index) self.listbox.see(index) self.itogo() def b_minus(self): """Срабатывает при нажатии кнопки "-" на панели счета. Убирает 1 к позиции в счете или удаляет, если и так была 1""" selected = self.listbox.curselection() if selected: index = int(selected[0]) if self.quantity[index] == 1: self.b_del() else: eat = self.bill[index] self.quantity[index] -= 1 self.listbox.delete(index) string = self.make_list_string(eat, self.quantity[index]) self.listbox.insert(index, string) self.listbox.selection_set(index) self.listbox.see(index) self.itogo() def b_del(self): """Срабатывает при нажатии кнопки "удалить" на панели счета. Полностью удаляем позицию в счете""" selected = self.listbox.curselection() if selected: index = int(selected[0]) del(self.bill[index]) del(self.quantity[index]) self.listbox.delete(index) if self.listbox.size() == 0: self.button_del.configure(state=DISABLED) self.listbox.see(index) self.itogo() def check_generate(self): """Cоздает текстовый вариант чека.""" #Чисто времянка, переписать. check = [] check.append(u'-'*60 + '\n') check.append(u'Это чек, распечатанный в Митяйском кафе.\n') check.append(u'Hиипу, какие там должны быть реквизиты,') check.append(u'потому пока набросаю, что есть, а потом перепишу') check.append(u'по уму, с использованием шаблона.') check.append(u'Пока жрите, что дают.\n') for index in range(self.listbox.size()): check.append(self.listbox.get(index)) #Здесь при выводе в консоль иногда падает из-за кривой кодировки check.append(u' ' * 45 + u'=' * 15) #при выводе на принтер не должно if self.discount: check.append(u' ' * 12 + u'Итого (с учетом скидки в %2d%%): %11.2f грн.' % (self.discount, self.itogo())) else: check.append(u' ' * 36 + u'Итого: %11.2f грн.' % self.itogo()) check.append(u'-'*60 + '\n') return check def b_print(self): """Срабатывает при нажатии кнопки "Распечатать чек" на панели счета. Соответственно, печатает чек.""" if not self.bill: tkMessageBox.showwarning('Однако!', 'Счет пуст, печатать нечего.') else: for string in self.check_generate(): print string #Не дописано. def b_save(self): """Срабатывает при нажатии кнопки "Сохранить чек" на панели счета. Сохраняет чек в файл на диске""" pass #Не дописано. def b_accept(self): """Срабатывает при нажатии "Провести операцию" на панели счета. Полностью проводит счет по бухгалтерии, добавляя в приход деньги и убирая соответствющий товар. Изменяет базу данных""" if not self.bill: tkMessageBox.showwarning('Однако!', 'Счет пуст, проводить нечего.') elif not self.verify(): tkMessageBox.showwarning('Однако!', 'Товара для продажи недостаточно.') elif tkMessageBox.askokcancel('Внимание!', 'Вы подтверждаете операцию проведения счета?'): if queries.execute_sell(self.bill, self.quantity, self.discount): show_sell_bills.label_renew() w_name = note.select() window_names = note.tabs() index = window_names.index(w_name) note.forget(note.select()) del(bills[index]) #Возвращаем категории на панель show_sell.master.destroy() sellBottomFrame = Canvas(MasterFrame, highlightthickness=0) show_sell.master = sellBottomFrame if USE_BACKGROUND: sellBottomFrame.create_image(0,0, anchor='nw', image=data.photo) sellBottomFrame.pack(side=LEFT, fill=BOTH, expand=YES) show_sell_cathegory()
class Bill(): """VERIFY: Класс, содержащий в себе виджеты списока товаров, ингредиентов, подлежащих сверке, набора кнопок управления, односящихся к этому списку.""" def __init__(self, master): self.frame = Frame(master) self.frame.pack(side = LEFT) self.frame_lower_button = Frame(self.frame) self.frame_lower_button.pack(side=BOTTOM, fill=Y) #------------------------ Поле под списком --------#7 self.memo = Text(self.frame, height=VERIFY_COMMENT_HEIGHT, width = VERIFY_WIDTH+1, font=('Lucida Console', BILL_FONT_SIZE)) self.memo.pack(side=BOTTOM) Label(self.frame, text=u'Комментарий к инвентаризации:', font=('Lucida Console', FONT_SIZE)).pack(side=BOTTOM, pady=5) #------------------------ Кнопки слева от списка ---------# self.frame_left_button = Frame(self.frame) self.frame_left_button.pack(side=LEFT, fill=Y) self.button_up = Button(self.frame_left_button, image=data.IMG_INTERFACE[2], command=self.b_up) self.button_up.pack(side=TOP, padx=5, pady=10) self.button_down = Button(self.frame_left_button, image=data.IMG_INTERFACE[1], command=self.b_down) self.button_down.pack(side=TOP, padx=5, pady=0) #------------------------ Собственно список ---------------# self.scrollbar = Scrollbar(self.frame) self.listbox = Listbox(self.frame, yscrollcommand=self.scrollbar.set, width = VERIFY_WIDTH, height=VERIFY_HEIGHT, activestyle='dotbox', font=('Lucida Console', BILL_FONT_SIZE)) self.listbox.pack(side=LEFT, fill=BOTH) self.scrollbar.config(command=self.listbox.yview) self.scrollbar.pack(side=LEFT, fill=Y) #------------------------ Кнопки справа от списка --------# self.frame_right_button = Frame(self.frame) self.frame_right_button.pack(side=LEFT, fill=Y) self.button_plus = Button(self.frame_right_button, image=data.IMG_INTERFACE[6],command=self.b_plus) self.button_plus.pack(side=TOP, padx=5, pady=2) self.button_minus = Button(self.frame_right_button, image=data.IMG_INTERFACE[7],command=self.b_minus) self.button_minus.pack(side=TOP, padx=5, pady=2) self.button_del = Button(self.frame_right_button, image=data.IMG_INTERFACE[5],command=self.b_del, state=DISABLED) self.button_del.pack(side=TOP, padx=5, pady=25) #-------------------------- Кнопки снизу от списка ------------№ self.button_clear = Button(self.frame_lower_button, text=u'Очистить\nсписок', style='Little.TButton',command=self.b_clear) self.button_clear.pack(side=LEFT, padx=10, pady=10, fill=X) self.button_verify = Button(self.frame_lower_button, text=u'Сверить\nсписок', style='Little.TButton', command=self.b_verify) self.button_verify.pack(side=LEFT, padx=10, pady=10, fill=X) self.button_accept = Button(self.frame_lower_button, text=u'Провести\n инвентаризацию ', style='Little.TButton', command=self.b_accept) self.button_accept.pack(side=LEFT, padx=10, pady=10, fill=X) self.bill = [] # Содержание текущего Списка (товар) self.quantity = [] # Содержание списка (количество товара) def make_list_string(self, item, quantity): """Вспомогательная функция создания строки списка инветаризации""" storage_quantity = queries.items_in_storage(item) if quantity == int(storage_quantity): color = 'black' string = u' %-' + unicode(VERIFY_WIDTH - 30) + u's %8d %3s' string = string % (item.name, quantity, item.measure) elif quantity > int(storage_quantity): color = '#008800' string = u' %-' + unicode(VERIFY_WIDTH - 30) + u's %8d %3s (%s %3s)' string = string % (item.name, quantity, item.measure, storage_quantity, item.measure) else: color = 'red' string = u' %-' + unicode(VERIFY_WIDTH - 30) + u's %8d %3s (%s %3s)' string = string % (item.name, quantity, item.measure, storage_quantity, item.measure) return string, color def add_eat(self, eat, number): """Добавляет товар в текущий список. Изменяет как отображение в списке виджета, так и данные в self.bill""" self.button_del.configure(state=NORMAL) if eat in self.bill: eat_index = self.bill.index(eat) self.quantity[eat_index] += number self.listbox.delete(eat_index) string, color = self.make_list_string(eat, self.quantity[eat_index]) self.listbox.insert(eat_index, string) self.listbox.itemconfig(eat_index, {'fg':color}) else: self.button_del.configure(state=NORMAL) self.bill.append(eat) self.quantity.append(number) string, color = self.make_list_string(eat, number) self.listbox.insert(END, string) self.listbox.itemconfig(END, {'fg':color}) def b_up(self): """Срабатывает при нажатии кнопки "вверх" на панели списка. Поднимаем выделение в списке на предыдущую позицию (вверх)""" selected = self.listbox.curselection() if selected: index = int(selected[0]) if index > 0: self.listbox.selection_clear(index) self.listbox.selection_set(index-1) self.listbox.see(index-2) else: count = self.listbox.size() if count: self.listbox.selection_set(count - 1) self.listbox.see(count - 1) def b_down(self): """Срабатывает при нажатии кнопки "вниз" на панели списка. Опускаем выделение в списке на следующую позицию (вниз)""" selected = self.listbox.curselection() if selected: index = int(selected[0]) if index < self.listbox.size() - 1: self.listbox.selection_clear(index) self.listbox.selection_set(index + 1) self.listbox.see(index + 1) else: if self.listbox.size(): self.listbox.selection_set(0) self.listbox.see(0) def b_plus(self): """Срабатывает при нажатии кнопки "+" на панели списка. Добавляет +1 к позиции в списке""" selected = self.listbox.curselection() if selected: index = int(selected[0]) self.quantity[index] += 1 self.listbox.delete(index) string, color = self.make_list_string(self.bill[index], self.quantity[index]) self.listbox.insert(index, string) self.listbox.itemconfig(index, {'fg':color}) self.listbox.selection_set(index) self.listbox.see(index) def b_minus(self): """Срабатывает при нажатии кнопки "-" на панели списка. Убирает 1 к позиции в списке или удаляет, если и так была 1""" selected = self.listbox.curselection() if selected: index = int(selected[0]) if self.quantity[index] > 0: self.quantity[index] -= 1 self.listbox.delete(index) string, color = self.make_list_string(self.bill[index], self.quantity[index]) self.listbox.insert(index, string) self.listbox.itemconfig(index, {'fg':color}) self.listbox.selection_set(index) self.listbox.see(index) def b_del(self): """Срабатывает при нажатии кнопки "удалить" на панели списка. Полностью удаляем позицию в списка""" selected = self.listbox.curselection() if selected: index = int(selected[0]) del(self.bill[index]) del(self.quantity[index]) self.listbox.delete(index) if self.listbox.size() == 0: self.button_del.configure(state=DISABLED) self.listbox.see(index) def b_clear(self): """Срабатывает при нажатии кнопки "Очистить список". Соответственно, очищает список.""" if self.bill and tkMessageBox.askokcancel('Внимание!', 'Вы действительно хотите очистить список?'): self.bill = [] self.quantity = [] self.listbox.delete(0, END) self.button_del.configure(state=DISABLED) def b_verify(self): """Срабатывает при нажатии кнопки "Сверить список". Проводит предварительную сверку количества товаров.""" if tkMessageBox.askokcancel('Внимание!', 'Вы действительно хотите сверить список со складом?'): self.button_del.configure(state=NORMAL) for cath in queries.cathegories(): for eat in queries.real_items_in_cathegory_shown(cath): storage_quantity = int(queries.items_in_storage(eat)) if storage_quantity and (eat not in self.bill): self.bill.append(eat) self.quantity.append(0) string = u' %-' + unicode(VERIFY_WIDTH - 30) + u's %8d %3s (%s %3s)' string = string % (eat.name, 0, eat.measure, storage_quantity, eat.measure) self.listbox.insert(END, string) self.listbox.itemconfig(END, {'fg':'red'}) #и для Ингредиентов for eat in queries.real_items_in_cathegory_shown(None): storage_quantity = int(queries.items_in_storage(eat)) if storage_quantity and (eat not in self.bill): self.bill.append(eat) self.quantity.append(0) string = u' %-' + unicode(VERIFY_WIDTH - 30) + u's %8d %3s (%s %3s)' string = string % (eat.name, 0, eat.measure, storage_quantity, eat.measure) self.listbox.insert(END, string) self.listbox.itemconfig(END, {'fg':'red'}) def b_accept(self): """Срабатывает при нажатии "Провести операцию" на панели списка. Полностью проводит приход по бухгалтерии, добавляя излишки товара и списывая недостачу. Изменяет базу данных""" if not self.bill: tkMessageBox.showwarning('Однако!', 'Список пуст, инвентаризировать нечего.') elif tkMessageBox.askokcancel('Внимание!', 'Вы утверждаете результаты инвентаризации?'): #Проводим сверку инвентаризационного списка со складом for cath in queries.cathegories(): for eat in queries.real_items_in_cathegory_shown(cath): storage_quantity = int(queries.items_in_storage(eat)) if storage_quantity and (eat not in self.bill): self.bill.append(eat) self.quantity.append(0) string = u' %-' + unicode(VERIFY_WIDTH - 30) + u's %8d %3s (%s %3s)' string = string % (eat.name, 0, eat.measure, storage_quantity, eat.measure) self.listbox.insert(END, string) self.listbox.itemconfig(END, {'fg':'red'}) #...и для ингредиентов for eat in queries.real_items_in_cathegory_shown(None): storage_quantity = int(queries.items_in_storage(eat)) if storage_quantity and (eat not in self.bill): self.bill.append(eat) self.quantity.append(0) string = u' %-' + unicode(VERIFY_WIDTH - 30) + u's %8d %3s (%s %3s)' string = string % (eat.name, 0, eat.measure, storage_quantity, eat.measure) self.listbox.insert(END, string) self.listbox.itemconfig(END, {'fg':'red'}) if not tkMessageBox.askyesno('Внимание!', 'Будете ознакамливаться с окончательным списком (после сверки)?'): queries.execute_inventarize(self.bill, self.quantity, self.memo.get(1.0,END)) self.bill = [] self.quantity = [] self.listbox.delete(0, END) self.button_del.configure(state=DISABLED) show_verify.master.destroy() incomingBottomFrame = Canvas(MasterFrame, highlightthickness=0) show_verify.master = incomingBottomFrame if USE_BACKGROUND: incomingBottomFrame.create_image(0,0, anchor='nw', image=data.photo) incomingBottomFrame.pack(side=LEFT, fill=BOTH, expand=YES) show_verify_cathegory(incomingBottomFrame)
def initUI(self): self.parent.title("Mohr Circle Construction") self.pack(fill=BOTH, expand=1) canvas = Canvas(self) self.canvas = canvas ## Input area self.show_stress = IntVar() show_stress_check = Checkbutton(self, text = "Show stress", variable = self.show_stress, command = self.showStress) show_stress_check_window = canvas.create_window(100, 420, window=show_stress_check) reset_rotation = Button(self, text = "Reset rotation", command = self.resetRotation) reset_rotation.configure(width = 15, background = "#c0c0c0") reset_rotation_window = canvas.create_window(325, 420, window=reset_rotation) self.sigma_x_val = StringVar() self.sigma_y_val = StringVar() self.tau_xy_val = StringVar() self.theta_val = StringVar() sigma_x = Entry(textvariable=self.sigma_x_val) sigma_y = Entry(textvariable=self.sigma_y_val) tau_xy = Entry(textvariable=self.tau_xy_val) theta = Entry(textvariable=self.theta_val) sigma_x_window = canvas.create_window(125, 480, window=sigma_x) sigma_y_window = canvas.create_window(125, 510, window=sigma_y) tau_xy_window = canvas.create_window(125, 540, window=tau_xy) theta_window = canvas.create_window(125, 570, window=theta) canvas.create_text(30, 480, anchor=W, text=u"\u03c3") canvas.create_text(37, 485, anchor=W, text="x") canvas.create_text(30, 510, anchor=W, text=u"\u03c3") canvas.create_text(37, 515, anchor=W, text="y") canvas.create_text(30, 540, anchor=W, text=u"\u03c4") canvas.create_text(37, 545, anchor=W, text="xy") canvas.create_text(30, 570, anchor=W, text=u"\u03b8") calculate = Button(self, text = "Calculate", command = self.calculate) calculate.configure(width = 15, background = "#c0c0c0") calculate_window = canvas.create_window(325, 480, window=calculate) self.sigma_x_prime_val = StringVar() sigma_x_prime = Entry(textvariable=self.sigma_x_prime_val) sigma_x_prime_window = canvas.create_window(325, 510, window=sigma_x_prime) canvas.create_text(230, 510, anchor=W, text=u"\u03c3") canvas.create_text(237, 515, anchor=W, text="x'") self.sigma_y_prime_val = StringVar() sigma_y_prime = Entry(textvariable=self.sigma_y_prime_val) sigma_y_prime_window = canvas.create_window(325, 540, window=sigma_y_prime) canvas.create_text(230, 540, anchor=W, text=u"\u03c3") canvas.create_text(237, 545, anchor=W, text="y'") self.tau_xy_prime_val = StringVar() tau_xy_prime = Entry(textvariable=self.tau_xy_prime_val) tau_xy_prime_window = canvas.create_window(325, 570, window=tau_xy_prime) canvas.create_text(230, 570, anchor=W, text=u"\u03c4") canvas.create_text(237, 575, anchor=W, text="x'y'") canvas.create_text(75, 450, anchor=W, text="Definition of stress") ## Stress square graph self.square = canvas.create_rectangle(120,100,320,300) self.rotated = False self.lines = [None, None, None, None, None, None, None, None] ## Mohr Circle graph self.graph = Canvas(self) self.graph.config(width = 418, height = 418, bg = "#fff", highlightbackground = "#fff", relief = GROOVE, bd = 3) self.graph.yaxis = self.graph.create_line(210, 420, 210, 0) self.graph.xaxis = self.graph.create_line(-1000, 210, 1010, 210) self.mohr = None self.pline = None self.pointtext = None graph_window = canvas.create_window(448, 23, window = self.graph, anchor = NW) self.graph.scale = 1 ## Operation of Mohr's circle self.show_principal_stress = IntVar() show_principal_stress_check = Checkbutton(self, text = "Show principal stress", variable = self.show_principal_stress, command = self.showPrincipalStress) show_principal_stress_check_window = canvas.create_window(550, 510, window=show_principal_stress_check) left = Button(self, text = "Left", command = self.left) left.configure(width = 10, background = "#c0c0c0") left_window = canvas.create_window(490, 480, window=left) zoomin = Button(self, text = "Zoom in", command = self.zoomin) zoomin.configure(width = 10, background = "#c0c0c0") zoomin_window = canvas.create_window(575, 480, window=zoomin) zoomout = Button(self, text = "Zoom out", command = self.zoomout) zoomout.configure(width = 10, background = "#c0c0c0") zoomout_window = canvas.create_window(660, 480, window=zoomout) right = Button(self, text = "Right", command = self.right) right.configure(width = 10, background = "#c0c0c0") right_window = canvas.create_window(745, 480, window=right) reset = Button(self, text = "Reset", command = self.original) reset.configure(width = 10, background = "#c0c0c0") reset_window = canvas.create_window(830, 480, window=reset) self.radio_val = IntVar() self.radio_val.set(1) theta_input = Radiobutton(self, text = "", variable = self.radio_val, value = 1, command = self.calculate) theta_p = Radiobutton(self, text = "", variable = self.radio_val, value = 2, command = self.calculate) theta_s = Radiobutton(self, text = "", variable = self.radio_val, value = 3, command = self.calculate) theta_input_window = canvas.create_window(710, 510, window=theta_input, anchor = W) theta_p_window = canvas.create_window(710, 540, window=theta_p, anchor = W) canvas.create_text(738, 510, anchor=W, text="User Input") canvas.create_text(738, 540, anchor=W, text=u"\u03b8") canvas.create_text(745, 545, anchor=W, text="p") theta_s_window = canvas.create_window(710, 570, window=theta_s, anchor = W) canvas.create_text(738, 570, anchor=W, text=u"\u03b8") canvas.create_text(745, 575, anchor=W, text="s") canvas.pack(fill=BOTH, expand=1)
class IniGenGui(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.parent = parent self.inigen = IniGen() self.initUIGlobals() def initUIGlobals(self): """ This is the first part of the window to be rendered. After these have been set by the user and 'Emit Globals' has been clicked, the given algorithm can then specify how to generate the second part of the window. All fields are disabled for user input after globals have been emitted. Information in Global Parameters: Algorithm - name of the algorithm to use File Name - name of the output file to be generated Min Time - Minimum Time for distillers to run Max Time - Maximum Time for distillers to run Set Enabled: - checkbox to specify if the distiller should be enabled True or False """ self.parent.title("Ini Generator") Style().configure("TButton", padding=(0, 5, 0, 5), font='serif 10') # initialize row counter. This is incremented after each element added to grid row = 0 # initialize column counter. This is incremented after a column has been filled self.column = 0 # Globals: entries for info common to all runs label_globals = Label(self, text="Globals") label_globals.grid(row=row, column=self.column) row += 1 label_alg = Label(self, text="Algorithm") label_alg.grid(row=row, column=self.column, sticky=E + W) row += 1 self.cbox_alg = Combobox(self, values=algorithms.keys(), state='readonly') self.cbox_alg.current(0) self.cbox_alg.grid(row=row, column=self.column, sticky=E + W + S + N) row += 1 label_filename = Label(self, text="Output File Name") label_filename.grid(row=row, column=self.column, sticky=E + W) row += 1 self.entry_filename = Entry(self) self.entry_filename.grid(row=row, column=self.column, sticky=W + E) row += 1 label_mintime = Label(self, text="Min Time") label_mintime.grid(row=row, column=self.column, sticky=E + W) row += 1 self.entry_mintime = Entry(self) self.entry_mintime.grid(row=row, column=self.column, sticky=W + E) row += 1 label_maxtime = Label(self, text="Max Time") label_maxtime.grid(row=row, column=self.column, sticky=W + E) row += 1 self.entry_maxtime = Entry(self) self.entry_maxtime.grid(row=row, column=self.column, sticky=W + E) row += 1 self.enabled = IntVar() self.check_enabled = Checkbutton(self, text="set enabled", variable=self.enabled) self.check_enabled.grid(row=row, column=self.column, sticky=W + E) row += 1 # Control: buttons used to emmiting text and generating file self.button_emit_globals = Button(self, text="Emit Globals", command=self.emit_globals) self.button_emit_globals.grid(row=row, column=self.column, sticky=W + E) row += 1 button_addrun = Button(self, text="Add Run", command=self.emit_run) button_addrun.grid(row=row, column=self.column, sticky=W + E) row += 1 button_generate = Button(self, text="Generate File", command=self.generate_file) button_generate.grid(row=row, column=self.column, sticky=W + E) row += 1 self.column += 1 self.pack() def initUIRuns(self): """ Second part of gui to be rendered. This contains all the fields needed to emit a single run within a distiller file. Multiple runs can be added by clicking 'Add Run' multiple times. Information in Run Parameters: Run Name - header name for run Dependencies - description and uuid fields for each dependency in the algorithm Params - parameter fields for each parameter in the algorithm """ self.entry_run_name = None self.entries_dep_description = [] self.entries_dep_uuid = [] self.entries_param = [] row = 0 label_runs = Label(self, text="Runs") label_runs.grid(row=row, column=self.column) row += 1 label_run_name = Label(self, text="Run Name") label_run_name.grid(row=row, column=self.column, sticky=W + E) row += 1 self.entry_run_name = Entry(self) self.entry_run_name.grid(row=row, column=self.column, sticky=W + E) row += 1 algorithm = self.cbox_alg.get() settings = algorithms[algorithm] for dep in settings['deps']: if row >= 21: self.column += 1 row = 1 label_dep_description = Label(self, text="{0} (description)".format(dep)) label_dep_description.grid(row=row, column=self.column, sticky=W + E) row += 1 entry_dep_description = Entry(self) entry_dep_description.grid(row=row, column=self.column, sticky=W + E) row += 1 label_dep_uuid = Label(self, text="{0} (uuid)".format(dep)) label_dep_uuid.grid(row=row, column=self.column, sticky=W + E) row += 1 entry_dep_uuid = Entry(self) entry_dep_uuid.grid(row=row, column=self.column, sticky=W + E) row += 1 self.entries_dep_description.append(entry_dep_description) self.entries_dep_uuid.append(entry_dep_uuid) for param in settings['params']: if row >= 21: self.column += 1 row = 1 label_param = Label(self, text=param) label_param.grid(row=row, column=self.column, sticky=W + E) row += 1 entry_param = Entry(self) entry_param.grid(row=row, column=self.column, sticky=W + E) row += 1 self.entries_param.append(entry_param) row = 0 self.column += 1 self.text_file = Text(self) self.text_file.grid(row=row, column=self.column, rowspan=31, sticky=W + E + N + S, padx=5, pady=5) self.column += 1 scrollbar = Scrollbar(self, command=self.text_file.yview) self.text_file.config(yscrollcommand=scrollbar.set) scrollbar.grid(row=row, column=self.column, rowspan=31, sticky=N + S) self.pack() def emit_globals(self): self.algorithm = algorithms[self.cbox_alg.get()] path = self.algorithm['path'] if self.enabled.get(): enabled = 'True' else: enabled = 'False' lines = self.inigen.emit_global(path, enabled) self.mintime = self.entry_mintime.get() self.maxtime = self.entry_maxtime.get() self.cbox_alg.configure(state='disabled') self.entry_filename.configure(state='disabled') self.entry_mintime.configure(state='disabled') self.entry_maxtime.configure(state='disabled') self.check_enabled.configure(state='disabled') self.button_emit_globals.configure(state='disabled') self.initUIRuns() self.update_text(lines) def emit_run(self): label = self.entry_run_name.get() chunking = 'parallel' #hardcoded for now mintime = self.mintime maxtime = self.maxtime lines = self.inigen.emit_run_header(label, chunking, mintime, maxtime) self.update_text(lines) deps = [] for i in range(len(self.entries_dep_description)): deps.append([ self.entries_dep_description[i].get(), self.algorithm['deps'][i], self.entries_dep_uuid[i].get() ]) params = [] for i in range(len(self.entries_param)): params.append( [self.algorithm['params'][i], self.entries_param[i].get()]) outputs = self.algorithm['outputs'] lines = self.inigen.emit_run_body(deps, params, outputs) self.update_text(lines) def generate_file(self): self.inigen.generate_file(self.entry_filename.get()) self.quit() def update_text(self, lines): self.text_file.configure(state='normal') string = "\n".join(lines) self.text_file.insert(END, string) self.text_file.configure(state='disabled')
class Example(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.parent = parent self.initUI() def initUI(self): self.parent.title("Windows") self.pack(fill=BOTH, expand=True) self.columnconfigure(1, weight=1) self.columnconfigure(3, pad=7) self.rowconfigure(3, weight=1) self.rowconfigure(5, pad=7) #check button variable self.testMode_check_button = IntVar() self.collectionMode_check_button = IntVar() self.isOldCoordinateFile= IntVar() #entry string variable self.entry_1_string = StringVar() self.entry_2_string = StringVar() self.entry_3_string = StringVar() self.entry_4_string = StringVar() self.entry_5_string = StringVar() self.entry_6_string = StringVar() self.entry_7_string = StringVar() self.entry_1_string.set("database12.xls") self.entry_2_string.set("coeffnmean12.xls") self.entry_3_string.set(".xls") self.entry_4_string.set(".xls") self.saveFileName= StringVar() self.saveCoordinateFileName = StringVar() # database array self.radiusArray =[] self.xavgArray=[] self.yavgArray=[] self.coeffIndexArray=[] # coefficient array self.coeffArray=[] self.meanRGBArray=[] self.VarCoeffArray=[] self.adjustmentRGBArray=np.zeros(shape=(1,3)) self.referenceRGBArray=np.zeros(shape=(1,3)) # num Of Area self.numberOfArea=IntVar() # num of Sec self.numberOfSec= IntVar() # flag of the camera action self.stopCameraPreview=BooleanVar() self.stopCameraClipAndCrop= BooleanVar() self.stopCameraExperiment = BooleanVar() #init the flag self.stopCameraPreview.set(FALSE) self.stopCameraClipAndCrop.set(FALSE) self.stopCameraExperiment.set(FALSE) # image variable self.cropImage =[] #clip and clop self.refPt=[] self.cropping=[] self.cropNumber=IntVar() self.selectAreaArray=[] #Step 1 lbl1 = Label(self, text="Step 1: Input file name ") lbl1.grid(sticky=W, pady=4, padx=5) #check button self.checkbutton0 = Checkbutton(self,text="Test mode (no database, coefficient, coordinate, save file)" ,variable=self.testMode_check_button,command=self.testMode) self.checkbutton0.grid(row=1,columnspan = 3, sticky=W,pady=3,padx=5) self.checkbutton1 = Checkbutton(self,text="Collection data mode (no database, coefficient)" ,variable=self.collectionMode_check_button,command=self.collecitonMode) self.checkbutton1.grid(row=2,columnspan = 3,sticky=W,pady=3,padx=5) #input database xls file name self.label_1 = Label(self, text = "Type the database file name(xls)") self.label_1.grid(row=3,column=0, sticky= W,padx=5,pady=3) self.entry_1 = Entry(self,textvariable=self.entry_1_string) self.entry_1.grid(row=3,column = 1) #input coefficient self.label_2 = Label(self, text = "Type the coefficient file name(xls)") self.label_2.grid(row=4,column=0, sticky= W,padx=5,pady=3) self.entry_2 = Entry(self,textvariable=self.entry_2_string) self.entry_2.grid(row=4,column = 1) #input the coordinate file self.label_3 = Label(self, text = "Type new or load coordinate file(xls)") self.label_3.grid(row=5,column=0, sticky= W,padx=5,pady=3) self.entry_3 = Entry(self,textvariable=self.entry_3_string) self.entry_3.grid(row=5,column = 1) self.checkbutton3 = Checkbutton(self,text="load old file? " ,variable=self.isOldCoordinateFile,command=self.isOldCoordinateFileMethod) self.checkbutton3.grid(row=5,column=2,columnspan = 3,sticky=W,padx=5,pady=3) #input the result file self.label_4 = Label(self, text = "Type the save file name(xls)") self.label_4.grid(row=6,column=0, sticky= W,padx=5,pady=3) self.entry_4 = Entry(self,textvariable=self.entry_4_string) self.entry_4.grid(row=6,column = 1) self.step1_next_btn = Button(self, text="Go to Step 2",command= self.pressStep1NextBtn) self.step1_next_btn.grid(row=7, column =2, padx=5,pady=3) #Step 2 lbl1 = Label(self, text="Step 2: Input Variable") lbl1.grid(sticky=W, pady=4, padx=5) self.label_5 = Label(self, text = "How many sencod") self.label_5.grid(row=9,column=0, sticky= W,padx=5,pady=3) self.entry_5 = Entry(self,textvariable=self.entry_5_string,state='disabled') self.entry_5.grid(row=9,column = 1) self.label_6 = Label(self, text = "How many areas") self.label_6.grid(row=10,column=0, sticky= W,padx=5,pady=3) self.entry_6 = Entry(self,textvariable=self.entry_6_string,state='disabled') self.entry_6.grid(row=10,column = 1) self.label_7 = Label(self, text = "How many variable from database") self.label_7.grid(row=11,column=0, sticky= W,padx=5,pady=3) self.entry_7 = Entry(self,textvariable=self.entry_7_string,state='disabled') self.entry_7.grid(row=11,column = 1) self.step2_next_btn = Button(self, text="Go to Step 3",command= self.pressStep2NextBtn,state='disabled') self.step2_next_btn.grid(row=14, column =2, padx=5,pady=3) #step 3 lbl2 = Label(self, text="Step 3: Experiment") lbl2.grid(sticky=W, pady=4, padx=5) # preview button self.start_preview_button = Button(self, text="Start Preview Video", command=self.startPreview,state='disabled') self.start_preview_button.grid(row=16,column=0,sticky=W) self.stop_preview_button = Button(self, text="Stop Preview Video", command=self.stopPreview,state='disabled') self.stop_preview_button.grid(row=16,column=1,sticky=W) #click and crop image button self.start_click_and_crop_button = Button(self, text="Start Crop Image", command=self.startClipAndCrop,state='disabled') self.start_click_and_crop_button.grid(row=17,column=0,sticky=W) self.stop_click_and_crop_button = Button(self, text="Close Crop Image", command=self.stopClipAndCrop,state='disabled') self.stop_click_and_crop_button.grid(row=17,column=1,sticky=W) # strart experiment self.start_experiment_button = Button(self, text="Start Experiment", command=self.startExperimentButtonPress,state='disabled') self.start_experiment_button.grid(row=18,column=0,sticky=W) self.stop_experiment_button = Button(self, text="Stop Experiment", command=self.stopExperimentButtonPress,state='disabled') self.stop_experiment_button.grid(row=18,column=1,sticky=W) def pressStep2NextBtn(self): if(len(self.entry_5_string.get())>0 and len(self.entry_6_string.get())>0): if self.isOldCoordinateFile.get(): if not self.checkFileExit(self.saveCoordinateFileName.get()): print 'old coordinate file is not exit, please input correct file name' return # else: # area is define by the entry else: self.numberOfArea.set(str(self.entry_6_string.get())) # add 1 area for the color calibration self.enableStep3Area() if len(self.selectAreaArray)==0: self.selectAreaArray= np.zeros(shape=(self.numberOfArea.get()*2,2)) self.numberOfSec.set(str(self.entry_5_string.get())) self.saveFileName.set(self.entry_4_string.get()) self.saveCoordinateFileName.set(self.entry_3_string.get()) print "go to step 3 " print 'number of area '+str(self.numberOfArea.get()) print 'number of sec '+str(self.numberOfSec.get()) print 'save file name: '+self.saveFileName.get() print 'save coordinate name '+self.saveCoordinateFileName.get() # if old file is select, check file exit else: print "please enter correct number" def pressStep1NextBtn(self): # test mode if(self.testMode_check_button.get()): print "test mode" self.enableStep2Area() # collection mode elif (self.collectionMode_check_button.get()): print "collection mode" if (len(self.entry_3_string.get()) <4 or len(self.entry_4_string.get()) <4): print "Please input correct file name" else: self.enableStep2Area() # normal mode else: if (len(self.entry_1_string.get()) <4 or len(self.entry_2_string.get()) <4 or len(self.entry_3_string.get()) <4 or len(self.entry_4_string.get()) <4): print "Please input correct file name" else: print "normal next step" if (self.checkFileExit(self.entry_1_string.get()) and (self.checkFileExit(self.entry_2_string.get()))): self.enableStep2Area() self.openCoefficientFileAndDataBase(self.entry_1_string.get(),self.entry_2_string.get()) def openOldCoordinateFile(self,coordFileName): data1 = xlrd.open_workbook(coordFileName) table= data1.sheets()[0] DareaNum=table.nrows areaNum=int(DareaNum/2) # set up area number base on the selectAreaArray=np.zeros(shape=(DareaNum,2)) for si in range(DareaNum): selectAreaArray[si][0],selectAreaArray[si][1]=table.row_values(si) return selectAreaArray def enableStep3Area(self): self.start_preview_button.configure(state='normal') self.stop_preview_button.configure(state='normal') self.start_experiment_button.configure(state='normal') self.stop_experiment_button.configure(state='normal') #if not old file if not self.isOldCoordinateFile.get(): self.start_click_and_crop_button.configure(state='normal') self.stop_click_and_crop_button.configure(state='normal') def enableStep2Area(self): self.step2_next_btn.configure(state='normal') self.entry_5.configure(state='normal') self.entry_6.configure(state='normal') if (not self.testMode_check_button.get()): self.entry_7.configure(state='normal') def isOldCoordinateFileMethod(self): print "old file" self.saveCoordinateFileName.set(self.entry_3_string.get()) #check if the old file is exit if self.isOldCoordinateFile.get(): if not self.checkFileExit(self.entry_3_string.get()): print 'file is not exit,please check again' else: self.selectAreaArray=self.openOldCoordinateFile(self.saveCoordinateFileName.get()) #print self.selectAreaArray numrow = len(self.selectAreaArray)/2 # 2 columns in your example #not in test and collection mode #check again database has same area as old coordinate file if (not self.testMode_check_button.get()) and (not self.collectionMode_check_button.get()): if not numrow == self.numberOfArea.get(): print 'error------coordinate file has different number of area from cooefficient file--------' else: self.numberOfArea.set(numrow) self.entry_6_string.set(numrow) self.entry_3.configure(state='disabled') else: self.entry_3.configure(state='normal') def checkFileExit(self,fileName): if os.path.exists(fileName): return TRUE else: print fileName+' not exit' return FALSE def testMode(self): if(self.testMode_check_button.get()): self.checkbutton1.configure(state='disabled') self.entry_1_string.set("disable") self.entry_2_string.set("disable") self.entry_3_string.set("disable") self.entry_4_string.set("disable") self.entry_1.configure(state='disabled') self.entry_2.configure(state='disabled') self.entry_3.configure(state='disabled') self.entry_4.configure(state='disabled') self.entry_7.configure(state='disabled') else: self.checkbutton1.configure(state='normal') self.entry_1_string.set("database12.xls") self.entry_2_string.set("coeffnmean12.xls") self.entry_3_string.set(".xls") self.entry_4_string.set(".xls") self.entry_1.configure(state='normal') self.entry_2.configure(state='normal') self.entry_3.configure(state='normal') self.entry_4.configure(state='normal') self.entry_7.configure(state='normal') def collecitonMode(self): if(self.collectionMode_check_button.get()): self.checkbutton0.configure(state='disabled') self.entry_1_string.set("disable") self.entry_2_string.set("disable") self.entry_1.configure(state='disabled') self.entry_2.configure(state='disabled') self.entry_7.configure(state='disabled') else: self.checkbutton0.configure(state='normal') self.entry_1_string.set("database12.xls") self.entry_2_string.set("coeffnmean12.xls") self.entry_1.configure(state='normal') self.entry_2.configure(state='normal') self.entry_7.configure(state='normal') def previewCamera(self): print 'start preview' print self.selectAreaArray for area in range(self.numberOfArea.get()): startPoint = (int(self.selectAreaArray[area*2][0]),int(self.selectAreaArray[area*2][1])) endPoint = (int(self.selectAreaArray[area*2+1][0]),int(self.selectAreaArray[area*2+1][1])) print startPoint print endPoint with picamera.PiCamera() as camera: #camera = picamera.PiCamera() camera.resolution= (640,480) camera.frameate=32 camera.shutter_speed=camera.exposure_speed camera.exposure_mode='off' camera.awb_mode='off' camera.awb_gains=(1.6, 1.4) # white balance parameter camera.brightness=60 # brightness camera.contrast=20 camera.saturation=20 camera.sharpness=1 rawCapture = PiRGBArray(camera,size=(640,480)) time.sleep(0.1) cv2.namedWindow("realtimeImage") cv2.startWindowThread() for frame in camera.capture_continuous(rawCapture,format="bgr",use_video_port=True): image01=frame.array # if load old coordinage file , draw the rectangle area if self.isOldCoordinateFile.get(): for area in range(self.numberOfArea.get()): color = (0,255,0) if area ==0: color = (0,255,255) else: color = (0,255,0) startPoint = (int(self.selectAreaArray[area*2][0]),int(self.selectAreaArray[area*2][1])) endPoint = (int(self.selectAreaArray[area*2+1][0]),int(self.selectAreaArray[area*2+1][1])) cv2.rectangle(image01,startPoint,endPoint,color,2) #show image cv2.imshow("realtimeImage",image01) key=cv2.waitKey(10) &0xFF rawCapture.truncate(0) if key==ord("q") or self.stopCameraPreview.get(): cv2.destroyAllWindows() # close window self.stopCameraExperiment.set(FALSE) self.stopCameraClipAndCrop.set(FALSE) self.stopCameraPreview.set(FALSE) break def cropCameraImage(self): print 'start preview in crop image for 3 sec' startTime = time.time() with picamera.PiCamera() as camera: #camera = picamera.PiCamera() camera.resolution= (640,480) camera.frameate=32 camera.shutter_speed=camera.exposure_speed camera.exposure_mode='off' camera.awb_mode='off' camera.awb_gains=(1.6, 1.4) camera.brightness=60 camera.contrast=20 camera.saturation=20 camera.sharpness=1 rawCapture = PiRGBArray(camera,size=(640,480)) time.sleep(0.1) cv2.namedWindow("realtimeImage") cv2.startWindowThread() for frame in camera.capture_continuous(rawCapture,format="bgr",use_video_port=True): self.cropImage=frame.array #show image cv2.imshow("realtimeImage",self.cropImage) key=cv2.waitKey(1 ) &0xFF rawCapture.truncate(0) if time.time()-startTime>3 or self.stopCameraClipAndCrop.get(): cv2.destroyAllWindows() # close window self.stopCameraExperiment.set(FALSE) self.stopCameraClipAndCrop.set(FALSE) self.stopCameraPreview.set(FALSE) break # end of realtime preview cv2.namedWindow("currentImage") cv2.startWindowThread() cv2.setMouseCallback("currentImage",self.click_and_crop) cv2.imshow("currentImage",self.cropImage) def click_and_crop(self,event,x,y,flags,param): #grab references to the global variables #global refPt, cropping,cropNumber,selectAreaArray #if the left mouse button was clicked record the starting #(x,y) coordinates and indicate that cropping in being #performed if self.cropNumber.get() == self.numberOfArea.get(): print "reach area number" return if event ==cv2.EVENT_LBUTTONDOWN: self.refPt=[(x,y)] self.selectAreaArray[self.cropNumber.get()*2]=(x,y) #testNumber=0 #check to see if the left mouse button was released elif event == cv2.EVENT_LBUTTONUP: #record the ending (x,y) coordinates and inidate that #that cropping operation is finished self.refPt.append((x,y)) self.selectAreaArray[self.cropNumber.get()*2+1]=(x,y) #draw a rectangle around the region of interest print self.refPt[0] print self.refPt[1] color = (0,255,0) if self.cropNumber.get() ==0: color = (0,255,255) else: color = (0,255,0) cv2.rectangle(self.cropImage,self.refPt[0],self.refPt[1],color,2) self.cropNumber.set(self.cropNumber.get()+1) # add one area num print self.cropNumber print self.selectAreaArray #cv2.destroyAllWindows() #cv2.namedWindow("currentImage") #cv2.startWindowThread() cv2.imshow("currentImage",self.cropImage) # end of area and not in test mode . save the coordinate file if (self.cropNumber.get() == self.numberOfArea.get()) and (not self.testMode_check_button.get()) : ourthread = threading.Thread(target=self.saveCoordinateXLS2(self.saveCoordinateFileName.get(),self.selectAreaArray)) ourthread.start() def saveCoordinateXLS2(self,coorFileName,temparray): workbook = xlwt.Workbook() worksheet = workbook.add_sheet('Coordinates') for row, array in enumerate(temparray): for col, value in enumerate(array): worksheet.write(row,col,value) workbook.save(coorFileName) print "end wirte coordinate file" #start experiment def starExperiment(self): print 'start experiment' with picamera.PiCamera() as camera: sensor_roi = dict() # create a dict for storing sensor data tempSaveFileArray=[] #camera = picamera.PiCamera() camera.resolution= (640,480) camera.frameate=10 camera.shutter_speed=camera.exposure_speed camera.exposure_mode='off' camera.awb_mode='off' camera.awb_gains=(1.6, 1.4) camera.brightness=60 camera.contrast=20 camera.saturation=20 camera.sharpness=1 rawCapture = PiRGBArray(camera,size=(640,480)) time.sleep(0.1) cv2.namedWindow("experimentImage") cv2.startWindowThread() tstart=time.time() currentFrame=0 for frame in camera.capture_continuous(rawCapture,format="bgr",use_video_port=True): image=frame.array # calculate the frame frametime = time.time()-tstart print('frame: '+str(currentFrame)+' time: '+str(frametime)) # get mean RGB from frame 1 if currentFrame==0: senor_roi_01=dict() # create a dict for storing sensor data senor_roi_01[0] = image[int(self.selectAreaArray[(0)*2][1]):int(self.selectAreaArray[(0)*2+1][1]) ,int(self.selectAreaArray[(0)*2][0]):int(self.selectAreaArray[(0)*2+1][0])] # get mean of each area b,g,r,w=cv2.mean(senor_roi_01[0]) #clear senor_roi_01 dict senor_roi_01.clear() self.referenceRGBArray[0][0]=r self.referenceRGBArray[0][1]=g self.referenceRGBArray[0][2]=b # create a temp array to save the mean of each area SampleRGB=np.zeros(shape=(1,3*self.numberOfArea.get())) #grab each area for area in range(self.numberOfArea.get()): sensor_roi[0] = image[int(self.selectAreaArray[(area)*2][1]):int(self.selectAreaArray[(area)*2+1][1]) ,int(self.selectAreaArray[(area)*2][0]):int(self.selectAreaArray[(area)*2+1][0])] # get Mean RGB b,g,r,w=cv2.mean(sensor_roi[0]) #clear sensor_roi dict sensor_roi.clear() if area==0: # get adjust mean rgb at area 0 tempMeam=np.zeros(shape=(1,3)) tempMeam[0][0]=r tempMeam[0][1]=g tempMeam[0][2]=b self.adjustmentRGBArray = np.zeros(shape=(1,3)) self.adjustmentRGBArray = tempMeam-self.referenceRGBArray print 'adjust RGB' print self.adjustmentRGBArray else: # get sampeRGB for the rest of area SampleRGB[0][area*3]=r+self.adjustmentRGBArray[0][0] SampleRGB[0][area*3+1]=g +self.adjustmentRGBArray[0][1] SampleRGB[0][area*3+2]=b +self.adjustmentRGBArray[0][2] tempObjectRGB = [currentFrame,area,r,g,b] tempSaveFileArray.append(tempObjectRGB) # end of the area # if not in test mode and not in collection mode if (not self.testMode_check_button.get()) and ( not self.collectionMode_check_button.get()): if area == self.numberOfArea.get()-1: self.processPCACompareAlgorithm(SampleRGB,self.meanRGBArray,self.VarCoeffArray) # draw the line for area in range(self.numberOfArea.get()): color = (0,255,0) if area ==0: color= (0,255,255) else: color = (0,255,0) startPoint = (int(self.selectAreaArray[area*2][0]),int(self.selectAreaArray[area*2][1])) endPoint = (int(self.selectAreaArray[area*2+1][0]),int(self.selectAreaArray[area*2+1][1])) cv2.rectangle(image,startPoint,endPoint,color,1) #show image cv2.imshow("experimentImage",image) key=cv2.waitKey(1 ) &0xFF rawCapture.truncate(0) currentFrame=currentFrame+1 #chcek if the time period if end or press c save file if time.time()-tstart > self.numberOfSec.get() : #close the light GPIO.output(11,False) GPIO.output(15,False) cv2.destroyAllWindows() # close window # not in test mode save file if(not self.testMode_check_button.get()): ourthread = threading.Thread(target=self.saveRGBdataIntoXLS(self.saveFileName.get(),tempSaveFileArray)) ourthread.start() break #quit funcion if key==ord("q") or self.stopCameraExperiment.get(): GPIO.output(11,False) GPIO.output(15,False) cv2.destroyAllWindows() # close window self.stopCameraExperiment.set(FALSE) self.stopCameraClipAndCrop.set(FALSE) self.stopCameraPreview.set(FALSE) break #draw the rectangle def is_in_circle(x,y,raduis,center_x,center_y): d =math.sqrt(math.pow(center_x-x,2)+math.pow(center_y-y,2)) print d return d<=raduis def processPCACompareAlgorithm(self,sampleRGBArray, meanRGBArray, varCoeffArray): testPCA = sampleRGBArray-meanRGBArray[1] Var1=sum(sum(testPCA*varCoeffArray[0])) Var2=sum(sum(testPCA*varCoeffArray[1])) # chek if the var1 is inside a circle if self.is_in_circle(Var1,Var2,self.radiusArray[0],self.xavg[0],self.yavg[0]): print 'Detected: x:'+str(Var1)+' y: '+str(Var2) else: print 'Not Detectedx:'+str(Var1)+' y: '+str(Var2) ''' old // 1 d not use anymore def processPCACompareAlgorithm(self,sampleRGBArray, meanRGBArray, varCoeffArray): testPCA = sampleRGBArray-meanRGBArray[1] Var1=sum(sum(testPCA*varCoeffArray[0])) Var1IntBigger= float(self.entry_8_string.get()) print Var1IntBigger Var1IntLess= float(self.entry_9_string.get()) print Var1IntLess if Var1>Var1IntBigger: #Result=0 print 'NORMAL' elif Var1<Var1IntLess: #Result=1 print 'DETECT!!' else : print 'NOT FOUND' ''' def saveRGBdataIntoXLS(self,filename, temparray): data = xlwt.Workbook() dataws = data.add_sheet('Data') for row, array in enumerate(temparray): for col, value in enumerate(array): dataws.write(row,col,value) data.save(filename) print "end wirte rgb save file, end program after 2 sec" time.sleep(2) sys.exit(0) def startPreview(self): # put camera into thread t1 = threading.Thread(target=self.previewCamera) t1.start() def stopPreview(self): self.stopCameraExperiment.set(TRUE) self.stopCameraClipAndCrop.set(TRUE) self.stopCameraPreview.set(TRUE) print 'stop preview' def startClipAndCrop(self): t2= threading.Thread(target=self.cropCameraImage) t2.start() def stopClipAndCrop(self): #self.stopCameraExperiment.set(TRUE) self.stopCameraClipAndCrop.set(TRUE) #self.stopCameraPreview.set(TRUE) cv2.destroyAllWindows() print 'close crop image' def startExperimentButtonPress(self): t3=threading.Thread(target=self.starExperiment) t3.start() def stopExperimentButtonPress(self): self.stopCameraExperiment.set(TRUE) self.stopCameraClipAndCrop.set(TRUE) self.stopCameraPreview.set(TRUE) print 'close experiment image' #opne coefficient file and database file to get data def openCoefficientFileAndDataBase(self,databaseFile,coefficientFile): #open database ref2=xlrd.open_workbook(databaseFile) table2=ref2.sheets()[0] database=np.zeros(shape=(table2.nrows,table2.ncols)) dRows=table2.nrows dCols=table2.ncols for i in range(0,dRows): for j in range(0,dCols): #print float(table2.cell(i,j).value) database[i][j]=float(table2.cell(i,j).value) # average of x self.xavg=database[1] print str(self.xavg) # average of y self.yavg=database[2] # radius of thie coefficience self.radiusArray=database[3] # index in coefficience array self.coeffIndexArray=database[4] #open coefficient mean ref1=xlrd.open_workbook(coefficientFile) table1=ref1.sheets()[0] self.coeffArray=np.zeros(shape=(table1.nrows-2,table1.ncols)) self.meanRGBArray=np.zeros(shape=(2,table1.ncols)) self.VarCoeffArray = np.zeros(shape=(len(self.coeffIndexArray),table1.ncols)) cRows=table1.nrows cCols=table1.ncols # get coefficient data from file for i in range(0,cRows-2): for j in range(0,cCols): self.coeffArray[i][j]=table1.cell(i,j).value #get varcoeffarray for i in range(0,len(self.coeffIndexArray)): #print self.VarCoeffArray[i] #print self.coeffIndexArray[i] #print[row[self.coeffIndexArray[i]-1] for row in self.coeffArray] self.VarCoeffArray[i]=[row[self.coeffIndexArray[i]-1] for row in self.coeffArray] #print 'self.VarCoeffArray' #print self.VarCoeffArray[0] for i in range(cRows-2,cRows): for j in range(0,cCols): self.meanRGBArray[i-cRows+2][j]=table1.cell(i,j).value # get number of Area base on the coefficinet file self.numberOfArea.set(int(table1.ncols/3)) self.entry_6_string.set(str(self.numberOfArea.get())) #self.entry_6.configure(state='disabled') # get number of variable from database file self.entry_7_string.set(str(len(self.coeffIndexArray)))
class Mainframe(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.lock = threading.Lock() self.parent = parent self.project = None self.speakers = None self.imgDir = "symbols/" self.alpha = ['A','B','C','D','E','F','G','H','I'] self.colors = ["blue", "green", "yellow", "orange", "pink", "purple", "red", "brown", "black"] self.imagemap = {} h = 30 w = 50 self.imagemap['deflection'] = PhotoImage(file=self.imgDir+"deflection.gif", height=h, width=w) self.imagemap['question'] = PhotoImage(file=self.imgDir+"question.gif", height=h, width=w) self.imagemap['hesitation'] = PhotoImage(file=self.imgDir+"hesitation.gif", height=h, width=w) self.imagemap['interrupt'] = PhotoImage(file=self.imgDir+"interrupt.gif", height=h, width=w) self.imagemap['overcoming'] = PhotoImage(file=self.imgDir+"overcoming.gif", height=h, width=w) self.imagemap['support'] = PhotoImage(file=self.imgDir+"support.gif", height=h, width=w) self.imagemap['yesand'] = PhotoImage(file=self.imgDir+"yesand.gif", height=h, width=w) self.imagemap['humour'] = PhotoImage(file=self.imgDir+"humour.gif", height=h, width=w) self.imagemap['move'] = PhotoImage(file=self.imgDir+"move.gif", height=h, width=w) self.imagemap['block'] = PhotoImage(file=self.imgDir+"block.gif", height=h, width=w) self.imagemap['yesandquestion'] = PhotoImage(file=self.imgDir+"yesandquestion.gif", height=h, width=w) self.imagemap['blank'] = PhotoImage(file=self.imgDir+"blank.gif", height=h, width=w) self.imagemap['block-support'] = PhotoImage(file=self.imgDir+"block-support.gif", height=h, width=w) self.buttonmap={} self.player = gst.element_factory_make('playbin2', 'player') self.play = Button(self, text="Play", width=45) self.play.grid(row=5,column=0) self.entry = Entry(self, width=50) self.entry.grid(row=5, column=1) self.back = Button(self, text="Playback", width=45) self.back.grid(row=5, column=2) self.imgID = 0 self.imgMap = {} self.codeMode = True #self.progress self.var = DoubleVar() self.prev = 0 self.flag_video_start = 0 self.pause_changed = 0 self.duration = 0 self.initUI() def getTime(self): pass def on_sync_message(self, bus, message, window_id): print "sync message" if not message.structure is None: if message.structure.get_name() == 'prepare-xwindow-id': image_sink = message.src image_sink.set_property('force-aspect-ratio', True) self.lock.acquire() #image_sink.set_xwindow_id(window_id) self.lock.release() def on_message(self, bus, message, window_id): t = message.type if t == gst.MESSAGE_EOS: self.player.set_state(gst.STATE_NULL) self.play["Text"] = "Play" elif t == gst.MESSAGE_ERROR: self.player.set_state(gst.STATE_NULL) err, debug = message.parse_error() print "Error: %s" % err, debug self.play["Text"] = "Play" #Video embedding part-------------------------------------------------- def sel_play(self): #print self.prev val2 = self.var.get() #print val2 val = val2 + 1 if val2 == 0 and self.flag_video_start == 0: print "starting" self.var.set(0) self.flag_video_start = 1 else: self.var.set(val) #print self.prev - self.var.get() if self.pause_changed: print "paused flag" self.player.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH, (self.var.get()-1)*(10**9)) self.prev = self.var.get()-1 self.var.set(self.prev) self.pause_changed = 0 if (self.prev-self.var.get()) != -1: #print self.var.get()-val self.player.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH, self.var.get()*(10**9)) self.prev = self.var.get() else: self.prev = self.var.get() self.job = self.after(1000, self.sel_play) def play_video(self): if self.play["text"] == "Play": self.player.set_state(gst.STATE_PLAYING) self.play["text"] = "Pause" self.sel_play() else: self.pause_changed = 1 self.player.set_state(gst.STATE_PAUSED) self.play["text"] = "Play" self.after_cancel(self.job) while self.duration == 0: time.sleep(.1) try: self.duration = self.player.query_duration(gst.FORMAT_TIME, None)[0] except: pass #print self.duration/1000000000.0 self.slider.configure(from_=0, to=self.duration/1000000000) def play_back(self): pos_int = self.player.query_position(gst.FORMAT_TIME, None)[0] text = self.entry.get() diff = 0 if text=="": diff = pos_int - (3*(10**9)) else: val = float(self.entry.get()) diff = pos_int - (val*(10**9)) #print pos_int #print diff/(10**9) if diff>0: self.player.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH, diff) print self.var.get() - (diff/10**9) self.var.set(diff/10**9) else: self.player.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH, 0) self.var.set(0) if self.play["text"] == "Play": print "here" timestamp = self.player.query_position(gst.FORMAT_TIME, None)[0] print timestamp self.display.mark_set("mine2", "1.%d" % floor(timestamp/1000000000.0/.2)) self.display.see("1.%d" % (floor(timestamp/1000000000.0/.2)+8)) self.display.see("mine2") def play_forward(self): pos_int = self.player.query_position(gst.FORMAT_TIME, None)[0] text = self.entry.get() diff = 0 if text=="": diff = pos_int + (3*(10**9)) else: val = float(self.entry.get()) diff = pos_int + (val*(10**9)) #print pos_int #print diff/(10**9) if diff>0: self.player.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH, diff) print self.var.get() - (diff/10**9) self.var.set(diff/10**9) else: self.player.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH, 0) self.var.set(0) def startVid(self): gobject.threads_init() video = Frame(self, background='black') video.grid(row=0, column=0, columnspan=8, rowspan=4, padx=2, sticky=E+W+S+N) window_id = video.winfo_id() self.buf = gst.Buffer() self.bin = gst.Bin("my-bin") timeoverlay = gst.element_factory_make("timeoverlay", "overlay") self.bin.add(timeoverlay) pad = timeoverlay.get_pad("video_sink") ghostpad = gst.GhostPad("sink", pad) self.bin.add_pad(ghostpad) videosink = gst.element_factory_make("ximagesink") self.bin.add(videosink) gst.element_link_many(timeoverlay, videosink) self.player.set_property('video-sink', self.bin) self.player.set_property('uri', 'file://%s' % (os.path.abspath(self.project.videoPath))) bus = self.player.get_bus() bus.add_signal_watch() bus.enable_sync_message_emission() bus.connect("message", self.on_message, window_id) bus.connect('sync-message::element', self.on_sync_message, window_id) self.play.configure(command=lambda: self.play_video()) self.back.configure(command=self.play_back) #self.back = Button(self, text="Playback", command=play_back, width=50) #self.back.grid(row=5, column=2) #Video embedding done--------------------------------------------------- def startSpeakers(self): #Speakers s = [] self.checkvars = [] for i in range(self.NUM_SPEAKERS): s.append(self.alpha[i]) self.checkvars.append(IntVar()) if self.speakers != None: for pair in self.speakers: pair[0].grid_forget() i=0 self.speakers = [] sframe = Frame(height=2) for text in s: b = Checkbutton(self.buttongrid, text=text, variable=self.checkvars[i], onvalue = 1, offvalue = 0) self.speakers.append((b, self.colors[i])) #b.grid(row=i//4, column=(i%4)) b.grid(row=i,column=0) def callback(sv, i): self.project.speakerID[i+1] = sv.get() sv = StringVar() sv.trace("w", lambda name, index, mode, sv=sv, i=i:callback(sv, i)) c = Entry(self.buttongrid, textvariable=sv) #TODO HERE c.insert(0, self.project.speakerID[i+1]) c.grid(row=i, column=1, columnspan=3) i += 1 #Done with speakers def getProject(self, inp): self.project = inp self.NUM_SPEAKERS = self.project.numSpeaker self.parent.title("Project "+self.project.projectName) self.startVid() self.startSpeakers() self.num_inserted = [] self.var.set(0) def deleteSymbol(self, event): print("delete") try: img = str(event.widget) img = img[img.rfind(".")+1:] self.display.config(state=NORMAL) self.display.delete(CURRENT) self.display.config(state=DISABLED) self.display.image_create(CURRENT, image=self.imagemap['blank']) self.project.seq.delete(None, self.imgMap[int(img)]) del self.imgMap[int(img)] except: print "error delete" def update_symbols(self, text, timestamp = None, inspeakers = None, inidea = None): #Stores timestamp if timestamp == None: timestamp = self.player.query_position(gst.FORMAT_TIME, None)[0] self.display.mark_set("mine", "1.%d" % floor(timestamp/1000000000.0/.2)) if len(str(self.display.get("mine"))) == 0: self.display.config(state=NORMAL) self.display.delete("mine") self.display.config(state=DISABLED) #Stores current speakers current_speakers = [] store_speakers = [] if inspeakers == None: for i in range(len(self.speakers)): if self.checkvars[i].get() == 1: current_speakers.append((self.alpha[i], self.colors[i])) store_speakers.append(i+1) else: store_speakers = inspeakers current_speakers = [(self.alpha[i-1], self.colors[i-1]) for i in inspeakers] tempstr = "" for sp in current_speakers: tempstr += sp[0] if inidea or (inidea == None and self.idea_var.get()==1): tmplbl = Label(self.display, name="%u" % self.imgID, image=self.imagemap[text], text=tempstr, compound="bottom", background="yellow") else: tmplbl = Label(self.display, name="%u" % self.imgID, image=self.imagemap[text], text=tempstr, compound="bottom", background="white") tmpwin = self.display.window_create('mine', window=tmplbl) tmplbl.bind("<Button-3>", self.deleteSymbol) #right click tmplbl.bind("<Button-1>", lambda ev: EditSymDialog(self, ev)) #left click self.imgID += 1 idea = False if inidea == True or (inidea == None and self.idea_var.get() == 1): idea = True if self.project != None: curr = Code(timestamp/1000000000.0, text, store_speakers, idea) self.project.seq.insert(curr) self.imgMap[self.imgID-1] = timestamp/1000000000.0 def update_display(self): self.display.image_create('1.0', image=self.imagemap['blank']) while True: if self.play["text"] == "Pause": try: timestamp = self.player.query_position(gst.FORMAT_TIME, None)[0] if timestamp >= self.duration: self.play_video() self.display.mark_set("mine2", "1.%d" % floor(timestamp/1000000000.0/.2)) self.display.see("1.%d" % (floor(timestamp/1000000000.0/.2)+8)) self.display.see("mine2") self.display.config(state=NORMAL) for i in range(int(floor(timestamp/1000000000.0/.2))+10 - int(self.display.index('1.end').split('.')[1])): self.display.image_create('1.end', image=self.imagemap['blank']) self.display.config(state=DISABLED) time.sleep(.2) except: continue else: time.sleep(.2) def initUI(self): self.parent.title("Main") self.style = Style() self.style.theme_use("default") self.pack(fill=BOTH, expand=1) self.columnconfigure(1, weight=1) self.columnconfigure(15, pad=7) self.rowconfigure(3, weight=1) self.rowconfigure(10, pad=7) def hello(): print "hello!" #Menubar-------------------------------------------------------------- menubar = Tkinter.Menu(self) filemenu = Tkinter.Menu(menubar, tearoff=0) filemenu.add_command(label="New", command=lambda: NewProjectDialog(self)) filemenu.add_command(label="Open", command=lambda: OldProjectDialog(self)) filemenu.add_command(label="Save", command=lambda: self.project.saveProject()) filemenu.add_command(label="Save As", command=lambda: SaveAsDialog(self, self.project)) filemenu.add_command(label="Save and Export Image", command=lambda: self.project.saveAndExportImage()) filemenu.add_separator() filemenu.add_command(label="Exit", command=self.parent.quit) menubar.add_cascade(label="File", menu=filemenu) #Create analysis window here #def do_popup_analysis(): # new_frame = Tkinter.Tk() #menubar.add_command(label="Analysis", command=do_popup_analysis) #def do_popup_plot(): # new_frame = Tkinter.Tk() #menubar.add_command(label="Plot", command=do_popup_plot) menubar.add_command(label="Help", command=lambda: helpDialog(self)) self.parent.config(menu=menubar) #Menubar done---------------------------------------------------------- #Choose Project part--------------------------------------------------- self.box = Frame(self) self.box.grid(row=0, column=0, columnspan=8, rowspan=4, padx=2) btn = Button(self.box, text="New Project", command=lambda: NewProjectDialog(self), default=ACTIVE) btn.grid(row=0, column=0, columnspan = 4, rowspan=4, padx=2) btn2 = Button(self.box, text="Open Project", command=lambda: OldProjectDialog(self), default=ACTIVE) btn2.grid(row=0, column=4, columnspan = 4, rowspan=4,padx=2) #Project done---------------------------------------------------------- #Display of symbols self.display = Text(self, height=4, wrap=NONE) self.display.grid(row=7, column=0, rowspan=3, columnspan=3, sticky=E+W) #scrollbar = Scrollbar(self, orient=HORIZONTAL, command=self.display.xview) #remove seekbar #scrollbar.grid(row=10,column=0, columnspan=3, sticky=N+S+E+W) #self.display['xscrollcommand'] = scrollbar.set #Adding time dependent display self.t = threading.Thread(target=self.update_display) self.t.daemon = True self.t.start() #Display done #Slider self.slider = Scale(self, orient=HORIZONTAL, variable = self.var) self.slider.grid(row=6, column=0, columnspan=3, sticky=N+S+E+W) #Done with slider #Buttons for symbols---------------------------------------------------- buttongrid = Frame(self) self.buttongrid = buttongrid buttongrid.grid(row=0, column=8, rowspan=10, columnspan=5) #Topic implementation self.idea_var = IntVar() self.topic_var = IntVar() idea = Checkbutton(buttongrid, text="Idea", variable=self.idea_var, onvalue = 1, offvalue = 0, indicatoron=0, height=2, width=16) idea.grid(row=11, column=0, columnspan=2) self.buttonmap['\r'] = idea def delTopic(event): line = self.topic_display.index(CURRENT).split(".")[0] self.topic_display.config(state=NORMAL) self.topic_display.delete(""+line+".0", ""+str(int(line)+1)+".0") self.topic_display.config(state=DISABLED) topic = Checkbutton(buttongrid, text="Topic", variable=self.topic_var, onvalue = 1, offvalue = 0, indicatoron=0, width=16, height=2) topic.grid(row=11, column=2, columnspan=2) topic_indicator = Label(buttongrid, width=33, height=2, bg="gray") topic_indicator.grid(row=10, column=0, columnspan=4) self.topic_change_var = 0 self.topic_display = Text(buttongrid, wrap=NONE, state=DISABLED) self.topic_display.grid(row=15, column=0, columnspan=4, sticky=N+S+W) self.topic_display.configure(height=10, width=36) self.topic_display.bind("<Button-3>", delTopic) scrollbar2 = Scrollbar(buttongrid, orient=VERTICAL, command=self.topic_display.yview) scrollbar2.grid(row=15,column=3, sticky=N+S+E) self.display['yscrollcommand'] = scrollbar2.set self.topics = [] def change_color(): self.topic_change_var = self.topic_change_var %4 col_map = {0 : "red", 1 : "blue", 2 : "green", 3 : "yellow"} if self.topic_var.get(): #Get timestamp self.timest = pos_int = self.player.query_position(gst.FORMAT_TIME, None)[0] topic_indicator.configure(bg=col_map[self.topic_change_var]) self.topic_change_var += 1 else: self.topic_display.config(state=NORMAL) topic_col = col_map[(self.topic_change_var-1)%4] self.topic_display.tag_config(str(self.topic_change_var), background=topic_col) insert = bisect_right(self.topics, self.timest/1000000000.0) self.topics.insert(insert, self.timest/1000000000.0) self.topic_display.insert("%d.0" % (insert+1), str(self.timest/1000000000.0)+"-"+str(self.player.query_position(gst.FORMAT_TIME, None)[0]/1000000000.0)+"\n", (str(self.timest/1000000000.0), str(self.topic_change_var))) self.topic_display.see("%d.0" % (insert+1)) topic_indicator.configure(bg="gray") self.topic_display.config(state=DISABLED) topic.configure(command=change_color) #topic.bind("<Shift_L>", change_color()) #def update_topInd(): #TODO: change colors on playback # while True: # if self.play["text"] == "Pause": # try: # timestamp = self.player.query_position(gst.FORMAT_TIME, None)[0]/1000000000.0 # insert = bisect_right(self.topics, timestamp) # if insert > 0 and float(self.topic_display.get("%d.0" % (insert), "%d.end" % (insert)).split('-')[1]) >= timestamp: # #topic_indicator.configure(bg= #get color in self.topic_display at line insert # pass # time.sleep(.1) # except: # continue # else: # time.sleep(.2) #self.tt = threading.Thread(target=update_topInd) #self.tt.daemon = True #self.tt.start() #Done with topic h = '44' w = '40' c = "top" codemap = { 'a':'yesandquestion', 's':'interrupt', 'd':'block', 'f':'overcoming', 'q':'move', 'w':'question', 'e':'support', 'r':'yesand', 'z':'deflection', 'x':'humour', 'c':'block-support', 'v':'hesitation', } firstrow = 12 b1 = Button(buttongrid, image=self.imagemap[codemap['a']], command=lambda: self.update_symbols(codemap['a']), background="white", height=h, width=w, compound=c, text="A") b1.image = self.imagemap[codemap['a']] b1.grid(row=firstrow, column=0) self.buttonmap['a'] = b1 b2 = Button(buttongrid, image=self.imagemap[codemap['s']], command=lambda: self.update_symbols(codemap['s']), background="white", height=h, width=w, compound=c, text="S") b2.image = self.imagemap[codemap['s']] b2.grid(row=firstrow, column=1) self.buttonmap['s'] = b2 b3 = Button(buttongrid, image=self.imagemap[codemap['d']], command=lambda: self.update_symbols(codemap['d']), background="white", height=h, width=w, compound=c, text="D") b3.image = self.imagemap[codemap['d']] b3.grid(row=firstrow, column=2) self.buttonmap['d'] = b3 b4 = Button(buttongrid, image=self.imagemap[codemap['f']], command=lambda: self.update_symbols(codemap['f']), background="white", height=h, width=w, compound=c, text="F") b4.image = self.imagemap[codemap['f']] b4.grid(row=firstrow, column=3) self.buttonmap['f'] = b4 b5 = Button(buttongrid, image=self.imagemap[codemap['q']], command=lambda: self.update_symbols(codemap['q']), background="white", height=h, width=w, compound=c, text="Q") b5.image = self.imagemap[codemap['q']] b5.grid(row=firstrow+1, column=0) self.buttonmap['q'] = b5 b6 = Button(buttongrid, image=self.imagemap[codemap['w']], command=lambda: self.update_symbols(codemap['w']), background="white", height=h, width=w, compound=c, text="W") b6.image = self.imagemap[codemap['w']] b6.grid(row=firstrow+1, column=1) self.buttonmap['w'] = b6 b7 = Button(buttongrid, image=self.imagemap[codemap['e']], command=lambda: self.update_symbols(codemap['e']), background="white", height=h, width=w, compound=c, text="E") b7.image = self.imagemap[codemap['e']] b7.grid(row=firstrow+1, column=2) self.buttonmap['e'] = b7 b8 = Button(buttongrid, image=self.imagemap[codemap['r']], command=lambda: self.update_symbols(codemap['r']), background="white", height=h, width=w, compound=c, text="R", font=100) b8.image = self.imagemap[codemap['r']] b8.grid(row=firstrow+1, column=3) self.buttonmap['r'] = b8 b9 = Button(buttongrid, image=self.imagemap[codemap['z']], command=lambda: self.update_symbols(codemap['z']), background="white", height=h, width=w, compound=c, text="Z") b9.image = self.imagemap[codemap['z']] b9.grid(row=firstrow+2, column=0) self.buttonmap['z'] = b9 b10 = Button(buttongrid, image=self.imagemap[codemap['x']], command=lambda: self.update_symbols(codemap['x']), background="white", height=h, width=w, compound=c, text="X", font=100) b10.image = self.imagemap[codemap['x']] b10.grid(row=firstrow+2, column=1) self.buttonmap['x'] = b10 b11 = Button(buttongrid, image=self.imagemap[codemap['c']], command=lambda: self.update_symbols(codemap['c']), background="white", height=h, width=w, compound=c, text="C", font=100) b11.image = self.imagemap[codemap['c']] b11.grid(row=firstrow+2, column=2) self.buttonmap['c'] = b11 b12 = Button(buttongrid, image=self.imagemap[codemap['v']], command=lambda: self.update_symbols(codemap['v']), background="white", height=h, width=w, compound=c, text="V", font=100) b12.image = self.imagemap[codemap['v']] b12.grid(row=firstrow+2, column=3) self.buttonmap['v'] = b12
class Mainframe(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.lock = threading.Lock() self.parent = parent self.project = None self.speakers = None self.imgDir = "symbols/" self.alpha = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'] self.colors = [ "blue", "green", "yellow", "orange", "pink", "purple", "red", "brown", "black" ] self.imagemap = {} h = 30 w = 50 self.imagemap['deflection'] = PhotoImage(file=self.imgDir + "deflection.gif", height=h, width=w) self.imagemap['question'] = PhotoImage(file=self.imgDir + "question.gif", height=h, width=w) self.imagemap['hesitation'] = PhotoImage(file=self.imgDir + "hesitation.gif", height=h, width=w) self.imagemap['interrupt'] = PhotoImage(file=self.imgDir + "interrupt.gif", height=h, width=w) self.imagemap['overcoming'] = PhotoImage(file=self.imgDir + "overcoming.gif", height=h, width=w) self.imagemap['support'] = PhotoImage(file=self.imgDir + "support.gif", height=h, width=w) self.imagemap['yesand'] = PhotoImage(file=self.imgDir + "yesand.gif", height=h, width=w) self.imagemap['humour'] = PhotoImage(file=self.imgDir + "humour.gif", height=h, width=w) self.imagemap['move'] = PhotoImage(file=self.imgDir + "move.gif", height=h, width=w) self.imagemap['block'] = PhotoImage(file=self.imgDir + "block.gif", height=h, width=w) self.imagemap['yesandquestion'] = PhotoImage(file=self.imgDir + "yesandquestion.gif", height=h, width=w) self.imagemap['blank'] = PhotoImage(file=self.imgDir + "blank.gif", height=h, width=w) self.imagemap['block-support'] = PhotoImage(file=self.imgDir + "block-support.gif", height=h, width=w) self.buttonmap = {} self.player = gst.element_factory_make('playbin2', 'player') self.play = Button(self, text="Play", width=45) self.play.grid(row=5, column=0) self.entry = Entry(self, width=50) self.entry.grid(row=5, column=1) self.back = Button(self, text="Playback", width=45) self.back.grid(row=5, column=2) self.imgID = 0 self.imgMap = {} self.codeMode = True #self.progress self.var = DoubleVar() self.prev = 0 self.flag_video_start = 0 self.pause_changed = 0 self.duration = 0 self.initUI() def getTime(self): pass def on_sync_message(self, bus, message, window_id): print "sync message" if not message.structure is None: if message.structure.get_name() == 'prepare-xwindow-id': image_sink = message.src image_sink.set_property('force-aspect-ratio', True) self.lock.acquire() #image_sink.set_xwindow_id(window_id) self.lock.release() def on_message(self, bus, message, window_id): t = message.type if t == gst.MESSAGE_EOS: self.player.set_state(gst.STATE_NULL) self.play["Text"] = "Play" elif t == gst.MESSAGE_ERROR: self.player.set_state(gst.STATE_NULL) err, debug = message.parse_error() print "Error: %s" % err, debug self.play["Text"] = "Play" #Video embedding part-------------------------------------------------- def sel_play(self): #print self.prev val2 = self.var.get() #print val2 val = val2 + 1 if val2 == 0 and self.flag_video_start == 0: print "starting" self.var.set(0) self.flag_video_start = 1 else: self.var.set(val) #print self.prev - self.var.get() if self.pause_changed: print "paused flag" self.player.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH, (self.var.get() - 1) * (10**9)) self.prev = self.var.get() - 1 self.var.set(self.prev) self.pause_changed = 0 if (self.prev - self.var.get()) != -1: #print self.var.get()-val self.player.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH, self.var.get() * (10**9)) self.prev = self.var.get() else: self.prev = self.var.get() self.job = self.after(1000, self.sel_play) def play_video(self): if self.play["text"] == "Play": self.player.set_state(gst.STATE_PLAYING) self.play["text"] = "Pause" self.sel_play() else: self.pause_changed = 1 self.player.set_state(gst.STATE_PAUSED) self.play["text"] = "Play" self.after_cancel(self.job) while self.duration == 0: time.sleep(.1) try: self.duration = self.player.query_duration( gst.FORMAT_TIME, None)[0] except: pass #print self.duration/1000000000.0 self.slider.configure(from_=0, to=self.duration / 1000000000) def play_back(self): pos_int = self.player.query_position(gst.FORMAT_TIME, None)[0] text = self.entry.get() diff = 0 if text == "": diff = pos_int - (3 * (10**9)) else: val = float(self.entry.get()) diff = pos_int - (val * (10**9)) #print pos_int #print diff/(10**9) if diff > 0: self.player.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH, diff) print self.var.get() - (diff / 10**9) self.var.set(diff / 10**9) else: self.player.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH, 0) self.var.set(0) if self.play["text"] == "Play": print "here" timestamp = self.player.query_position(gst.FORMAT_TIME, None)[0] print timestamp self.display.mark_set( "mine2", "1.%d" % floor(timestamp / 1000000000.0 / .2)) self.display.see("1.%d" % (floor(timestamp / 1000000000.0 / .2) + 8)) self.display.see("mine2") def play_forward(self): pos_int = self.player.query_position(gst.FORMAT_TIME, None)[0] text = self.entry.get() diff = 0 if text == "": diff = pos_int + (3 * (10**9)) else: val = float(self.entry.get()) diff = pos_int + (val * (10**9)) #print pos_int #print diff/(10**9) if diff > 0: self.player.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH, diff) print self.var.get() - (diff / 10**9) self.var.set(diff / 10**9) else: self.player.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH, 0) self.var.set(0) def startVid(self): gobject.threads_init() video = Frame(self, background='black') video.grid(row=0, column=0, columnspan=8, rowspan=4, padx=2, sticky=E + W + S + N) window_id = video.winfo_id() self.buf = gst.Buffer() self.bin = gst.Bin("my-bin") timeoverlay = gst.element_factory_make("timeoverlay", "overlay") self.bin.add(timeoverlay) pad = timeoverlay.get_pad("video_sink") ghostpad = gst.GhostPad("sink", pad) self.bin.add_pad(ghostpad) videosink = gst.element_factory_make("ximagesink") self.bin.add(videosink) gst.element_link_many(timeoverlay, videosink) self.player.set_property('video-sink', self.bin) self.player.set_property( 'uri', 'file://%s' % (os.path.abspath(self.project.videoPath))) bus = self.player.get_bus() bus.add_signal_watch() bus.enable_sync_message_emission() bus.connect("message", self.on_message, window_id) bus.connect('sync-message::element', self.on_sync_message, window_id) self.play.configure(command=lambda: self.play_video()) self.back.configure(command=self.play_back) #self.back = Button(self, text="Playback", command=play_back, width=50) #self.back.grid(row=5, column=2) #Video embedding done--------------------------------------------------- def startSpeakers(self): #Speakers s = [] self.checkvars = [] for i in range(self.NUM_SPEAKERS): s.append(self.alpha[i]) self.checkvars.append(IntVar()) if self.speakers != None: for pair in self.speakers: pair[0].grid_forget() i = 0 self.speakers = [] sframe = Frame(height=2) for text in s: b = Checkbutton(self.buttongrid, text=text, variable=self.checkvars[i], onvalue=1, offvalue=0) self.speakers.append((b, self.colors[i])) #b.grid(row=i//4, column=(i%4)) b.grid(row=i, column=0) def callback(sv, i): self.project.speakerID[i + 1] = sv.get() sv = StringVar() sv.trace("w", lambda name, index, mode, sv=sv, i=i: callback(sv, i)) c = Entry(self.buttongrid, textvariable=sv) #TODO HERE c.insert(0, self.project.speakerID[i + 1]) c.grid(row=i, column=1, columnspan=3) i += 1 #Done with speakers def getProject(self, inp): self.project = inp self.NUM_SPEAKERS = self.project.numSpeaker self.parent.title("Project " + self.project.projectName) self.startVid() self.startSpeakers() self.num_inserted = [] self.var.set(0) def deleteSymbol(self, event): print("delete") try: img = str(event.widget) img = img[img.rfind(".") + 1:] self.display.config(state=NORMAL) self.display.delete(CURRENT) self.display.config(state=DISABLED) self.display.image_create(CURRENT, image=self.imagemap['blank']) self.project.seq.delete(None, self.imgMap[int(img)]) del self.imgMap[int(img)] except: print "error delete" def update_symbols(self, text, timestamp=None, inspeakers=None, inidea=None): #Stores timestamp if timestamp == None: timestamp = self.player.query_position(gst.FORMAT_TIME, None)[0] self.display.mark_set("mine", "1.%d" % floor(timestamp / 1000000000.0 / .2)) if len(str(self.display.get("mine"))) == 0: self.display.config(state=NORMAL) self.display.delete("mine") self.display.config(state=DISABLED) #Stores current speakers current_speakers = [] store_speakers = [] if inspeakers == None: for i in range(len(self.speakers)): if self.checkvars[i].get() == 1: current_speakers.append((self.alpha[i], self.colors[i])) store_speakers.append(i + 1) else: store_speakers = inspeakers current_speakers = [(self.alpha[i - 1], self.colors[i - 1]) for i in inspeakers] tempstr = "" for sp in current_speakers: tempstr += sp[0] if inidea or (inidea == None and self.idea_var.get() == 1): tmplbl = Label(self.display, name="%u" % self.imgID, image=self.imagemap[text], text=tempstr, compound="bottom", background="yellow") else: tmplbl = Label(self.display, name="%u" % self.imgID, image=self.imagemap[text], text=tempstr, compound="bottom", background="white") tmpwin = self.display.window_create('mine', window=tmplbl) tmplbl.bind("<Button-3>", self.deleteSymbol) #right click tmplbl.bind("<Button-1>", lambda ev: EditSymDialog(self, ev)) #left click self.imgID += 1 idea = False if inidea == True or (inidea == None and self.idea_var.get() == 1): idea = True if self.project != None: curr = Code(timestamp / 1000000000.0, text, store_speakers, idea) self.project.seq.insert(curr) self.imgMap[self.imgID - 1] = timestamp / 1000000000.0 def update_display(self): self.display.image_create('1.0', image=self.imagemap['blank']) while True: if self.play["text"] == "Pause": try: timestamp = self.player.query_position( gst.FORMAT_TIME, None)[0] if timestamp >= self.duration: self.play_video() self.display.mark_set( "mine2", "1.%d" % floor(timestamp / 1000000000.0 / .2)) self.display.see( "1.%d" % (floor(timestamp / 1000000000.0 / .2) + 8)) self.display.see("mine2") self.display.config(state=NORMAL) for i in range( int(floor(timestamp / 1000000000.0 / .2)) + 10 - int(self.display.index('1.end').split('.')[1])): self.display.image_create('1.end', image=self.imagemap['blank']) self.display.config(state=DISABLED) time.sleep(.2) except: continue else: time.sleep(.2) def initUI(self): self.parent.title("Main") self.style = Style() self.style.theme_use("default") self.pack(fill=BOTH, expand=1) self.columnconfigure(1, weight=1) self.columnconfigure(15, pad=7) self.rowconfigure(3, weight=1) self.rowconfigure(10, pad=7) def hello(): print "hello!" #Menubar-------------------------------------------------------------- menubar = Tkinter.Menu(self) filemenu = Tkinter.Menu(menubar, tearoff=0) filemenu.add_command(label="New", command=lambda: NewProjectDialog(self)) filemenu.add_command(label="Open", command=lambda: OldProjectDialog(self)) filemenu.add_command(label="Save", command=lambda: self.project.saveProject()) filemenu.add_command(label="Save As", command=lambda: SaveAsDialog(self, self.project)) filemenu.add_command(label="Save and Export Image", command=lambda: self.project.saveAndExportImage()) filemenu.add_separator() filemenu.add_command(label="Exit", command=self.parent.quit) menubar.add_cascade(label="File", menu=filemenu) #Create analysis window here #def do_popup_analysis(): # new_frame = Tkinter.Tk() #menubar.add_command(label="Analysis", command=do_popup_analysis) #def do_popup_plot(): # new_frame = Tkinter.Tk() #menubar.add_command(label="Plot", command=do_popup_plot) menubar.add_command(label="Help", command=lambda: helpDialog(self)) self.parent.config(menu=menubar) #Menubar done---------------------------------------------------------- #Choose Project part--------------------------------------------------- self.box = Frame(self) self.box.grid(row=0, column=0, columnspan=8, rowspan=4, padx=2) btn = Button(self.box, text="New Project", command=lambda: NewProjectDialog(self), default=ACTIVE) btn.grid(row=0, column=0, columnspan=4, rowspan=4, padx=2) btn2 = Button(self.box, text="Open Project", command=lambda: OldProjectDialog(self), default=ACTIVE) btn2.grid(row=0, column=4, columnspan=4, rowspan=4, padx=2) #Project done---------------------------------------------------------- #Display of symbols self.display = Text(self, height=4, wrap=NONE) self.display.grid(row=7, column=0, rowspan=3, columnspan=3, sticky=E + W) #scrollbar = Scrollbar(self, orient=HORIZONTAL, command=self.display.xview) #remove seekbar #scrollbar.grid(row=10,column=0, columnspan=3, sticky=N+S+E+W) #self.display['xscrollcommand'] = scrollbar.set #Adding time dependent display self.t = threading.Thread(target=self.update_display) self.t.daemon = True self.t.start() #Display done #Slider self.slider = Scale(self, orient=HORIZONTAL, variable=self.var) self.slider.grid(row=6, column=0, columnspan=3, sticky=N + S + E + W) #Done with slider #Buttons for symbols---------------------------------------------------- buttongrid = Frame(self) self.buttongrid = buttongrid buttongrid.grid(row=0, column=8, rowspan=10, columnspan=5) #Topic implementation self.idea_var = IntVar() self.topic_var = IntVar() idea = Checkbutton(buttongrid, text="Idea", variable=self.idea_var, onvalue=1, offvalue=0, indicatoron=0, height=2, width=16) idea.grid(row=11, column=0, columnspan=2) self.buttonmap['\r'] = idea def delTopic(event): line = self.topic_display.index(CURRENT).split(".")[0] self.topic_display.config(state=NORMAL) self.topic_display.delete("" + line + ".0", "" + str(int(line) + 1) + ".0") self.topic_display.config(state=DISABLED) topic = Checkbutton(buttongrid, text="Topic", variable=self.topic_var, onvalue=1, offvalue=0, indicatoron=0, width=16, height=2) topic.grid(row=11, column=2, columnspan=2) topic_indicator = Label(buttongrid, width=33, height=2, bg="gray") topic_indicator.grid(row=10, column=0, columnspan=4) self.topic_change_var = 0 self.topic_display = Text(buttongrid, wrap=NONE, state=DISABLED) self.topic_display.grid(row=15, column=0, columnspan=4, sticky=N + S + W) self.topic_display.configure(height=10, width=36) self.topic_display.bind("<Button-3>", delTopic) scrollbar2 = Scrollbar(buttongrid, orient=VERTICAL, command=self.topic_display.yview) scrollbar2.grid(row=15, column=3, sticky=N + S + E) self.display['yscrollcommand'] = scrollbar2.set self.topics = [] def change_color(): self.topic_change_var = self.topic_change_var % 4 col_map = {0: "red", 1: "blue", 2: "green", 3: "yellow"} if self.topic_var.get(): #Get timestamp self.timest = pos_int = self.player.query_position( gst.FORMAT_TIME, None)[0] topic_indicator.configure(bg=col_map[self.topic_change_var]) self.topic_change_var += 1 else: self.topic_display.config(state=NORMAL) topic_col = col_map[(self.topic_change_var - 1) % 4] self.topic_display.tag_config(str(self.topic_change_var), background=topic_col) insert = bisect_right(self.topics, self.timest / 1000000000.0) self.topics.insert(insert, self.timest / 1000000000.0) self.topic_display.insert( "%d.0" % (insert + 1), str(self.timest / 1000000000.0) + "-" + str( self.player.query_position(gst.FORMAT_TIME, None)[0] / 1000000000.0) + "\n", (str(self.timest / 1000000000.0), str( self.topic_change_var))) self.topic_display.see("%d.0" % (insert + 1)) topic_indicator.configure(bg="gray") self.topic_display.config(state=DISABLED) topic.configure(command=change_color) #topic.bind("<Shift_L>", change_color()) #def update_topInd(): #TODO: change colors on playback # while True: # if self.play["text"] == "Pause": # try: # timestamp = self.player.query_position(gst.FORMAT_TIME, None)[0]/1000000000.0 # insert = bisect_right(self.topics, timestamp) # if insert > 0 and float(self.topic_display.get("%d.0" % (insert), "%d.end" % (insert)).split('-')[1]) >= timestamp: # #topic_indicator.configure(bg= #get color in self.topic_display at line insert # pass # time.sleep(.1) # except: # continue # else: # time.sleep(.2) #self.tt = threading.Thread(target=update_topInd) #self.tt.daemon = True #self.tt.start() #Done with topic h = '44' w = '40' c = "top" codemap = { 'a': 'yesandquestion', 's': 'interrupt', 'd': 'block', 'f': 'overcoming', 'q': 'move', 'w': 'question', 'e': 'support', 'r': 'yesand', 'z': 'deflection', 'x': 'humour', 'c': 'block-support', 'v': 'hesitation', } firstrow = 12 b1 = Button(buttongrid, image=self.imagemap[codemap['a']], command=lambda: self.update_symbols(codemap['a']), background="white", height=h, width=w, compound=c, text="A") b1.image = self.imagemap[codemap['a']] b1.grid(row=firstrow, column=0) self.buttonmap['a'] = b1 b2 = Button(buttongrid, image=self.imagemap[codemap['s']], command=lambda: self.update_symbols(codemap['s']), background="white", height=h, width=w, compound=c, text="S") b2.image = self.imagemap[codemap['s']] b2.grid(row=firstrow, column=1) self.buttonmap['s'] = b2 b3 = Button(buttongrid, image=self.imagemap[codemap['d']], command=lambda: self.update_symbols(codemap['d']), background="white", height=h, width=w, compound=c, text="D") b3.image = self.imagemap[codemap['d']] b3.grid(row=firstrow, column=2) self.buttonmap['d'] = b3 b4 = Button(buttongrid, image=self.imagemap[codemap['f']], command=lambda: self.update_symbols(codemap['f']), background="white", height=h, width=w, compound=c, text="F") b4.image = self.imagemap[codemap['f']] b4.grid(row=firstrow, column=3) self.buttonmap['f'] = b4 b5 = Button(buttongrid, image=self.imagemap[codemap['q']], command=lambda: self.update_symbols(codemap['q']), background="white", height=h, width=w, compound=c, text="Q") b5.image = self.imagemap[codemap['q']] b5.grid(row=firstrow + 1, column=0) self.buttonmap['q'] = b5 b6 = Button(buttongrid, image=self.imagemap[codemap['w']], command=lambda: self.update_symbols(codemap['w']), background="white", height=h, width=w, compound=c, text="W") b6.image = self.imagemap[codemap['w']] b6.grid(row=firstrow + 1, column=1) self.buttonmap['w'] = b6 b7 = Button(buttongrid, image=self.imagemap[codemap['e']], command=lambda: self.update_symbols(codemap['e']), background="white", height=h, width=w, compound=c, text="E") b7.image = self.imagemap[codemap['e']] b7.grid(row=firstrow + 1, column=2) self.buttonmap['e'] = b7 b8 = Button(buttongrid, image=self.imagemap[codemap['r']], command=lambda: self.update_symbols(codemap['r']), background="white", height=h, width=w, compound=c, text="R", font=100) b8.image = self.imagemap[codemap['r']] b8.grid(row=firstrow + 1, column=3) self.buttonmap['r'] = b8 b9 = Button(buttongrid, image=self.imagemap[codemap['z']], command=lambda: self.update_symbols(codemap['z']), background="white", height=h, width=w, compound=c, text="Z") b9.image = self.imagemap[codemap['z']] b9.grid(row=firstrow + 2, column=0) self.buttonmap['z'] = b9 b10 = Button(buttongrid, image=self.imagemap[codemap['x']], command=lambda: self.update_symbols(codemap['x']), background="white", height=h, width=w, compound=c, text="X", font=100) b10.image = self.imagemap[codemap['x']] b10.grid(row=firstrow + 2, column=1) self.buttonmap['x'] = b10 b11 = Button(buttongrid, image=self.imagemap[codemap['c']], command=lambda: self.update_symbols(codemap['c']), background="white", height=h, width=w, compound=c, text="C", font=100) b11.image = self.imagemap[codemap['c']] b11.grid(row=firstrow + 2, column=2) self.buttonmap['c'] = b11 b12 = Button(buttongrid, image=self.imagemap[codemap['v']], command=lambda: self.update_symbols(codemap['v']), background="white", height=h, width=w, compound=c, text="V", font=100) b12.image = self.imagemap[codemap['v']] b12.grid(row=firstrow + 2, column=3) self.buttonmap['v'] = b12
def initUI(self): self.style = Style().configure("TFrame", background=self.sys.win_cfg.cBackground) self.pack(fill=BOTH, expand=1) titleLabel = Label(self, text=self.sys.win_cfg.sStage, background=self.sys.win_cfg.cBackground, width=12, height=1) titleLabel.place(x=5, y=5) # setup labels self.StageConfigured = Label(self, width=15, background=self.sys.win_cfg.cUnknown, text="Not Configured") self.StageConfigured.place(x=100, y=5) yoffset = 20 #right column self.xActualLabel = Label( self, text="", background=self.sys.win_cfg.cTextBackgroundLocked, width=10, height=1) self.xActualLabel.place(x=200, y=30 + yoffset) self.yActualLabel = Label( self, text="", background=self.sys.win_cfg.cTextBackgroundLocked, width=10, height=1) self.yActualLabel.place(x=200, y=60 + yoffset) self.zActualLabel = Label( self, text="", background=self.sys.win_cfg.cTextBackgroundLocked, width=10, height=1) self.zActualLabel.place(x=200, y=90 + yoffset) self.xMovingLabel = Label(self, width=3, background=self.sys.win_cfg.cStageMoving, text="X") self.xMovingLabel.place(x=270, y=30 + yoffset) self.yMovingLabel = Label(self, width=3, background=self.sys.win_cfg.cStageMoving, text="Y") self.yMovingLabel.place(x=270, y=60 + yoffset) self.zMovingLabel = Label(self, width=3, background=self.sys.win_cfg.cStageMoving, text="Z") self.zMovingLabel.place(x=270, y=90 + yoffset) ''' self.chkAutoUpdate = IntVar() self.chkAutoUpdate.set(1) self.autoUpdateCheckbutton = Checkbutton(self, text="Auto Update", backgroun=self.sys.win_cfg.cBackground, variable=self.chkAutoUpdate) self.autoUpdateCheckbutton.place(x=200, y=120+yoffset) ''' self.testButton = Button(self, text="test", command=self.testNight, width=10) self.testButton.place(x=200, y=130 + yoffset) locationButton = Button(self, text="Location", command=self.update_actual_location, width=10) locationButton.place(x=200, y=160 + yoffset) lockButton = Button(self, text="Lock", command=self.lock, width=10) lockButton.place(x=200, y=190 + yoffset) unlockButton = Button(self, text="Unlock", command=self.unlock, width=10) unlockButton.place(x=200, y=220 + yoffset) style = Style() style.configure("Red.TButton", foreground=self.sys.win_cfg.cBad, background=self.sys.win_cfg.cBad) abortButton = Button(self, text="\nAbort!\n", command=self.abort_stage, width=10) abortButton.configure(style="Red.TButton") abortButton.place(x=200, y=280 + yoffset) # setup buttons xLabel = Label(self, text="X (mm): ", background=self.sys.win_cfg.cBackground, width=6, height=1) xLabel.place(x=10, y=30 + yoffset) self.xEntry = Entry(self, width=12, background=self.sys.win_cfg.cTextBackground) self.xEntry.place(x=85, y=30 + yoffset) yLabel = Label(self, text="Y (mm): ", background=self.sys.win_cfg.cBackground, width=6, height=1) yLabel.place(x=10, y=60 + yoffset) self.yEntry = Entry(self, width=12, background=self.sys.win_cfg.cTextBackground) self.yEntry.place(x=85, y=60 + yoffset) zLabel = Label(self, text="Z (mm): ", background=self.sys.win_cfg.cBackground, width=6, height=1) zLabel.place(x=10, y=90 + yoffset) self.zEntry = Entry(self, width=12, background=self.sys.win_cfg.cTextBackground) self.zEntry.place(x=85, y=90 + yoffset) # buttons moveStagesButton = Button(self, text="Move Stages", command=self.move_stages, width=17) moveStagesButton.place(x=30, y=120 + yoffset) homeStagesButton = Button(self, text="Home Stages ", command=self.home_stages, width=17) homeStagesButton.place(x=30, y=260 + yoffset) homeStageButton = Button(self, text="Scan Array ", command=self.scan_array, width=10) homeStageButton.place(x=30, y=295 + yoffset) self.frameCount = Entry(self, width=5, background=self.sys.win_cfg.cTextBackground) self.frameCount.place(x=110, y=298 + yoffset) # buttons JogXPlusButton = Button(self, text="X +", command=self.jog_x_up, width=5) JogXPlusButton.place(x=10, y=160 + yoffset) self.JogX = Entry(self, width=8, background=self.sys.win_cfg.cTextBackground) self.JogX.place(x=65, y=163 + yoffset) JogXMinuxButton = Button(self, text="X -", command=self.jog_x_down, width=5) JogXMinuxButton.place(x=130, y=160 + yoffset) JogYPlusButton = Button(self, text="Y +", command=self.jog_y_up, width=5) JogYPlusButton.place(x=10, y=190 + yoffset) self.JogY = Entry(self, width=8, background=self.sys.win_cfg.cTextBackground) self.JogY.place(x=65, y=193 + yoffset) JogYMinuxButton = Button(self, text="Y -", command=self.jog_y_down, width=5) JogYMinuxButton.place(x=130, y=190 + yoffset) JogZPlusButton = Button(self, text="Z +", command=self.jog_z_up, width=5) JogZPlusButton.place(x=10, y=220 + yoffset) self.JogZ = Entry(self, width=8, background=self.sys.win_cfg.cTextBackground) self.JogZ.place(x=65, y=223 + yoffset) JogZMinuxButton = Button(self, text="Z -", command=self.jog_z_down, width=5) JogZMinuxButton.place(x=130, y=220 + yoffset) # close buttons closeButton = Button(self, text="Close", command=self.close_window, width=17) closeButton.place(x=30, y=350) # on absolute entries only, enter key moves to positions self.xEntry.bind("<KeyRelease-Return>", self.move_stages_return) self.yEntry.bind("<KeyRelease-Return>", self.move_stages_return) self.zEntry.bind("<KeyRelease-Return>", self.move_stages_return) # on absolute entries only, enter key moves to positions self.JogX.bind("<KeyRelease-Return>", self.jog_x_return) self.JogY.bind("<KeyRelease-Return>", self.jog_y_return) self.JogZ.bind("<KeyRelease-Return>", self.jog_z_return) self.JogX.bind("<KeyRelease-Shift_L>", self.jog_x_inverse) self.JogX.bind("<KeyRelease-Shift_R>", self.jog_x_inverse) self.JogY.bind("<KeyRelease-Shift_L>", self.jog_y_inverse) self.JogY.bind("<KeyRelease-Shift_R>", self.jog_y_inverse) self.JogZ.bind("<KeyRelease-Shift_L>", self.jog_z_inverse) self.JogZ.bind("<KeyRelease-Shift_R>", self.jog_z_inverse)
class Kmers(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.customFont = Font(family="consolas", size=10) self.seq = "" self.kmer = 2 self.parent = parent self.initUI() def initUI(self): self.parent.title("Kmers") self.pack(fill=BOTH, expand=False) Label(self, text="Fichier de la Sequence:").grid(sticky=W + E + S + N, row=0, column=0, padx=5, pady=5) Label(self, text="Nombre des Kmers:").grid(sticky=W + E + S + N, row=1, column=0, padx=5, pady=5) self.btn = Button(self, text="Open File", command=self.onOpen) self.btn.grid(sticky=E, row=0, column=0, padx=5, pady=5) self.e1 = tkinter.Entry(self, state="disabled") self.e1.configure(width=12) self.e1.grid(sticky=E, row=1, column=0, padx=5, pady=5) self.btn2 = Button(self, text="Calcule", state="disabled", command=self.onCalcule) self.btn2.grid(sticky=W + E + S + N, row=1, column=1, padx=5, pady=5) lbl = Label(self, text="Infos") #lbl.grid(sticky=W, row=2, column=0, padx=5) self.v = tkinter.IntVar() self.v = 2 r1 = tkinter.Radiobutton(self, text="Euclidenne", variable=self.v, value=1) r2 = tkinter.Radiobutton(self, text="Correlation", variable=self.v, value=2) r1.grid(sticky=W, row=2, column=0, padx=5) r2.grid(sticky=W, row=2, column=1, padx=5) lbl2 = Label(self, text="List Kmers") lbl2.grid(sticky=W, row=0, column=2, padx=5) self.area = ScrolledText(self, wrap=tkinter.WORD) self.area.configure(state="disabled", font=self.customFont, height=20, width=50) self.area.grid(padx=5, pady=2, row=3, columnspan=2, rowspan=30) self.listbox = tkinter.Listbox(self) self.listbox.config(height=25, width=58) self.listbox.grid(pady=5, row=1, column=2, rowspan=30) lbl = Label(self, text="1. Proportion genome") lbl.grid(sticky=W + E + S + N, row=0, column=4, padx=5) lbl = Label(self, text="Pas:"******"Fenetre:") lbl.grid(sticky=W + E + S + N, row=2, column=4, padx=5) self.e2 = tkinter.Entry(self, state="disabled") self.e2.configure(width=12) self.e2.grid(sticky=E, row=1, column=4, padx=5, pady=5) self.e3 = tkinter.Entry(self, state="disabled") self.e3.configure(width=12) self.e3.grid(sticky=E, row=2, column=4, padx=5, pady=5) self.btn3 = Button(self, text="Calcule", state="disabled", command=self.onCalcule2) self.btn3.grid(sticky=W + E + S + N, row=2, column=5, padx=5, pady=5) lbl = Label(self, text="Calcule subparties") lbl.grid(sticky=W + E + S + N, row=3, column=4, padx=5) lbl = Label(self, text="Pas:"******"Fenetre:") lbl.grid(sticky=W + E + S + N, row=5, column=4, padx=5) self.e4 = tkinter.Entry(self, state="disabled") self.e4.configure(width=12) self.e4.grid(sticky=E, row=4, column=4, padx=5, pady=5) self.e5 = tkinter.Entry(self, state="disabled") self.e5.configure(width=12) self.e5.grid(sticky=E, row=5, column=4, padx=5, pady=5) self.btn4 = Button(self, text="Calcule", state="disabled", command=self.onCalcule3) self.btn4.grid(sticky=W + E + S + N, row=5, column=5, padx=5, pady=5) self.imp = tkinter.BooleanVar() self.cb = tkinter.Checkbutton(self, text="Imprimer Partie Genome diferente", state="disabled", variable=self.imp, command=self.onClick) self.cb.grid(sticky=W + E + S + N, row=6, column=4, columnspan=2, padx=5, pady=5) self.btn5 = Button(self, text="Creer Phylo", state="disabled", command=self.onCalcule4) self.btn5.grid(sticky=W + E + S + N, row=7, column=4, columnspan=2, padx=5, pady=5) self.btn6 = Button(self, text="Creer Reseau Relations", state="disabled", command=self.onCalcule5) self.btn6.grid(sticky=W + E + S + N, row=8, column=4, columnspan=2, padx=5, pady=5) lbl = Label(self, text="2. Choisir genome / genome Predicte") lbl.grid(sticky=W + E + S + N, row=0, column=7, columnspan=2, padx=5) lbl = Label(self, text="Taille morceau") lbl.grid(sticky=W + E + S + N, row=1, column=7, padx=5) self.e7 = tkinter.Entry(self, state="disabled") self.e7.configure(width=12) self.e7.grid(sticky=E, row=1, column=8, padx=5, pady=5) self.btn7 = Button(self, text="Cherching morceau", state="disabled", command=self.onCalcule6) self.btn7.grid(sticky=W + E + S + N, row=2, column=7, columnspan=2, padx=5, pady=5) lbl = Label(self, text="3. Experience aleatoire un genome") lbl.grid(sticky=W + E + S + N, row=4, column=7, columnspan=2, padx=5) lbl = Label(self, text="Taille morceau") lbl.grid(sticky=W + E + S + N, row=5, column=7, padx=5) self.e8 = tkinter.Entry(self, state="disabled") self.e8.configure(width=12) self.e8.grid(sticky=E, row=5, column=8, padx=5, pady=5) lbl = Label(self, text="Nombre de fois") lbl.grid(sticky=W + E + S + N, row=6, column=7, padx=5) self.e9 = tkinter.Entry(self, state="disabled") self.e9.configure(width=12) self.e9.grid(sticky=E, row=6, column=8, padx=5, pady=5) self.btn8 = Button(self, text="Lancer l'experience ", state="disabled", command=self.onCalcule7) self.btn8.grid(sticky=W + E + S + N, row=7, column=7, columnspan=2, padx=5, pady=5) lbl = Label(self, text="3. Experience aleatoire tous les genomes") lbl.grid(sticky=W + E + S + N, row=8, column=7, columnspan=2, padx=5) lbl = Label(self, text="Taille morceau") lbl.grid(sticky=W + E + S + N, row=9, column=7, padx=5) self.e10 = tkinter.Entry(self, state="disabled") self.e10.configure(width=12) self.e10.grid(sticky=E, row=9, column=8, padx=5, pady=5) lbl = Label(self, text="Nombre de fois") lbl.grid(sticky=W + E + S + N, row=10, column=7, padx=5) self.e11 = tkinter.Entry(self, state="disabled") self.e11.configure(width=12) self.e11.grid(sticky=E, row=10, column=8, padx=5, pady=5) self.btn9 = Button(self, text="Lancer l'experience ", state="disabled", command=self.onCalcule8) self.btn9.grid(sticky=W + E + S + N, row=11, column=7, columnspan=2, padx=5, pady=5) def onOpen(self): ftypes = [('Fna files', '*.fna')] dlg = filedialog.Open(self, filetypes=ftypes) fl = dlg.show() n = len(fl.split('/')[-1]) + 1 path = fl[:-n] start = timeit.default_timer() onlyfiles = [f for f in listdir(path) if isfile(join(path, f))] message = "Liste des genomes charges: \n" self.sequences = {} for f in onlyfiles: s = path + '/' + f name, genome = lireSeq(s) self.sequences[name] = genome message = message + name + '\n' stop = timeit.default_timer() time_total = stop - start message += '\n' message += ' --> Time reading : ' + str(time_total) + '\n\n' self.area.configure(state="normal") self.area.insert(END, message) self.area.configure(state="disabled") self.btn2.configure(state="normal") self.e1.configure(state="normal") def onCalcule(self): k = self.e1.get() try: self.kmer = int(k) self.e1.configure(state="disabled") self.btn2.configure(state="disabled") self.area.configure(state="normal") message = "Kmer calcule : " + str(k) + "\n" self.area.insert(END, message) self.area.configure(state="disabled") start = timeit.default_timer() self.dico_k_mers = do_dic_kmers(self.kmer, alphabet_nt) try: self.dicProfils = do_profils_all_genomes( self.sequences, self.dico_k_mers, self.kmer) """ cont = 0 for key in self.dicProfils.keys(): l = list(self.dicProfils[key].values()).count(0) string = key+ " Lenght Profil: "+ str(len(self.dicProfils[key])-l) self.listbox.insert(cont, string) cont += 1 """ except Exception as e: print("ici INI", e) stop = timeit.default_timer() time_total = stop - start message = ' --> Time calculating Profils : ' + str( time_total) + '\n\n' self.area.configure(state="normal") self.area.insert(END, message) self.area.configure(state="disabled") self.btn3.configure(state="normal") self.e2.configure(state="normal") self.e3.configure(state="normal") self.btn7.configure(state="normal") self.e7.configure(state="normal") self.btn8.configure(state="normal") self.e8.configure(state="normal") self.e9.configure(state="normal") self.btn9.configure(state="normal") self.e10.configure(state="normal") self.e11.configure(state="normal") except Exception as e: print("ici INI2", e) mbox.showwarning("Warning", "Number must be Integer") def onCalcule2(self): pas = self.e2.get() fenetre = self.e3.get() self.pas = [] self.fenetres = [] self.positions = {} self.infoDistances = {} self.partieGenomeDif = {} self.cont = 0 try: self.cont = 0 self.pas.append(int(pas)) self.fenetres.append(int(fenetre)) self.area.configure(state="normal") message = "Proportion Genome : pas: "******" fenetre: " + str(fenetre) + " \n" message += "Calcule distance..." + "\n" self.area.insert(END, message) self.area.configure(state="disabled") start = timeit.default_timer() self.parties = do_sub_parts(self.dicProfils, self.sequences, int(pas), int(fenetre), self.dico_k_mers, self.kmer, self.v) pdfFile = path_dir + '/images/FirstParties.pdf' pp = PdfPages(pdfFile) means = do_mean_sub_parts(self.parties) ecarts = do_sd_sub_parts(self.parties, means) message = "Position dans le genome avec la max dist: \n" try: for i in self.parties.keys(): self.positions[i] = [ self.parties[i].index(max(self.parties[i])) * (int(pas)) ] listI = [] listI.append( [max(self.parties[i]), means[i] + ecarts[i] * 2]) self.infoDistances[i] = listI message += i + ' pos: ' + str( self.positions[i][self.cont]) + "\n" message += '\n' except Exception as e: print("ici 2", e) try: self.plot_for_each_genome(self.parties, pp, self.pas, self.positions, self.fenetres, self.cont, True, means, ecarts) except Exception as e: print("ici 1", e) subprocess.Popen([pdfFile], shell=True) self.area.configure(state="normal") self.area.insert(END, message) self.area.configure(state="disabled") try: self.partieGenomeDif = get_partieDif_all_genomes( self.sequences, self.positions, self.pas, int(fenetre), self.cont) except Exception as e: print("ici 3", e) stop = timeit.default_timer() time_total = stop - start message = ' --> Time calculating sub-parties : ' + str( time_total) + '\n\n' self.area.configure(state="normal") self.area.insert(END, message) self.area.configure(state="disabled") self.btn3.configure(state="disabled") self.e2.configure(state="disabled") self.e3.configure(state="disabled") self.btn4.configure(state="normal") self.e4.configure(state="normal") self.e5.configure(state="normal") except Exception as e: print("ici 3", e) mbox.showwarning("Warning", "Number must be Integer") def myplotcode(self, x, y): fig = plt.figure(figsize=(40, 40)) ax = fig.add_subplot(111) x_points = range(0, len(x)) y_points = y ax.plot(x_points, y_points, 'b') ax.set_xlabel('Parties Genome') ax.set_ylabel('Distance') ax.set_title('Distribution proportion Genome') return fig def plot_for_each_genome(self, sub_parts_for_each_genome, pp, pas, positions, fenetres, cont, boolean, means, ecarts): try: for i in sub_parts_for_each_genome.keys(): fig = plt.figure() ax = fig.add_subplot(111) pos = 0 position = positions[i] if boolean: pos = int(position[cont] - (fenetres[cont] / 2)) else: pos = int(position[-1] - (fenetres[-2] / 2)) if pos < 0: pos = 0 if cont == 0: xVector = range( 0, len(sub_parts_for_each_genome[i]) * pas[cont], pas[cont]) x_points = xVector else: xVector = range( pos, pos + len(sub_parts_for_each_genome[i]) * pas[cont], pas[cont]) x_points = xVector y_points = sub_parts_for_each_genome[i] plt.plot(x_points, y_points, 'b') ax.set_xlabel('Position') ax.set_ylabel('Distance') ax.set_title(i) x = x_points y = len(x) * [means[i]] plt.plot(x, y) x = x_points y = len(x) * [means[i] + ecarts[i] * 2] plt.plot(x, y) x = x_points y = len(x) * [means[i] - ecarts[i] * 2] plt.plot(x, y) pp.savefig() pp.close() except Exception as e: print(e) def onCalcule3(self): pas = self.e4.get() fenetre = self.e5.get() self.cont += 1 try: if int(fenetre ) == self.fenetres[-1] or int(fenetre) > self.fenetres[-1]: mbox.showwarning( "Warning", "La fenetre foit etre de taille inferieure a la derniere fenetre" ) return else: self.pas.append(int(pas)) self.fenetres.append(int(fenetre)) self.area.configure(state="normal") message = "Proportion subpartie : pas: "******" fenetre: " + fenetre + " \n" message += "Calcule distance..." + "\n" self.area.insert(END, message) self.area.configure(state="disabled") start = timeit.default_timer() self.parties = do_sub_parts(self.dicProfils, self.partieGenomeDif, int(pas), int(fenetre), self.dico_k_mers, self.kmer, self.v) means = do_mean_sub_parts(self.parties) ecarts = do_sd_sub_parts(self.parties, means) pdfFile = path_dir + '/images/SubParties' + str(self.cont) + '.pdf' pp = PdfPages(pdfFile) try: message = "Position dans le genome avec la max dist: \n" for i in self.parties.keys(): list_i = self.positions[i] pos = 0 pos = int((list_i[-1] - (self.fenetres[-2]) / 2) + self.parties[i].index(max(self.parties[i])) * int(pas)) if pos < 0: pos = 0 list_i.append(pos) self.positions[i] = list_i listj = self.infoDistances[i] listj.append( [max(self.parties[i]), means[i] + ecarts[i] * 2]) self.infoDistances[i] = listj message += i + ' pos: ' + str(pos) + '\n' message += '\n' except Exception as e: print(e) try: self.plot_for_each_genome(self.parties, pp, self.pas, self.positions, self.fenetres, self.cont, False, means, ecarts) except Exception as e: print("ici 1", e) subprocess.Popen([pdfFile], shell=True) self.area.configure(state="normal") self.area.insert(END, message) self.area.configure(state="disabled") try: self.partieGenomeDif = get_partieDif_all_genomes( self.sequences, self.positions, self.pas, int(fenetre), self.cont) matrice, self.listCles = transfert_study( self.dicProfils, self.partieGenomeDif, self.dico_k_mers, self.kmer, self.v) liste_probable_transfert = tranfert_study_result( matrice, self.listCles, self.infoDistances) self.relations = file_result(liste_probable_transfert, "Resultats.txt") self.types = [] for i in self.listCles: self.types.append(i.split(":")[0]) except Exception as e: print("ici 4", e) stop = timeit.default_timer() time_total = stop - start message = ' --> Time calculating sub-parties : ' + str( time_total) + '\n\n' self.area.configure(state="normal") self.area.insert(END, message) self.area.configure(state="disabled") self.cb.configure(state="normal") self.btn5.configure(state="normal") self.btn6.configure(state="normal") except Exception as e: print("ici 4", e) mbox.showwarning("Warning", "Number must be Integer") def onClick(self): if self.imp.get() == True: self.area.configure(state="normal") self.area.insert( END, "Fichier creee et sauvegarde dans le repertoire actuel : Nom fichier : SeqDifs.txt \n\n" ) self.area.configure(state="disabled") sequencesDif(self.partieGenomeDif) def onCalcule4(self): pp = PdfPages(path_dir + '\\images\\Phylogenie.pdf') matrice, liste = do_data_matrix(self.dicProfils) Z = linkage(matrice, 'ward') fig = plt.figure(figsize=(30, 10)) ax = fig.add_subplot(111) ax.set_title('Hierarchical Clustering Dendrogram Genomes') ax.set_xlabel('Distance') ax.set_ylabel('Genomes') dendrogram(Z, leaf_rotation=0., leaf_font_size=6., orientation='right', labels=liste) fig.show() pp.savefig() pp.close() self.fenetrePlot(fig, "Phylogenie") def fenetrePlot(self, fig, title): self.plot = tkinter.Toplevel(self) self.plot.geometry("700x700+100+100") self.plot.wm_title(title) self.plot.canvas = FigureCanvasTkAgg(fig, master=self.plot) self.plot.canvas.show() self.plot.canvas.get_tk_widget().pack() def onCalcule5(self): reseau2(self.relations, self.listCles, self.types) #self.fenetrePlot(graph, title) try: subprocess.Popen([path_dir + "\\Reseau.pdf"], shell=True) except Exception as e: print("ici 4", e) def onCalcule6(self): taille = self.e7.get() try: self.taille = int(taille) key = random.choice(list(self.sequences.keys())) genome = self.sequences[key] rand = random.randint(0, len(genome) - self.taille) randomSeq = genome[rand:rand + self.taille] message = 'Genome Aleatoire : \n' message += key + '\n' self.area.configure(state="normal") self.area.insert(END, message) self.area.configure(state="disabled") profilMorceau = do_profil_genome(randomSeq, self.dico_k_mers, self.kmer) ind = transfert_studyBoutGenome(self.dicProfils, profilMorceau, self.v) message = 'Genome predicte \n' message += ind + '\n\n' self.area.configure(state="normal") self.area.insert(END, message) self.area.configure(state="disabled") except Exception as e: print("ici 4", e) mbox.showwarning("Warning", "Number must be Integer") def onCalcule7(self): taille = self.e8.get() expFois = self.e9.get() try: self.taille = int(taille) self.fois = int(expFois) vectResultat, genome = experiment(self.dicProfils, self.sequences, self.dico_k_mers, self.kmer, self.fois, self.taille, self.v) erreur = errorRate(vectResultat) message = 'Genome Aleatoire\n' message += genome + '\n' message += "Taux d'erreur pour le genome choisi : " + str( erreur) + '\n\n' self.area.configure(state="normal") self.area.insert(END, message) self.area.configure(state="disabled") except Exception as e: print("ici 4", e) mbox.showwarning("Warning", "Number must be Integer") def onCalcule8(self): taille = self.e10.get() expFois = self.e11.get() try: self.taille = int(taille) self.fois = int(expFois) erreur, genomes = experiment2(self.dicProfils, self.sequences, self.dico_k_mers, self.kmer, self.fois, self.taille, self.v) types = [] for i in genomes: types.append(i.split(":")[0]) fig = plt.figure(figsize=(25, 10)) width = 0.2 ax = fig.add_subplot(111) ax.set_title("Taux d'erreur predictions") ax.set_xlabel('Genomes') ax.set_ylabel("Taux d'erreur") ind = np.arange(len(genomes)) plt.bar(ind, erreur, width, color='b') plt.xticks(ind + width / 2., types, rotation=45) plt.yticks(np.arange(0, 1.5, 0.2)) fig.show() self.fenetrePlot(fig, "Taux d'erreur") message = 'Genome aleatoire\n' message += 'Calcule pour tous les genomes\n' message += 'Prediction des ' + str( self.fois) + " bouts aleatoires pour chaque genome \n\n" self.area.configure(state="normal") self.area.insert(END, message) self.area.configure(state="disabled") except Exception as e: print("ici 4", e) mbox.showwarning("Warning", "Number must be Integer")
class IniGenGui(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.parent = parent self.inigen = IniGen() self.initUIGlobals() def initUIGlobals(self): """ This is the first part of the window to be rendered. After these have been set by the user and 'Emit Globals' has been clicked, the given algorithm can then specify how to generate the second part of the window. All fields are disabled for user input after globals have been emitted. Information in Global Parameters: Algorithm - name of the algorithm to use File Name - name of the output file to be generated Min Time - Minimum Time for distillers to run Max Time - Maximum Time for distillers to run Set Enabled: - checkbox to specify if the distiller should be enabled True or False """ self.parent.title("Ini Generator") Style().configure("TButton", padding=(0, 5, 0, 5), font='serif 10') # initialize row counter. This is incremented after each element added to grid row = 0 # initialize column counter. This is incremented after a column has been filled self.column = 0 # Globals: entries for info common to all runs label_globals = Label(self, text="Globals") label_globals.grid(row=row, column=self.column) row += 1 label_alg = Label(self, text="Algorithm") label_alg.grid(row=row, column=self.column, sticky=E+W) row += 1 self.cbox_alg = Combobox(self, values=algorithms.keys(), state='readonly') self.cbox_alg.current(0) self.cbox_alg.grid(row=row, column=self.column, sticky=E+W+S+N) row += 1 label_filename = Label(self, text="Output File Name") label_filename.grid(row=row, column=self.column, sticky=E+W) row += 1 self.entry_filename = Entry(self) self.entry_filename.grid(row=row, column=self.column, sticky=W+E) row += 1 label_mintime = Label(self, text="Min Time") label_mintime.grid(row=row, column=self.column, sticky=E+W) row += 1 self.entry_mintime = Entry(self) self.entry_mintime.grid(row=row, column=self.column, sticky=W+E) row += 1 label_maxtime = Label(self, text="Max Time") label_maxtime.grid(row=row, column=self.column, sticky=W+E) row += 1 self.entry_maxtime = Entry(self) self.entry_maxtime.grid(row=row, column=self.column, sticky=W+E) row += 1 self.enabled = IntVar() self.check_enabled = Checkbutton(self, text="set enabled", variable=self.enabled) self.check_enabled.grid(row=row, column=self.column, sticky=W+E) row += 1 # Control: buttons used to emmiting text and generating file self.button_emit_globals = Button(self, text="Emit Globals", command=self.emit_globals) self.button_emit_globals.grid(row=row, column=self.column, sticky=W+E) row += 1 button_addrun = Button(self, text="Add Run", command=self.emit_run) button_addrun.grid(row=row, column=self.column, sticky=W+E) row += 1 button_generate = Button(self, text="Generate File", command=self.generate_file) button_generate.grid(row=row, column=self.column, sticky=W+E) row += 1 self.column += 1 self.pack() def initUIRuns(self): """ Second part of gui to be rendered. This contains all the fields needed to emit a single run within a distiller file. Multiple runs can be added by clicking 'Add Run' multiple times. Information in Run Parameters: Run Name - header name for run Dependencies - description and uuid fields for each dependency in the algorithm Params - parameter fields for each parameter in the algorithm """ self.entry_run_name = None self.entries_dep_description = [] self.entries_dep_uuid = [] self.entries_param = [] row = 0 label_runs = Label(self, text="Runs") label_runs.grid(row=row, column=self.column) row += 1 label_run_name = Label(self, text="Run Name") label_run_name.grid(row=row, column=self.column, sticky=W+E) row += 1 self.entry_run_name = Entry(self) self.entry_run_name.grid(row=row, column=self.column, sticky=W+E) row += 1 algorithm = self.cbox_alg.get() settings = algorithms[algorithm] for dep in settings['deps']: if row >= 21: self.column += 1 row = 1 label_dep_description = Label(self, text="{0} (description)".format(dep)) label_dep_description.grid(row=row, column=self.column, sticky=W+E) row += 1 entry_dep_description = Entry(self) entry_dep_description.grid(row=row, column=self.column, sticky=W+E) row += 1 label_dep_uuid = Label(self, text="{0} (uuid)".format(dep)) label_dep_uuid.grid(row=row, column=self.column, sticky=W+E) row += 1 entry_dep_uuid = Entry(self) entry_dep_uuid.grid(row=row, column=self.column, sticky=W+E) row += 1 self.entries_dep_description.append(entry_dep_description) self.entries_dep_uuid.append(entry_dep_uuid) for param in settings['params']: if row >= 21: self.column += 1 row = 1 label_param = Label(self, text=param) label_param.grid(row=row, column=self.column, sticky=W+E) row += 1 entry_param = Entry(self) entry_param.grid(row=row, column=self.column, sticky=W+E) row += 1 self.entries_param.append(entry_param) row = 0 self.column += 1 self.text_file = Text(self) self.text_file.grid(row=row, column=self.column, rowspan=31, sticky=W+E+N+S, padx=5, pady=5) self.column += 1 scrollbar = Scrollbar(self, command=self.text_file.yview) self.text_file.config(yscrollcommand=scrollbar.set) scrollbar.grid(row=row, column=self.column, rowspan=31, sticky=N+S) self.pack() def emit_globals(self): self.algorithm = algorithms[self.cbox_alg.get()] path = self.algorithm['path'] if self.enabled.get(): enabled = 'True' else: enabled = 'False' lines = self.inigen.emit_global(path, enabled) self.mintime = self.entry_mintime.get() self.maxtime = self.entry_maxtime.get() self.cbox_alg.configure(state='disabled') self.entry_filename.configure(state='disabled') self.entry_mintime.configure(state='disabled') self.entry_maxtime.configure(state='disabled') self.check_enabled.configure(state='disabled') self.button_emit_globals.configure(state='disabled') self.initUIRuns() self.update_text(lines) def emit_run(self): label = self.entry_run_name.get() chunking = 'parallel' #hardcoded for now mintime = self.mintime maxtime = self.maxtime lines = self.inigen.emit_run_header(label, chunking, mintime, maxtime) self.update_text(lines) deps = [] for i in range(len(self.entries_dep_description)): deps.append([self.entries_dep_description[i].get(), self.algorithm['deps'][i], self.entries_dep_uuid[i].get()]) params = [] for i in range(len(self.entries_param)): params.append([self.algorithm['params'][i], self.entries_param[i].get()]) outputs = self.algorithm['outputs'] lines = self.inigen.emit_run_body(deps, params, outputs) self.update_text(lines) def generate_file(self): self.inigen.generate_file(self.entry_filename.get()) self.quit() def update_text(self, lines): self.text_file.configure(state='normal') string = "\n".join(lines) self.text_file.insert(END, string) self.text_file.configure(state='disabled')