• Смещение даты 2000?

    @abcd0x00
    >>> import datetime
    >>> 
    >>> date_time = datetime.datetime.now()
    >>> date_time_2000 = date_time.replace(year=date_time.year + 2000)
    >>> date_time.strftime("%Y-%m-%d %H:%M:%S")
    '2017-02-26 17:55:44'
    >>> date_time_2000.strftime("%Y-%m-%d %H:%M:%S")
    '4017-02-26 17:55:44'
    >>>
    Ответ написан
    Комментировать
  • Смещение даты 2000?

    aRegius
    @aRegius
    Python Enthusiast
    Если вы периодически сталкиваетесь с задачами подобного рода, установите библиотеку python-dateutil (это займет пару десятков секунд) и изгаляйтесь над датами как душе угодно, просто и очевидно.
    >>> from datetime import datetime
    >>> from dateutil.relativedelta import relativedelta
    >>> now = datetime.today()
    >>> print(now + relativedelta(years =+ 2000))
    4017-02-24 21:11:20.779300
    >>> print(now + relativedelta(months =+ 5))
    2017-07-24 21:11:20.779300
    Ответ написан
    2 комментария
  • Смещение даты 2000?

    longclaps
    @longclaps
    from datetime import datetime
    print(datetime.fromordinal((datetime.now().toordinal() + 730485)))
    print(datetime.fromtimestamp((datetime.now().timestamp() + 730485 * 86400)))
    Ответ написан
    1 комментарий
  • PyCharm - python исправления?

    oren
    @oren
    Frontend Dev, Бизнес-информатика
    Это декоратор для более удобного доступа к приватным атрибутам при инкапсуляции, по типу доступа к паблик атрибутам.
    Ответ написан
    1 комментарий
  • Python - кодировка cp866?

    @abcd0x00
    >>> "’®ав ЋЎ¦®аЄ  Љ®а®«м ‹Ґў".encode('cp1251').decode('cp866')
    'Торт Обжорк  Король Лев'
    >>>
    Ответ написан
    Комментировать
  • Python - кодировка cp866?

    sanya84
    @sanya84
    Фанатик Python 3
    Вот самый простой вариант.
    txt="Торт Обжорка Король Лев"
    b=bytes(txt,"cp1251")
    s=str(b,"cp866")
    print(s)
    b=bytes(s,"cp866")
    s=str(b,"cp1251")
    print(s)
    Ответ написан
    1 комментарий
  • Питон добавление в ComboBox?

    @Sergey6661313
    бла-бла-бла создавать comboBox как переменную создаваемого объекта OpenFile:
    class OpenFile(QtGui.QMainWindow):
        def __init__(self, parent=None):
          ...   ...   ...
          self.comboBox = QtGui.QComboBox(self)
          self.comboBox.setGeometry(QtCore.QRect(25, 55, 125, 25))
          self.comboBox.setObjectName(self.trUtf8("comboBox"))

    тогда в методе showDialog можно обратится к self.comboBox:

    for sName in wbr.sheet_names():
            sheetName.append(wbr.sheet_by_name(sName))
            self.comboBox.addItem(str(sName))


    бла-бла-бла узнать его индекс можно методом currentIndex()
    sheet = wbr.sheet_by_index(self.comboBox.currentIndex())


    бла-бла-бал отдельным методом бла-бла-бла.
    ____________________________________________________________________________________________
    дополнение к ответу:
    подытожим: мы уже заменили все comboBox на self.comboBox (вы ведь так сделали ?)
    убрали к (недружелюбное слово) sheetName и цикл его заполнения. (зачем он вам если у вас есть отличный comboBox?)
    так же сам wbr нам тоже придётся сделать "долгоиграющей" переменной (мы его будем использовать в нашем "отдельном" методе, поэтому потерять его будет катастрофой. )

    т.е довели метод def showDialog(self):
    до след. 3-х строчек:
    filename = QtGui.QFileDialog.getOpenFileName(self, 'Выбор файла', '*xls')
    self.wbr = xlrd.open_workbook(filename, formatting_info=True)
    self.comboBox.addItems(self.wbr.sheet_names())

    Что же делать со всем этим кодом ниже?
    ну можно сделать ещё одну кнопочку "писать_в_csv" и метод-слот для вашего кода.
    пример для связи кнопки и метода уже есть в вашем примере. нужно просто перед вашим кодом написать def вставте_суда_любое_название(self): и кнопку продублировать просто указать другое имя и другие координаты и там где connect поменять всё соответственно. И просто нажимать на кнопку после того как выберете лист.
    class OpenFile(QtGui.QMainWindow):
        def __init__(self, parent=None):
            QtGui.QMainWindow.__init__(self, parent)
            ...  ...  ...
    
            pButton2 = QtGui.QPushButton('записать в csv', self)
            pButton2.setGeometry(175, 55, 125, 25)
            self.connect(pButton2, QtCore.SIGNAL('clicked()'), self.slot_list_selected)
    
        def showDialog(self):
            filename = QtGui.QFileDialog.getOpenFileName(self, 'Выбор файла', '*xls')
            self.wbr = xlrd.open_workbook(filename, formatting_info=True)
            self.comboBox.addItems(self.wbr.sheet_names())
    
        def slot_list_selected(self):
            # //////////////////Индекс листа///////////////////////
            sheet = self.wbr.sheet_by_index(self.comboBox.currentIndex())
    
            ... ... ...


    Но мы же не ищем легких путей ведь так?
    + мы хотим познакомится с QT поближе.
    наш тру вариант без участия дополнительной кнопки:
    метод я назвал slot_list_selected. и мы его соединим непосредственно с сигналом изменения combobox-а так:
    self.comboBox.currentIndexChanged.connect(self.slot_list_selected) - это альтернативный более коротки метод связывания сигналов и слотов (чем self.connect(self.comboBox, QtCore.SIGNAL('currentIndexChanged(int)'), self.slot_list_selected) )
    но есть запарка - сигнал не только вызывает метод но и передает ему int (выбранный индекс). Значит наш слот-метод должен его принимать.
    def slot_list_selected(self, list_index):
    ну и так как он нам всё равно передается мы могли бы его сразу использовать.
    заместо sheet = self.wbr.sheet_by_index(self.comboBox.currentIndex())
    sheet = self.wbr.sheet_by_index(list_index)
    в принципе дальше ваш магический код вроде прекрасно работает. но он будет вызыватся в момент когда мы заполняем наш comboBox (изначально пустой combo показывает "-1", а когда заполняем его значение становится "0" что вызывает сигнал currentIndexChanged)
    это решается выключением сигналов коммандой self.comboBox.blockSignals(True)
    Но и тут вылезут подводные камни: в частности по умолчанию выберется первый элемент(с индексом 0) и попытавшись его выбрать индекс не изменится.
    тут опять 2 выхода:
    1) сделать первым итемом не имя листа а свой собственный. (если его ещё и назвать "выберите лист", то это будет служить дополнительной подсказкой для пользователя.)

    переписываем self.comboBox.addItems(self.wbr.sheet_names()) на
    self.comboBox.addItems(["выберите лист"] + self.wbr.sheet_names())
    т.к. индексы сместились то и sheet вычисляем с индексом -1:
    sheet = self.wbr.sheet_by_index(list_index-1)
    и придется делать проверку на то что list_index больше нуля. (мы же не хотим читать лист под номером "-1")
    if list_index:
    ваш код.

    вдоволь наигравшись с вашей программой замечаем что comboBox при выборе фаила заполняется но при этом не стирает предыдущие значения.
    исправляем добавляя перед additems
    self.comboBox.clear()

    вроде бы всё хорошо.

    2) более простой способ:
    просто использовать сигнал activated вместо currentIndexChanged тогда оно будет реагировать даже на выбор уже выбранного. Но я всё равно рекомендую проделать операции из первого способа.

    Суммарный код:
    class OpenFile(QtGui.QMainWindow):
        def __init__(self, parent=None):
            QtGui.QMainWindow.__init__(self, parent)
            self.setGeometry(300, 300, 325, 100)
            self.setWindowTitle(self.trUtf8('Выбор файла'))
            self.setWindowIcon(QtGui.QIcon('imageformats\icon.jpeg'))
    
            pButton = QtGui.QPushButton('Открыть файл', self)
            pButton.setGeometry(25, 15, 125, 25)
            self.connect(pButton, QtCore.SIGNAL('clicked()'), self.showDialog)
    
            quit = QtGui.QPushButton('Выход', self)
            quit.setGeometry(175, 15, 125, 25)
            self.connect(quit, QtCore.SIGNAL('clicked()'),
                         QtGui.qApp, QtCore.SLOT('quit()'))
    
            self.comboBox = QtGui.QComboBox(self)
            self.comboBox.setGeometry(QtCore.QRect(25, 55, 125, 25))
            self.comboBox.setObjectName(self.trUtf8("comboBox"))
            self.comboBox.activated.connect(self.slot_list_selected)
    
        def showDialog(self):
            filename = QtGui.QFileDialog.getOpenFileName(self, 'Выбор файла', '*xls')
            self.wbr = xlrd.open_workbook(filename, formatting_info=True)
            self.comboBox.blockSignals(True)
            self.comboBox.clear()
            self.comboBox.addItems(["выберите лист"] + self.wbr.sheet_names())
            self.comboBox.blockSignals(False)
    
    
        def slot_list_selected(self, list_index):
            if list_index:
                # //////////////////Индекс листа///////////////////////
                sheet = self.wbr.sheet_by_index(list_index-1)
                print(list_index)
        
                vals = []
                i = 0
                a = 0
        
                for rows in range(sheet.nrows):
                    vals.append(sheet.row_values(rows))
        
                # /////////////Удаляем из массива шапку Промоактивности//////////////
                for a in range(4):
                    del vals[0]
                    a = +1
        
                file_csv = open('C:\promo.csv', 'w')
        
                for i in range(sheet.nrows - 4):
                    stroka_0 = str(vals[i]).replace('[', '')
                    stroka_1 = stroka_0.replace(',', ';')
                    stroka_2 = stroka_1.replace(']', '')
                    stroka_3 = stroka_2.replace(' ', '')
                    stroka_4 = stroka_3.replace("'", '')
                    stroka_5 = stroka_4.replace(".0", '')
                    file_csv.write(stroka_5 + "\n")
                    i = +1
        
                file_csv.close()
    Ответ написан
    2 комментария