def createActOn(self, event): if event.GetId( ) == ID_BTN_CRARCT and self.TCTextInputCS.GetNumberOfLines() > 0: txtlst = list( map(lambda x: x.strip(), self.TCTextInputCS.GetValue().split('\n'))) progress = wx.ProgressDialog( "Создание Акта...", "Этап 0 из 6: Инициализация метода создания акта", maximum=100, parent=self, style=wx.PD_AUTO_HIDE | wx.PD_APP_MODAL) progress.Update(10, "Этап 1 из 6: Формирование имя акта") filenamedocx = \ f"Акт{self.TCActNumDef.GetValue()}_АЗС{self.TCAZSNumDef.GetValue()}_ССО{self.TCSSONumDef.GetValue()}." \ f"docx" progress.Update( 20, "Этап 2 из 6: Формирование пути расположения акта") docxpath = settings.get_local_acts_path_folder() + filenamedocx progress.Update(30, "Этап 3 из 6: Создание docx документа") fileProcessing.create_docx_file_from_bodylist( txtlst, self.TCAZSNumDef.GetValue(), self.TCSSONumDef.GetValue(), self.TCActNumDef.GetValue(), self.TCdateNumDef.GetValue(), docxpath) progress.Update(60, "Этап 4 из 6: Создание pdf документа") fileProcessing.create_pdf_file_from_docx(docxpath) progress.Update(80, "Этап 5 из 6: Копирование файлов в общую папку") fileProcessing.copy_files_to_general_folder(filenamedocx) self.refresh_list_acts(event) progress.Update(100, "Этап 6 из 6: Обновление списка актов") progress.Destroy()
def copy_files_to_general_folder(filenamedocx): docxpath = get_path_to_file_to_string(filenamedocx) filenamepdf = get_name_pdf_from_docx(filenamedocx) docxpathgen = settings.get_general_acts_path_folder() + filenamedocx pdfpath = settings.get_local_acts_path_folder() + filenamepdf pdfpathgen = settings.get_general_acts_path_folder() + filenamepdf shutil.copyfile(docxpath, docxpathgen) shutil.copyfile(pdfpath, pdfpathgen)
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) #Обьявление главного сайзера: self.mainsizer = wx.BoxSizer(wx.VERTICAL) #Блок 1, виджеты для указания пути к папке локальных актов-------------------------------------------------- self.mainsizer.Add(wx.StaticText(self, wx.ID_ANY, label="Путь к папке с локальными актами:"), flag=wx.EXPAND | wx.TOP | wx.LEFT | wx.RIGHT, border=10) self.folderactssizer = wx.BoxSizer(wx.HORIZONTAL) self.mainsizer.Add(self.folderactssizer, flag=wx.EXPAND | wx.TOP | wx.LEFT | wx.RIGHT, border=10) self.tc_actloc_path = wx.StaticText(self, id=ID_MD_PATHDIRACTLOC, style=wx.ST_ELLIPSIZE_START, label=settings.get_local_acts_path_folder()) self.folderactssizer.Add(self.tc_actloc_path, proportion=1) self.folderactssizer.Add(wx.Button(self, id=ID_MD_CHOSDIRLOC, label='...'), flag=wx.EXPAND | wx.LEFT, border=10) # Блок 2, виджеты для указания пути к папке общих актов------------------------------------------------------ self.mainsizer.Add(wx.StaticText(self, wx.ID_ANY, label="Путь к папке с общими актами:"), flag=wx.EXPAND | wx.TOP | wx.LEFT | wx.RIGHT, border=10) self.folderactssizer2 = wx.BoxSizer(wx.HORIZONTAL) self.mainsizer.Add(self.folderactssizer2, flag=wx.EXPAND | wx.TOP | wx.LEFT | wx.RIGHT, border=10) self.tc_act_path = wx.StaticText(self, id=ID_MD_PATHDIRACT, style=wx.ST_ELLIPSIZE_START, label=settings.get_general_acts_path_folder()) self.folderactssizer2.Add(self.tc_act_path, proportion=1) self.folderactssizer2.Add(wx.Button(self, id=ID_MD_CHOSDIR, label='...'), flag=wx.EXPAND | wx.LEFT, border=10) #Блок 3, виджеты дляуказания пути к шаблону docx self.mainsizer.Add(wx.StaticText(self, wx.ID_ANY, label="Путь к файлу шаблона docx:"), flag=wx.EXPAND | wx.TOP | wx.LEFT | wx.RIGHT, border=10) self.tmpldocx_path_sizer = wx.BoxSizer(wx.HORIZONTAL) self.mainsizer.Add(self.tmpldocx_path_sizer, flag=wx.EXPAND | wx.TOP | wx.LEFT | wx.RIGHT, border=10) self.tc_tmpl_docxfile_path = wx.StaticText(self, id=ID_MD_PATHFILETEMPLDOCX, style=wx.ST_ELLIPSIZE_START, label=settings.get_docx_templ_path()) self.tmpldocx_path_sizer.Add(self.tc_tmpl_docxfile_path, proportion=1) self.tmpldocx_path_sizer.Add(wx.Button(self, id=ID_MD_CHOSFILETMPLDOCX, label='...'), flag=wx.EXPAND | wx.LEFT, border=10) #Добавление главного сайзера с виджетами в окно self.SetSizer(self.mainsizer) #Назначение кнопок и функций self.Bind(wx.EVT_BUTTON, self.choosediractsloc, id=ID_MD_CHOSDIRLOC) self.Bind(wx.EVT_BUTTON, self.choosediracts, id=ID_MD_CHOSDIR) self.Bind(wx.EVT_BUTTON, self.choosefiletmpldocx, id=ID_MD_CHOSFILETMPLDOCX)
def refresh_list_acts(self, event): self.OLVlocal_acts.SetObjects( filetools.get_listdir_docx_files_in_dict( settings.get_local_acts_path_folder()))
def openFolderLocalActs(self, event): os.startfile(os.path.realpath(settings.get_local_acts_path_folder()))
def __init__(self, parent): wx.Frame.__init__(self, parent, id=wx.ID_ANY, title='ActOf', size=wx.Size(1037, 605), style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL) #Создание меню menubar = wx.MenuBar() fileMenu = wx.Menu() refMenu = wx.Menu() ftMenu = wx.Menu() fileMenu.Append(ID_MB_SETTINGS, "Настройки", "Открытие окна настроек") fileMenu.AppendSeparator() fileMenu.Append(ID_MB_EXIT, "Выход", "Выход из приложения") ftMenu.Append(ID_MB_OPENFOLDERLOCAL, "Открыть папку локальных актов") ftMenu.Append(ID_MB_OPENFOLDERREPO, "Открыть папку актов") ftMenu.Append(ID_MB_OPENDOCX, "Открыть шаблон docx") refMenu.Append(ID_MB_ABOUT, "О программе", "Описание программы") menubar.Append(fileMenu, "Файл") menubar.Append(ftMenu, "Навигация") menubar.Append(refMenu, "Справка") self.SetMenuBar(menubar) #Назначение функций кнопкам меню: self.Bind(wx.EVT_MENU, self.onSettings, id=ID_MB_SETTINGS) self.Bind(wx.EVT_MENU, self.onQuit, id=ID_MB_EXIT) self.Bind(wx.EVT_MENU, self.openFolderLocalActs, id=ID_MB_OPENFOLDERLOCAL) self.Bind(wx.EVT_MENU, self.openFolderActs, id=ID_MB_OPENFOLDERREPO) self.Bind(wx.EVT_MENU, self.openDocxTemplate, id=ID_MB_OPENDOCX) self.Bind(wx.EVT_MENU, self.about, id=ID_MB_ABOUT) #Определение шрифтов: self.fontSTactNum = wx.Font(15, wx.MODERN, wx.NORMAL, wx.BOLD, False, u'Times New Roman') self.fontBodyAct = wx.Font(12, wx.MODERN, wx.NORMAL, wx.NORMAL, False, u'Times New Roman') self.fontOLV = wx.Font(10, wx.MODERN, wx.NORMAL, wx.NORMAL, False, u'Roboto') self.font = wx.Font(12, wx.MODERN, wx.NORMAL, wx.NORMAL, False, u'Montserrat') #Создание панели: self.panel = wx.Panel(self) self.panel.SetFont(self.font) #Объявление сайзеров------------------------------------------------------------------------ #Главный сайзер программы: self.mainSizer = wx.BoxSizer(wx.HORIZONTAL) #Левая часть для шаблонов актов: self.leftSTemplActs = wx.BoxSizer(wx.VERTICAL) #Центральная часть сайзеры для создания актов: self.centrSCreateActs = wx.BoxSizer(wx.VERTICAL) self.centrSCreateActsGeneral = wx.BoxSizer(wx.HORIZONTAL) self.centrSActNumDef = wx.BoxSizer(wx.HORIZONTAL) self.centrSAZSSSONumDef = wx.BoxSizer(wx.HORIZONTAL) #Правая часть: Сайзеры для отправки актов(горизонтальный для добавления кнопок): self.rightSSendActs = wx.BoxSizer(wx.VERTICAL) self.rightSSendActsTopBTN = wx.BoxSizer(wx.HORIZONTAL) self.rSizerfileworkBTN = wx.BoxSizer(wx.HORIZONTAL) #Левая часть программы, список шаблонов и кнопки управления ими: #Создание кнопки Сохранить шаблон акта self.BTNSaveTemplateAct = wx.Button(self.panel, id=ID_BTN_SAVETEMPLACT, label="Сохранить шаблон <-") self.BTNChangeTemplAct = wx.Button(self.panel, id=ID_BTN_CHANGETEMPLACT, label="Изменить шаблон") self.BTNRefreshTemplAct = wx.Button(self.panel, id=ID_BTN_REFTEMPLACT, label="Обновить список шаблонов") self.BTNDeleteTemplAct = wx.Button(self.panel, id=ID_BTN_DELTEMPLACT, label="Удалить шаблон") self.BTNAddTemplAct = wx.Button(self.panel, id=ID_BTN_ADDTEMPLACT, label="Применить шаблон ->") #Добавление виджетов управления шаблонами актов в левый сайзер: self.leftSTemplActs.Add(self.BTNSaveTemplateAct, flag=wx.LEFT | wx.TOP | wx.EXPAND, border=5) self.leftSTemplActs.Add(self.BTNChangeTemplAct, flag=wx.LEFT | wx.TOP | wx.EXPAND, border=5) self.leftSTemplActs.Add(self.BTNRefreshTemplAct, flag=wx.LEFT | wx.TOP | wx.EXPAND, border=5) self.leftSTemplActs.Add(self.BTNDeleteTemplAct, flag=wx.LEFT | wx.TOP | wx.EXPAND, border=5) self.leftSTemplActs.Add(self.BTNAddTemplAct, flag=wx.LEFT | wx.TOP | wx.EXPAND, border=5) #Создание списка шаблонов: self.OLVtempl_acts = ObjectListView(self.panel, wx.ID_ANY, style=wx.LC_REPORT | wx.SUNKEN_BORDER) templnum = ColumnDefn("№", "left", 50, "templnum", isSpaceFilling=False) desctempl = ColumnDefn("Описание шаблона", "left", 300, "desctempl", isSpaceFilling=False) self.OLVtempl_acts.oddRowsBackColor = wx.WHITE self.OLVtempl_acts.SetFont(self.fontOLV) self.OLVtempl_acts.SetColumns([templnum, desctempl]) self.OLVtempl_acts.SetObjects(db.gettemplateslistfromdb()) # Добавление списка актов в левый сайзер self.leftSTemplActs.Add(self.OLVtempl_acts, proportion=1, flag=wx.EXPAND | wx.TOP | wx.LEFT, border=5) #Добавление левого сайзера в главный сайзер: self.mainSizer.Add(self.leftSTemplActs, flag=wx.EXPAND | wx.BOTTOM, border=5) #Центральная часть программы, поле для ввода текста и кнопка создать акт: #Создание кнопок "Обновить всё", "Создать Акт", "Очистить": self.BTNrefreshAll = wx.Button(self.panel, id=ID_BTN_REFALL, label="Обновить всё") self.BTNCreateActCS = wx.Button(self.panel, id=ID_BTN_CRARCT, label=u"Создать Акт") self.BTNclearAll = wx.Button(self.panel, id=ID_BTN_CLEAR, label="Очистить всё") #Создание заголовка "Акт №" + поле ввода акта + кнопка обновить: self.BTNactNum = wx.Button(self.panel, ID_BTN_ACTNUM, label="Акт №") self.BTNactNum.SetFont(self.fontSTactNum) self.TCActNumDef = wx.TextCtrl(self.panel, ID_TC_ACTNUM, wx.EmptyString, wx.DefaultPosition, size=(85, -1)) self.TCActNumDef.SetFont(self.fontSTactNum) #Создание шапки документа номер АЗС номер ССО по аналогии с номером акта, текущая дата: self.BTNAZSnum = wx.Button(self.panel, ID_BTN_AZSNUM, label="АЗС №") self.BTNAZSnum.SetFont(self.fontBodyAct) self.TCAZSNumDef = wx.TextCtrl(self.panel, ID_TC_AZSNUM, wx.EmptyString, wx.DefaultPosition, size=(65, -1)) self.TCAZSNumDef.SetFont(self.fontBodyAct) self.BTNSSOnum = wx.Button(self.panel, ID_BTN_SSONUM, label="ССО №") self.BTNSSOnum.SetFont(self.fontBodyAct) self.TCSSONumDef = wx.TextCtrl(self.panel, ID_TC_SSONUM, wx.EmptyString, wx.DefaultPosition, size=(65, -1)) self.TCSSONumDef.SetFont(self.fontBodyAct) self.BTNdatenum = wx.Button(self.panel, ID_BTN_DATEINP, label="Дата") self.BTNdatenum.SetFont(self.fontBodyAct) self.TCdateNumDef = wx.TextCtrl(self.panel, ID_TC_DATEINP, wx.EmptyString, wx.DefaultPosition, size=(150, -1)) self.TCdateNumDef.SetFont(self.fontBodyAct) #Создание текстового поля ввода текста акта: self.TCTextInputCS = wx.TextCtrl(self.panel, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, wx.TE_MULTILINE) self.TCTextInputCS.SetFont(self.fontBodyAct) # Добавление кнопки обновить, создать, очистить в сайзер: self.centrSCreateActsGeneral.Add(self.BTNrefreshAll) self.centrSCreateActsGeneral.Add(self.BTNCreateActCS, wx.EXPAND) self.centrSCreateActsGeneral.Add(self.BTNclearAll) # Добавление виджетов номера акта в сайзер определения акта: self.centrSActNumDef.Add(self.BTNactNum) self.centrSActNumDef.Add(self.TCActNumDef) # Добавление виджетов номера АЗС, ССО, и текущей даты в сайзер: self.centrSAZSSSONumDef.Add(self.BTNAZSnum) self.centrSAZSSSONumDef.Add(self.TCAZSNumDef) self.centrSAZSSSONumDef.Add(self.BTNSSOnum, flag=wx.LEFT, border=5) self.centrSAZSSSONumDef.Add(self.TCSSONumDef) self.centrSAZSSSONumDef.Add(self.BTNdatenum, flag=wx.LEFT, border=5) self.centrSAZSSSONumDef.Add(self.TCdateNumDef) # Добавление всех элементов в центральный сайзер: self.centrSCreateActs.Add(self.centrSCreateActsGeneral, 0, wx.TOP | wx.LEFT | wx.RIGHT | wx.EXPAND, 5) self.centrSCreateActs.Add(self.centrSActNumDef, proportion=0, flag=wx.TOP | wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER, border=5) self.centrSCreateActs.Add(self.centrSAZSSSONumDef, proportion=0, flag=wx.TOP | wx.LEFT | wx.RIGHT, border=5) self.centrSCreateActs.Add(self.TCTextInputCS, 1, wx.ALL | wx.EXPAND, 5) #Добавление центрального сайзера в главный сайзер: self.mainSizer.Add(self.centrSCreateActs, proportion=1, flag=wx.EXPAND, border=5) #Правая часть программы, список созданных актов и кнопки для работы с ними: #Создание и добавление кнопок в сайзер: self.send_actBTN = wx.Button(self.panel, id=ID_BTN_SENDACT, label="Отправить Акт") self.del_actBTN = wx.Button(self.panel, id=ID_BTN_DELACT, label="Удалить файлы") self.refresh_lactsBTN = wx.Button(self.panel, id=ID_BTN_REFLACT, label="Обновить список") self.rightSSendActsTopBTN.Add(self.send_actBTN, 1, flag=wx.EXPAND | wx.TOP | wx.RIGHT, border=5) self.rightSSendActsTopBTN.Add(self.del_actBTN, 1, flag=wx.EXPAND | wx.TOP | wx.RIGHT, border=5) self.rightSSendActsTopBTN.Add(self.refresh_lactsBTN, 1, flag=wx.EXPAND | wx.TOP | wx.RIGHT, border=5) self.open_docx_BTN = wx.Button(self.panel, id=ID_BTN_OPENDOCX, label="Открыть docx") self.recopy_act_BTN = wx.Button(self.panel, id=ID_BTN_RECOPYACT, label="Коп. в папку Актов") self.copy_pdf_inbufferBTN = wx.Button(self.panel, id=ID_BTN_COPYPDFBUFF, label="Коп. pdf в буфер") self.rSizerfileworkBTN.Add(self.open_docx_BTN, 1, flag=wx.EXPAND | wx.TOP | wx.RIGHT, border=5) self.rSizerfileworkBTN.Add(self.recopy_act_BTN, 1, flag=wx.EXPAND | wx.TOP | wx.RIGHT, border=5) self.rSizerfileworkBTN.Add(self.copy_pdf_inbufferBTN, 1, flag=wx.EXPAND | wx.TOP | wx.RIGHT, border=5) self.rightSSendActs.Add(self.rightSSendActsTopBTN, proportion=0, flag=wx.EXPAND) self.rightSSendActs.Add(self.rSizerfileworkBTN, proportion=0, flag=wx.EXPAND) #Создание списка актов self.OLVlocal_acts = ObjectListView(self.panel, wx.ID_ANY, style=wx.LC_REPORT | wx.SUNKEN_BORDER) #Создание столбцов title = ColumnDefn("Имя", "left", 280, "title", isSpaceFilling=False) creating = ColumnDefn("Дата создания", "left", 130, "creating", stringConverter="%d-%m-%Y %H:%M:%S", isSpaceFilling=False) modifine = ColumnDefn("Дата изменения", "left", 130, "modifine", stringConverter="%d-%m-%Y %H:%M:%S", isSpaceFilling=False) self.OLVlocal_acts.oddRowsBackColor = wx.WHITE self.OLVlocal_acts.SetFont(self.fontOLV) self.OLVlocal_acts.SetColumns([title, creating, modifine]) #Добавление в список актов из папки locals_act self.OLVlocal_acts.SetObjects( filetools.get_listdir_docx_files_in_dict( settings.get_local_acts_path_folder())) #Добавление списка актов в сайзер self.rightSSendActs.Add(self.OLVlocal_acts, proportion=1, flag=wx.EXPAND | wx.TOP | wx.RIGHT | wx.BOTTOM, border=5) #Добавление правого сайзера в главный сайзер. self.mainSizer.Add(self.rightSSendActs, proportion=0, flag=wx.EXPAND) #Назначение главного сайзера self.panel.SetSizer(self.mainSizer) #Назначение событий self.Bind(wx.EVT_BUTTON, self.createActOn, id=ID_BTN_CRARCT) self.Bind(wx.EVT_BUTTON, self.sendActOn, id=ID_BTN_SENDACT) self.Bind(wx.EVT_BUTTON, self.del_acts_action, id=ID_BTN_DELACT) self.Bind(wx.EVT_BUTTON, self.refresh_list_acts, id=ID_BTN_REFLACT) self.Bind(wx.EVT_BUTTON, self.open_docx, id=ID_BTN_OPENDOCX) self.Bind(wx.EVT_BUTTON, self.recopy_file_in_general, id=ID_BTN_RECOPYACT) self.Bind(wx.EVT_BUTTON, self.copy_pdf_in_clipboard, id=ID_BTN_COPYPDFBUFF) self.Bind(wx.EVT_BUTTON, self.act_num_refresh, id=ID_BTN_ACTNUM) self.Bind(wx.EVT_BUTTON, self.azs_num_refresh, id=ID_BTN_AZSNUM) self.Bind(wx.EVT_BUTTON, self.sso_num_refresh, id=ID_BTN_SSONUM) self.Bind(wx.EVT_BUTTON, self.current_data_refresh, id=ID_BTN_DATEINP) self.Bind(wx.EVT_BUTTON, self.refresh_all, id=ID_BTN_REFALL) self.Bind(wx.EVT_BUTTON, self.clear_all, id=ID_BTN_CLEAR) self.OLVlocal_acts.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.open_docx) self.OLVlocal_acts.Bind(wx.EVT_KEY_DOWN, self.ctrl_c_in_list) self.OLVlocal_acts.Bind(wx.EVT_KEY_DOWN, self.enter_and_del_action_in_list) self.Bind(wx.EVT_BUTTON, self.btn_save_templ_act, id=ID_BTN_SAVETEMPLACT) self.Bind(wx.EVT_BUTTON, self.btn_change_templ_act, id=ID_BTN_CHANGETEMPLACT) self.Bind(wx.EVT_BUTTON, self.btn_refresh_templ_act, id=ID_BTN_REFTEMPLACT) self.Bind(wx.EVT_BUTTON, self.btn_delete_templ_act, id=ID_BTN_DELTEMPLACT) self.Bind(wx.EVT_BUTTON, self.btn_add_templ_act, id=ID_BTN_ADDTEMPLACT) self.OLVtempl_acts.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.btn_add_templ_act) self.OLVtempl_acts.Bind(wx.EVT_KEY_DOWN, self.enter_del_btn_action_in_templ_ovl)
def create_docx_and_pdf_files(lst, ACTnum, AZSnum, SSOnum, nowdate): filenamedocx = f"Акт{ACTnum}_АЗС{AZSnum}_ССО{SSOnum}.docx" docxpath = settings.get_local_acts_path_folder() + filenamedocx create_docx_file_from_bodylist(lst, AZSnum, SSOnum, ACTnum, nowdate, docxpath) create_pdf_file_from_docx(docxpath) copy_files_to_general_folder(filenamedocx)
def get_path_to_file_to_string(filename): return settings.get_local_acts_path_folder() + filename