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
Пример #2
0
 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))
Пример #4
0
    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))
Пример #6
0
    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
Пример #8
0
 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
Пример #9
0
    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)
Пример #10
0
    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()
Пример #11
0
    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)
Пример #12
0
Файл: mohr4.py Проект: choi/mohr
    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)
Пример #13
0
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')
Пример #14
0
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)))
Пример #15
0
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
Пример #16
0
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
Пример #17
0
    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)
Пример #18
0
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')