def mainButtons(self): row = 0 col = 0 self.buttons = [] mb = Menubutton(self.root, text="Select Application") mb.menu = Menu(mb, tearoff=0) mb["menu"] = mb.menu for app in APPLICATIONS: mb.menu.add_radiobutton(label=app, variable=self.appVar, command=self.onSelectApp) mb.grid(row=row, column=col, sticky="NEW") col += 1 self.buttons.append(mb) otherButtons = ( ("Run %12s" % self.appVar.get(), self.runApp), ("load Config", self.loadCfg), ("Save Config", self.saveCfg), ("Save Config as", self.saveCfgAs), ("Quit", self.root.quit), ) for text, command in otherButtons: self.buttons.append(Button(self.root, text=text, command=command)) self.buttons[-1].grid(row=row, column=col, sticky="NEW") col += 1 return len(self.buttons)
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)
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)
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 = [] # Содержание счета (количество товара)
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()
def show_report(master, data): """Выводит панель генерации отчетов.""" def choose_assortiment(event): """Функция, срабатывающая при выборе товара из списка товаров.""" select = listbox_goods.curselection() if select: index = int(select[0]) if assortiment[index]: show_report.goods = assortiment[index] title.configure(text=assortiment[index].name) else: show_report.goods = None title.configure(text=u'Товары:') checks_fill() #--------------------------------------- def assortiment_fill(): """Функция заполнения списков товаров/ингредиентов""" for q in range(len(assortiment)): # Очищаем список товаров del(assortiment[0]) listbox_goods.delete(0, END) for cath in queries.cathegories(): assortiment.append(None) listbox_goods.insert(END, '') assortiment.append(None) head = '-' * (REPORT_WIDTH - len(cath.name) -1) + cath.name + u'-' listbox_goods.insert(END, head) for item in queries.items_in_cathegory(cath): assortiment.append(item) listbox_goods.insert(END, ' ' + item.name) if not item.show: listbox_goods.itemconfig(END, {'fg':'grey'}) assortiment.append(None) listbox_goods.insert(END, '') assortiment.append(None) head = '-' * (REPORT_WIDTH - len(u'Ингредиенты') -1) + u'Ингредиенты-' listbox_goods.insert(END, head) for item in queries.items_in_cathegory(None): assortiment.append(item) listbox_goods.insert(END, ' ' + item.name) if not item.show: listbox_goods.itemconfig(END, {'fg':'grey'}) #--------------------------------------- def checks_fill(event=None): """Функция заполнения списка параметров для отчета""" listbox_checks.delete(0, END) reporing = radioVar.get() listbox_checks.insert(END, reporing + ':') if varGoods.get(): listbox_checks.insert(END, u'- товар' ) if reporing == u'Расходы': listbox_checks.itemconfig(END, {'fg':'grey'}) elif not show_report.goods: listbox_checks.itemconfig(END, {'fg':'red'}) if varDate.get(): listbox_checks.insert(END, u'- дата' ) if reporing == u'Остатки': listbox_checks.itemconfig(END, {'fg':'grey'}) elif not (cal_from.selection or cal_to.selection): listbox_checks.itemconfig(END, {'fg':'red'}) elif (cal_from.selection and cal_to.selection) and ( cal_from.selection > cal_to.selection): listbox_checks.itemconfig(END, {'fg':'red'}) if varCath.get(): listbox_checks.insert(END, u'- категория' ) if reporing == u'Расходы': listbox_checks.itemconfig(END, {'fg':'grey'}) if varCheck.get(): listbox_checks.insert(END, u'- чек' ) if reporing <> u'Продажи': listbox_checks.itemconfig(END, {'fg':'grey'}) else: try: check1 = int(chekVar1.get()) check2 = int(chekVar2.get()) except: listbox_checks.itemconfig(END, {'fg':'red'}) else: if check1 > check2: listbox_checks.itemconfig(END, {'fg':'red'}) if varLost.get(): listbox_checks.insert(END, u'- причина' ) if reporing <> u'Списания': listbox_checks.itemconfig(END, {'fg':'grey'}) if radioVar2.get() <> u'Не учитывать': listbox_checks.insert(END, u'- скидка' ) if reporing <> u'Продажи': listbox_checks.itemconfig(END, {'fg':'grey'}) #--------------------------------------- class Calendar2(Calendar): """Класс с переопределенным (дополненным) методом клика по календарю.""" def _pressed(self, evt): """Clicked somewhere in the calendar.""" Calendar._pressed(self, evt) checks_fill() #--------------------------------------- def apply(): """Открывает окно с выбранным отчетом на основании выбранных фильтров""" args = {} if varGoods.get() and radioVar.get() <> u'Расходы': if show_report.goods: args['item'] = show_report.goods else: tkMessageBox.showinfo(u'Внимание!', u'Товар не был выбран, так что учитываться не будет!') if varDate.get() and radioVar.get() <> u'Остатки': if cal_from.selection or cal_to.selection: if (cal_from.selection > cal_to.selection): tkMessageBox.showinfo(u'Ошибка!', u'Начальный день акции больше конечного!\nФильтр не учитывается.') else: if cal_from.selection: args['from_date'] = cal_from.selection if cal_to.selection: args['to_date'] = cal_to.selection else: tkMessageBox.showinfo(u'Внимание!', u'Даты не были выбраны, так что учитываться не будут!') if varCath.get(): if radioVar.get() <> u'Расходы': args['cathegory'] = show_report.cathegory if varCheck.get(): if radioVar.get() == u'Продажи': try: check1 = int(chekVar1.get()) check2 = int(chekVar2.get()) except: tkMessageBox.showinfo(u'Ошибка!', u'Проверьте содержимое числовых полей чека!\nФильтр не учитвается.') else: if check1 > check2: tkMessageBox.showinfo(u'Ошибка!', u'Начальный номер чека больше конечного!\nФильтр не учитывается.') else: args['from_check'] = check1 args['to_check'] = check2 if varLost.get(): if radioVar.get() == u'Списания': args['reason'] = show_report.lost if radioVar2.get() <> u'Не учитывать': if radioVar.get() == u'Продажи': if radioVar2.get() == u'Со скидкой': args['discount'] = True else: args['discount'] = False if radioVar.get() == u'Продажи': report_sell(master, **args) elif radioVar.get() == u'Списания': report_lost(master, **args) elif radioVar.get() == u'Остатки': report_storage(master, **args) elif radioVar.get() == u'Приход': report_incoming(master, **args) elif radioVar.get() == u'Расходы': report_cash(master, **args) #=========================== СОЗДАНИЕ ИНТЕРФЕЙСА =========================== frame = Canvas(master, relief=GROOVE, highlightthickness=0) frame.pack(side=TOP, fill=BOTH, expand=YES) if USE_BACKGROUND: frame.create_image(0,0, anchor='nw', image=data.photo) #------------------------------ ЛЕВЫЙ ФРЕЙМ -------------------------------- leftFrame = Frame(frame, relief=GROOVE) leftFrame.pack(side=LEFT, fill=Y, pady=CONTROL_PAD, padx=CONTROL_PAD/2) title = Label(leftFrame, text=u'Товары:', font=('Lucida Console', FONT_SIZE_BIG)) title.pack(pady=5) varGoods = IntVar(leftFrame) chb_goods = Checkbutton(leftFrame, text=u'Фильтр по товару', variable=varGoods, command=checks_fill) chb_goods.pack(side=BOTTOM) assortiment = [] show_report.goods = None scrollbar_goods = Scrollbar(leftFrame) listbox_goods = Listbox(leftFrame, yscrollcommand=scrollbar_goods.set, width = REPORT_WIDTH, activestyle='dotbox', font=('Lucida Console', BILL_FONT_SIZE)) listbox_goods.pack(side=LEFT, fill=BOTH) scrollbar_goods.config(command=listbox_goods.yview) scrollbar_goods.pack(side=LEFT, fill=Y) listbox_goods.bind('<<ListboxSelect>>', choose_assortiment) #------------------------------ СРЕДНИЙ ФРЕЙМ ------------------------------ middleFrame = Frame(frame, relief=GROOVE) middleFrame.pack(side=TOP, pady=CONTROL_PAD, padx=CONTROL_PAD, anchor='w', ipadx=CONTROL_PAD/3, ipady=CONTROL_PAD/3) radioVar = StringVar(middleFrame) radioVar.set("Продажи") variants = ("Продажи", "Остатки", "Приход", "Списания", "Расходы") listbox_checks = Listbox(middleFrame, width = 12, height=6, activestyle='dotbox', font=('Lucida Console', BILL_FONT_SIZE)) listbox_checks.pack(side=RIGHT, fill=Y, padx=CONTROL_PAD/2, pady=CONTROL_PAD/2) Button(middleFrame, text='СФОРМИРОВАТЬ\nОТЧЕТ', style='Chosen.TButton', command=apply).pack(side=RIGHT, padx = CONTROL_PAD, pady = CONTROL_PAD, ipadx=10, ipady=10) for txt in variants: Radiobutton(middleFrame, text=txt,indicatoron = 0, width = 10, variable=radioVar, command=checks_fill, value=txt, font=('Verdana', FONT_SIZE)).pack(padx = CONTROL_PAD, pady=CONTROL_PAD/3, anchor=W) #----------------------------------------- middleFrame2 = Frame(frame, relief=GROOVE) middleFrame2.pack(padx=CONTROL_PAD, pady=CONTROL_PAD, anchor='w') date_from = Label(middleFrame2, text=u'Начальная дата:', font = ('Verdana', FONT_SIZE)) date_from.grid(column=0, row=0) cal_from = Calendar2(middleFrame2, firstweekday=0) cal_from.grid(column=0, row=1, pady=CONTROL_PAD, padx=CONTROL_PAD) date_to = Label(middleFrame2, text=u'Конечная дата\n(включительно):', font = ('Verdana', FONT_SIZE)) date_to.grid(column=1, row=0) cal_to = Calendar2(middleFrame2, firstweekday=0) cal_to.grid(column=1, row=1, pady=CONTROL_PAD, padx=CONTROL_PAD) varDate = IntVar(leftFrame) chb_date = Checkbutton(middleFrame2, text=u'Фильтр по датам', variable=varDate, command=checks_fill) chb_date.grid(column=0, row=2, columnspan=2, pady=CONTROL_PAD/3) #---------------------- Меню выбора категории -------------- middleFrame3 = Frame(frame, relief=GROOVE) middleFrame3.pack(padx=CONTROL_PAD, pady=CONTROL_PAD, anchor='w') def menu_change(key): """Меняет текущую категорию.""" if key: cathMenu.configure(text=key.name) else: cathMenu.configure(text=u'-Отсутствует-') show_report.cathegory = key def menu_update(): """Обновляет меню выбора категорий.""" menu = Menu(cathMenu, tearoff=0) cathMenu['menu'] = menu for cath in queries.cathegories(): menu.add_command(label=cath.name, font=('Verdana', FONT_SIZE_BIG), command=lambda key=cath: menu_change(key)) menu.add_command(label=u'-Отсутствует-', font=('Verdana',FONT_SIZE_BIG), command=lambda: menu_change(None)) Style().configure('TMenubutton', font=('lucida console', FONT_SIZE_BIG), justify='left') show_report.cathegory = None varCath = IntVar(middleFrame3) chb_cath = Checkbutton(middleFrame3, text=u'Фильтр по категории', variable=varCath, command=checks_fill) chb_cath.grid(column=0, row=1, columnspan=2, pady=(0, CONTROL_PAD)) Label(middleFrame3, text='Категория:', font=('Verdana', FONT_SIZE_BIG) ).grid(column=0, row=0, pady=CONTROL_PAD/3) smallFrame = Frame(middleFrame3, relief=GROOVE) smallFrame.grid(column=1, row=0, pady=CONTROL_PAD/3) cathMenu = Menubutton(smallFrame, text=u'-Отсутствует-', width=15, style='TMenubutton') cathMenu.pack(fill=BOTH, pady=5, padx=5) menu_update() #----------------------------- ЧЕКИ ---------------------------- check_frame = TkFrame(middleFrame3, relief=GROOVE, bg='#' + REPORT_COLOR) check_frame.grid(column=0, row=2, columnspan=2, pady=(CONTROL_PAD/3, 0), sticky='nwes') varCheck = IntVar(middleFrame3) chb_check = Checkbutton(middleFrame3, text=u'Фильтр по номеру чека', variable=varCheck, command=checks_fill, activebackground='#' + REPORT_COLOR, bg='#' + REPORT_COLOR) chb_check.grid(column=0, row=3, columnspan=2, pady=(0, CONTROL_PAD), sticky='nwes') chekVar1 = StringVar(check_frame, value=u'') ent1 = Entry(check_frame, textvariable=chekVar1, width=7,font=('Verdana', FONT_SIZE_BIG)) ent1.pack(side=LEFT, pady=CONTROL_PAD/3, padx=CONTROL_PAD) ent1.bind("<KeyRelease>", checks_fill) Label(check_frame, text=u'<= номера чеков <=', bg='#' + REPORT_COLOR, font = ('Verdana', FONT_SIZE)).pack(side=LEFT, pady=CONTROL_PAD/3, padx=CONTROL_PAD) chekVar2 = StringVar(check_frame, value=u'') ent2 = Entry(check_frame, textvariable=chekVar2, width=7,font=('Verdana', FONT_SIZE_BIG)) ent2.pack(side=LEFT, pady=CONTROL_PAD/3, padx=CONTROL_PAD) ent2.bind("<KeyRelease>", checks_fill) #---------------------- Меню выбора причины списания -------------- def menu_change_lost(key): """Меняет текущую причину списания.""" if key: lostMenu.configure(text=key.reason) show_report.lost = key def menu_update_lost(): """Обновляет меню выбора причин списания.""" menu = Menu(cathMenu, tearoff=0) lostMenu['menu'] = menu for lost in queries.full_lost_reasons_list(): menu.add_command(label=lost.reason, font=('Verdana', FONT_SIZE_BIG), command=lambda key=lost: menu_change_lost(key)) Style().configure('TMenubutton', font=('lucida console', FONT_SIZE_BIG), justify='left') lost_reasons_list = queries.lost_reasons_list() show_report.lost = lost_reasons_list[0] if lost_reasons_list else None varLost = IntVar(middleFrame) chb_lost = Checkbutton(middleFrame3, text=u'Фильтр по причине списания', variable=varLost, command=checks_fill) chb_lost.grid(column=0, row=5, columnspan=2, pady=(0, CONTROL_PAD)) Label(middleFrame3, text='Причина списания:', font=('Verdana', FONT_SIZE_BIG) ).grid(column=0, row=4, pady=CONTROL_PAD/3, padx=CONTROL_PAD/3) smallFrame2 = Frame(middleFrame3, relief=GROOVE) smallFrame2.grid(column=1, row=4, pady=CONTROL_PAD/3) lostMenu = Menubutton(smallFrame2, text=u'брак', width=19, style='TMenubutton') lostMenu.pack(fill=BOTH, pady=5, padx=5) menu_update_lost() #-------------------------------------------------------------- Label(middleFrame3, text='Фильтр по скидке.', font=('Verdana', FONT_SIZE), bg='#' + REPORT_COLOR).grid(column=0, row=7, sticky='nwes', columnspan=2) discFrame = TkFrame(middleFrame3, relief=GROOVE, bg='#' + REPORT_COLOR) discFrame.grid(column=0, row=6, columnspan=2, ipady=(CONTROL_PAD), sticky='nwes') radioVar2 = StringVar(middleFrame) radioVar2.set(u'Не учитывать') variants = (u'Не учитывать', u'Со скидкой', u'Без скидки') for txt in variants: Radiobutton(discFrame, text=txt,indicatoron = 0, width = 13, variable=radioVar2, command=checks_fill, value=txt, font=('Verdana', FONT_SIZE)).pack(side=LEFT, padx = CONTROL_PAD/2, pady=CONTROL_PAD/3, anchor=W) #--------------------------------первый запуск----------------------------- assortiment_fill() checks_fill()