class PriceAddition(Addition): def __init__(self, tab): super().__init__(tab) [ Label(self.frmFields, text=s).grid(row=i, **self.grd.cl0_pdSt) for i, s in enumerate(['Изготовитель', 'Цена', 'Срок годности']) ] self.cmbManufacturer = Searchbox( master=self.frmFields, postcommand=self.update_manufacturer_list, width=32) self.entPrice = Entry(self.frmFields, width=12, **self.vld.vldFlt2) self.entDate = Entry(self.frmFields, width=12, **self.vld.vldDate) self.cmbManufacturer.grid(row=0, **self.grd.cl1_pdSt) self.entPrice.grid(row=1, sticky='w', **self.grd.cl1_pdSt) self.entDate.grid(row=2, sticky='w', **self.grd.cl1_pdSt) self.lblHint = Label(self.frmFields) self.lblHint.grid(row=3, columnspan=2, **self.grd.pdSt) self.lblHint['wraplength'] = self.toplevel.winfo_reqwidth() - 8 hintA = 'Поле изготовитель — раскрывающийся список с вариантами выбора и встроенным поиском.' hintB = 'Клавиши ↑, ↓ — раскрыть список и перемещаться по вариантам, Esc — скрыть, Enter — выбрать.' hintC = 'Чтобы вернуть все варианты — очистите соответствующее поле ввода.' self.lblHint['text'] = '\n%s\n\n%s\n\n%s' % (hintA, hintB, hintC) self.toplevel.bind('<Configure>', self.hint_resize) def hint_resize(self, event): self.lblHint['wraplength'] = self.toplevel.winfo_reqwidth() - 8 def fillAndShow(self): self.clear() self.show() def update_manufacturer_list(self, event=None): selected_tag = None if self.tv.selection(): if len(self.tv.parent(self.tv.selection()[0])) == 0: selected_tag = self.tv.selection()[0] elif len(self.tv.parent(self.tv.selection()[0])) > 0: selected_tag = self.tv.parent(self.tv.selection()[0]) if selected_tag is not None: itemName = self.tv.item(int(selected_tag))['text'] itemCode = self.db.getCode('item_list', itemName) for record in self.db.data['item_list']: if record['code'] == itemCode: mcl = record['manufacturers'] break values = [self.db.getName('manufacturer_list', i) for i in mcl] self.cmbManufacturer.source = values self.cmbManufacturer.filter_values() def apply(self): if len(self.tv.parent(self.tv.selection()[0])) == 0: slcParentTag = self.tv.selection()[0] elif len(self.tv.parent(self.tv.selection()[0])) > 0: slcParentTag = self.tv.parent(self.tv.selection()[0]) itemCode = int(slcParentTag) providerCode = self.db.data['provider']['code'] manufacturerName = self.cmbManufacturer.get() manufacturerCode = self.db.getCode('manufacturer_list', manufacturerName) code = [itemCode, manufacturerCode, providerCode] repeatFlag = True for offer in self.db.data['price_list']: if offer['code'] == code: repeatFlag = False break price = self.trn.getFltOrZero(self.entPrice.get()) date = self.entDate.get() tag = '%i.%i.%i' % (itemCode, manufacturerCode, providerCode) mcl = self.db.data['item_list'][itemCode]['manufacturers'] if (repeatFlag is True and manufacturerCode != -1 and manufacturerCode in mcl and providerCode != -1): self.db.data['price_list'] += [{ 'code': code, 'price': price, 'date': date }] providerName = self.db.data['provider']['name'] manufacturerName = self.db.getName('manufacturer_list', manufacturerCode) strPrice = '{:.2f}'.format(price) value = [manufacturerName, providerName, strPrice, date] self.tv.insert(slcParentTag, 'end', iid=tag, text=tag, value=value) self.endAddition(tag) elif repeatFlag is False: messagebox.showerror( 'Ошибка', 'Предложение поставщика c кодом %s уже добавлено.' % (tag), parent=self.toplevel) elif manufacturerCode == -1: messagebox.showerror('Ошибка', 'Указанный изготовитель не найден.', parent=self.toplevel) elif manufacturerCode not in mcl: messagebox.showerror( 'Ошибка', 'Изготовитель не ассоциирован с выбранным наименованием.', parent=self.toplevel) elif providerCode == -1: messagebox.showerror( 'Ошибка', 'Название и код поставщика следует указать в настройках "Информация о поставщике".', parent=self.toplevel) def clear(self): self.cmbManufacturer.set('') [ w.delete(0, END) for w in (self.cmbManufacturer, self.entPrice, self.entDate) ]
class PriceMasterExporter(Exporter): def __init__(self, main): super().__init__(main) self.toplevel.title('Создать шаблон базы данных прайс-мастера') self.db = main.db lblProvider = Label(self.frmFields, text='Выберите поставщика') self.cmbProvider = Searchbox( master=self.frmFields, postcommand=self.update_provider_list, source = [d['name'] for d in self.db.data['provider_list']], width=32) self.lblHint = Label(self.frmFields) lblProvider.grid(row=0, **self.grd.cl1_pdSt) self.cmbProvider.grid(row=1, **self.grd.cl1_pdSt) self.lblHint.grid(row=2, **self.grd.cl1_pdSt) self.okButton['text'] = 'Сохранить как' self.okButton['command'] = self.saveFile hintA = 'Поле поставщик — раскрывающийся список с вариантами выбора и встроенным поиском.' hintB = 'Клавиши ↑, ↓ — раскрыть список и перемещаться по вариантам, Esc — скрыть, Enter — выбрать.' hintC = 'Чтобы вернуть все варианты — очистите соответствующее поле ввода.' self.lblHint['text'] = '\n%s\n\n%s\n\n%s' % (hintA, hintB, hintC) self.toplevel.bind('<Configure>', self.hint_resize) def hint_resize(self, event): self.lblHint['wraplength'] = self.toplevel.winfo_reqwidth() - 8 def update_provider_list(self, event=None): values = [d['name'] for d in self.db.data['provider_list']] self.cmbProvider.source = values self.cmbProvider.filter_values() def clear(self): self.cmbProvider.set('') self.cmbProvider.delete(0, END) def fillAndShow(self): self.clear() self.show() def saveFile(self): data = self.db.data.copy() data['provider'] = None data['price_list'] = [] del(data['provider_list']) prvName = self.trn.getNameSting(self.cmbProvider.get()) path = asksaveasfilename( defaultextension='.pmt', initialfile=prvName+'.pmt', filetypes=[('Шаблон базы данных прайс-мастера', '.pmt')], parent=self.toplevel) if prvName and path: for record in self.db.data['provider_list']: if prvName == record['name']: data['provider'] = record break with open(path, 'wb') as filePickle: dumpPickle(data, filePickle, protocol=4) self.hide()