Example #1
0
    def __init__(self, parent=None):
        super(MainWin, self).__init__(parent)

        dt_ed = QDateTimeEdit(self)
        dt_ed2 = QDateTimeEdit(QDateTime.currentDateTime(), self)
        d_ed = QDateTimeEdit(QDate.currentDate(), self)
        t_ed = QDateTimeEdit(QTime.currentTime(), self)

        dt_ed.setDisplayFormat('yyyy-MM-dd HH:mm:ss')
        dt_ed2.setDisplayFormat('yyyy/MM/dd HH-mm-ss')
        d_ed.setDisplayFormat('yyyy.MM.dd')
        t_ed.setDisplayFormat('HH:mm:ss')

        dt_ed.setMinimumDate(QDate.currentDate().addDays(-365))
        dt_ed.setMaximumDate(QDate.currentDate().addDays(365))

        dt_ed.setCalendarPopup(True)

        layout = QVBoxLayout(self)
        layout.addWidget(dt_ed)
        layout.addWidget(dt_ed2)
        layout.addWidget(d_ed)
        layout.addWidget(t_ed)

        self.setGeometry(100, 100, 250, 150)
        self.setWindowTitle('DateTimeEdit')
Example #2
0
    def initUI(self):
        self.setWindowTitle('不同风格的日期格式')
        layout = QVBoxLayout()
        datetime1 = QDateTimeEdit(QDateTime.currentDateTime())
        datetime2 = QDateTimeEdit(QDateTime.currentDateTime())
        date = QDateTimeEdit(QDate.currentDate())
        time = QDateTimeEdit(QTime.currentTime())
        # 设置最大最小日期时间、下拉日期
        datetime1.setMaximumDate(QDate.currentDate().addDays(365))
        datetime1.setMinimumDate(QDate.currentDate().addDays(-365))
        datetime1.setCalendarPopup(True)

        datetime1.setDisplayFormat('yyyy-MM-dd HH:mm:ss')
        datetime2.setDisplayFormat('yyyy/MM/dd HH-mm-ss')
        date.setDisplayFormat('yyyy-MM-dd')
        time.setDisplayFormat('HH:mm:ss')

        # 为信号设置槽
        self.datetime1 = datetime1
        datetime1.dateTimeChanged.connect(self.ChangeDateTime)
        datetime2.dateChanged.connect(self.ChangeDate)

        self.btn = QPushButton('点击获取时间')
        self.btn.clicked.connect(self.Onclick_Button)
        layout.addWidget(datetime1)
        layout.addWidget(datetime2)
        layout.addWidget(date)
        layout.addWidget(time)
        layout.addWidget(self.btn)

        self.setLayout(layout)
    def createEditor(self, parent, option, index):
        """
        Crée le widget utilisé pour éditer la valeur d'une cellule
        
        Retourne un widget "vierge", i.e. ce n'est pas ici qu'on initialise la valeur du widget.
        En revanche, c'est ici qu'on peut définir les valeurs min/max acceptées, etc.

        https://doc.qt.io/qt-5/model-view-programming.html#providing-an-editor
        """
        editor = QDateTimeEdit(parent=parent)

        editor.setMinimumDate(
            datetime.datetime(year=2017, month=9, day=1, hour=8, minute=30))
        editor.setMaximumDate(
            datetime.datetime(year=2030, month=9, day=1, hour=18, minute=30))
        editor.setDisplayFormat("yyyy-MM-dd HH:mm")
        #editor.setCalendarPopup(True)

        # setFrame(): tell whether the line edit draws itself with a frame.
        # If enabled (the default) the line edit draws itself inside a frame, otherwise the line edit draws itself without any frame.
        editor.setFrame(False)

        action = QAction(editor)  # <-
        action.setShortcut(Qt.CTRL | Qt.Key_Delete)  # <-
        #action.setShortcut(Qt.Key_Delete)     # the keyevent for the suppr key is already catched by the editor thus it doesn't work...

        action.triggered.connect(
            lambda: self.deleteActionCallback(editor, index))  # <-
        editor.addAction(action)  # <-

        return editor
    def createEditor(self, parent, option, index):
        editor = QDateTimeEdit(parent=parent)

        editor.setMinimumDate(datetime.datetime(year=2017, month=9, day=1, hour=8, minute=30))
        editor.setMaximumDate(datetime.datetime(year=2020, month=9, day=1, hour=18, minute=30))
        editor.setDisplayFormat("yyyy-MM-dd HH:mm:ss")
        #editor.setCalendarPopup(True)

        # setFrame(): tell whether the line edit draws itself with a frame.
        # If enabled (the default) the line edit draws itself inside a frame, otherwise the line edit draws itself without any frame.
        editor.setFrame(False)

        return editor
Example #5
0
class MainWin(QWidget):
    def __init__(self, parent=None):
        super(MainWin, self).__init__(parent)

        layout = QVBoxLayout(self)

        self.dateEdit = QDateTimeEdit(QDateTime.currentDateTime(), self)
        self.dateEdit.setDisplayFormat('yyyy-MM-dd HH:mm:ss')
        self.dateEdit.setMinimumDate(QDate.currentDate().addDays(-365))
        self.dateEdit.setMaximumDate(QDate.currentDate().addDays(365))
        self.dateEdit.setCalendarPopup(True)

        self.dateEdit.dateChanged.connect(self.onDateChanged)
        self.dateEdit.dateTimeChanged.connect(self.onDateTimeChanged)
        self.dateEdit.timeChanged.connect(self.onTimeChanged)

        self.btn = QPushButton('取得日期和時間')
        self.btn.clicked.connect(self.onButtonClick)

        layout.addWidget(self.dateEdit)
        layout.addWidget(self.btn)

        self.resize(300, 90)
        self.setWindowTitle('DateTimeEdit2')

    def onDateChanged(self, date):
        print(date)

    def onDateTimeChanged(self, dateTime):
        print(dateTime)

    def onTimeChanged(self, time):
        print(time)

    def onButtonClick(self):
        dateTime = self.dateEdit.dateTime()
        maxDate = self.dateEdit.maximumDate()
        maxDateTime = self.dateEdit.maximumDateTime()
        maxTime = self.dateEdit.maximumTime()
        minDate = self.dateEdit.minimumDate()
        minDateTime = self.dateEdit.minimumDateTime()
        minTime = self.dateEdit.minimumTime()
        print('\n選擇的日期時間')
        print('dateTime = %s')
        print('maxDate = %s' % str(maxDate))
        print('maxDateTime = %s' % str(maxDateTime))
        print('maxTime = %s' % str(maxTime))
        print('minDate = %s' % str(minDate))
        print('minDateTime = %s' % str(minDateTime))
        print('minTime = %s' % str(minTime))
    def createEditor(self, parent, option, index):
        editor = QDateTimeEdit(parent=parent)

        editor.setMinimumDate(
            datetime.datetime(year=2017, month=9, day=1, hour=8, minute=30))
        editor.setMaximumDate(
            datetime.datetime(year=2020, month=9, day=1, hour=18, minute=30))
        editor.setDisplayFormat("yyyy-MM-dd HH:mm:ss")
        #editor.setCalendarPopup(True)

        # setFrame(): tell whether the line edit draws itself with a frame.
        # If enabled (the default) the line edit draws itself inside a frame, otherwise the line edit draws itself without any frame.
        editor.setFrame(False)

        return editor
    def createEditor(self, parent, option, index):
        """
        Crée le widget utilisé pour éditer la valeur d'une cellule
        
        Retourne un widget "vierge", i.e. ce n'est pas ici qu'on initialise la valeur du widget.
        En revanche, c'est ici qu'on peut définir les valeurs min/max acceptées, etc.

        https://doc.qt.io/qt-5/model-view-programming.html#providing-an-editor
        """
        editor = QDateTimeEdit(parent=parent)

        editor.setMinimumDate(
            datetime.datetime(year=2017, month=9, day=1, hour=8, minute=30))
        editor.setMaximumDate(
            datetime.datetime(year=2030, month=9, day=1, hour=18, minute=30))
        editor.setDisplayFormat("yyyy-MM-dd HH:mm")
        #editor.setCalendarPopup(True)

        # setFrame(): tell whether the line edit draws itself with a frame.
        # If enabled (the default) the line edit draws itself inside a frame, otherwise the line edit draws itself without any frame.
        editor.setFrame(False)

        return editor
class Window(QWidget):

    def __init__(self):
        super().__init__()

        # Make widgets #################

        self.edit1 = QDateTimeEdit()
        self.edit2 = QDateTimeEdit()
        self.edit3 = QDateTimeEdit()

        self.edit1.setMinimumDate(datetime.datetime(year=2017, month=9, day=1, hour=8, minute=30, second=30))
        self.edit2.setMinimumDate(datetime.datetime(year=2017, month=9, day=1, hour=8, minute=30, second=30))
        self.edit3.setMinimumDate(datetime.datetime(year=2017, month=9, day=1, hour=8, minute=30, second=30))

        self.edit1.setMaximumDate(datetime.datetime(year=2020, month=9, day=1, hour=18, minute=30, second=30))
        self.edit2.setMaximumDate(datetime.datetime(year=2020, month=9, day=1, hour=18, minute=30, second=30))
        self.edit3.setMaximumDate(datetime.datetime(year=2020, month=9, day=1, hour=18, minute=30, second=30))

        self.edit1.setDateTime(datetime.datetime.now())
        self.edit2.setDateTime(datetime.datetime.now())
        self.edit3.setDateTime(datetime.datetime.now())

        #self.edit1.setCalendarPopup(True)
        #self.edit2.setCalendarPopup(True)
        #self.edit3.setCalendarPopup(True)

        # Format: see http://doc.qt.io/qt-5/qdatetime.html#toString-2
        self.edit1.setDisplayFormat("yyyy-MM-dd HH:mm")
        self.edit2.setDisplayFormat("dd/MM/yyyy HH:mm:ss t")
        self.edit3.setDisplayFormat("dddd d MMMM yyyy h m AP")

        self.btn = QPushButton("Print")

        # Set button slot ##############

        self.btn.clicked.connect(self.printText)

        # Set the layout ###############

        vbox = QVBoxLayout()

        vbox.addWidget(self.edit1)
        vbox.addWidget(self.edit2)
        vbox.addWidget(self.edit3)

        vbox.addWidget(self.btn)

        self.setLayout(vbox)

    def printText(self):
        print(self.edit1.text())
        print(self.edit2.text())
        print(self.edit3.text())
class Window(QWidget):

    def __init__(self):
        super().__init__()

        # Make widgets #################

        self.edit1 = QDateTimeEdit()
        self.edit2 = QDateTimeEdit()
        self.edit3 = QDateTimeEdit()

        self.edit1.setMinimumDate(datetime.datetime(year=2017, month=9, day=1, hour=8, minute=30, second=30))
        self.edit2.setMinimumDate(datetime.datetime(year=2017, month=9, day=1, hour=8, minute=30, second=30))
        self.edit3.setMinimumDate(datetime.datetime(year=2017, month=9, day=1, hour=8, minute=30, second=30))

        self.edit1.setMaximumDate(datetime.datetime(year=2020, month=9, day=1, hour=18, minute=30, second=30))
        self.edit2.setMaximumDate(datetime.datetime(year=2020, month=9, day=1, hour=18, minute=30, second=30))
        self.edit3.setMaximumDate(datetime.datetime(year=2020, month=9, day=1, hour=18, minute=30, second=30))

        self.edit1.setDateTime(datetime.datetime.now())
        self.edit2.setDateTime(datetime.datetime.now())
        self.edit3.setDateTime(datetime.datetime.now())

        self.edit1.setCalendarPopup(True)
        self.edit2.setCalendarPopup(True)
        self.edit3.setCalendarPopup(True)

        # Format: see http://doc.qt.io/qt-5/qdatetime.html#toString-2
        self.edit1.setDisplayFormat("yyyy-MM-dd HH:mm")
        self.edit2.setDisplayFormat("dd/MM/yyyy HH:mm:ss t")
        self.edit3.setDisplayFormat("dddd d MMMM yyyy h m AP")

        self.btn = QPushButton("Print")

        # Set button slot ##############

        self.btn.clicked.connect(self.printText)

        # Set the layout ###############

        vbox = QVBoxLayout()

        vbox.addWidget(self.edit1)
        vbox.addWidget(self.edit2)
        vbox.addWidget(self.edit3)

        vbox.addWidget(self.btn)

        self.setLayout(vbox)

    def printText(self):
        print(self.edit1.text())
        print(self.edit2.text())
        print(self.edit3.text())
Example #10
0
class DateTimeDialog(QDialog):
    """Dialog to specify time in the recordings, either as seconds from the
    start of the recordings or absolute time.

    Parameters
    ----------
    title : str
        'Lights out' or 'Lights on'
    start_time : datetime
        absolute start time of the recordings
    dur : int
        total duration of the recordings

    Notes
    -----
    The value of interest is in self.idx_seconds.value(), which is seconds
    from the start of the recordings.
    """
    def __init__(self, title, start_time, dur):
        super().__init__()

        self.start_time = start_time
        self.dur = dur
        end_time = start_time + timedelta(seconds=dur)

        self.setWindowTitle(title)

        bbox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
        self.idx_ok = bbox.button(QDialogButtonBox.Ok)
        self.idx_cancel = bbox.button(QDialogButtonBox.Cancel)

        bbox.clicked.connect(self.button_clicked)

        self.idx_seconds = QSpinBox()
        self.idx_seconds.setMinimum(0)
        self.idx_seconds.setMaximum(dur)
        self.idx_seconds.valueChanged.connect(self.changed_spin)

        self.idx_datetime = QDateTimeEdit(start_time)
        self.idx_datetime.setMinimumDate(start_time)
        self.idx_datetime.setMaximumDate(end_time)
        self.idx_datetime.setDisplayFormat('dd-MMM-yyyy HH:mm:ss')
        self.idx_datetime.dateTimeChanged.connect(self.changed_datetime)

        layout = QFormLayout()
        layout.addRow('', QLabel('Enter ' + title + ' time'))
        layout.addRow('Seconds from recording start', self.idx_seconds)
        layout.addRow('Absolute time', self.idx_datetime)
        layout.addRow(bbox)

        self.setLayout(layout)

    def button_clicked(self, button):
        if button == self.idx_ok:
            self.accept()

        elif button == self.idx_cancel:
            self.reject()

    def changed_spin(self, i):
        self.idx_datetime.blockSignals(True)
        self.idx_datetime.setDateTime(self.start_time + timedelta(seconds=i))
        self.idx_datetime.blockSignals(False)

    def changed_datetime(self, dt):
        val = (dt.toPyDateTime() - self.start_time).total_seconds()

        if val < 0 or val >= self.dur:
            val = min(self.dur, max(val, 0))
            self.changed_spin(val)

        self.idx_seconds.blockSignals(True)
        self.idx_seconds.setValue(val)
        self.idx_seconds.blockSignals(False)
Example #11
0
class BRFManager(myqt.QFrameLayout):
    def __init__(self, wldset=None, parent=None):
        super(BRFManager, self).__init__(parent)

        self.viewer = BRFViewer(wldset, parent)
        self.kgs_brf_installer = None
        self.__initGUI__()

    def __initGUI__(self):
        self.setContentsMargins(10, 10, 10, 10)

        self._bplag = {}
        self._bplag['label'] = QLabel('BP Lags Nbr:')
        self._bplag['widget'] = myqt.QDoubleSpinBox(100, 0)
        self._bplag['widget'].setRange(1, 9999)
        self._bplag['widget'].setValue(300)
        self._bplag['widget'].setKeyboardTracking(True)

        self._etlag = {}
        self._etlag['label'] = QLabel('ET Lags Nbr:')
        self._etlag['widget'] = myqt.QDoubleSpinBox(300, 0)
        self._etlag['widget'].setRange(-1, 9999)
        self._etlag['widget'].setValue(300)
        self._etlag['widget'].setKeyboardTracking(True)

        # ---- BRF Data Range ----

        self._datastart = QDateTimeEdit()
        self._datastart.setCalendarPopup(True)
        self._datastart.setDisplayFormat('dd/MM/yyyy')

        self._dataend = QDateTimeEdit()
        self._dataend.setCalendarPopup(True)
        self._dataend.setDisplayFormat('dd/MM/yyyy')

        self.btn_seldata = QToolButtonSmall(icons.get_icon('select_range'))
        self.btn_seldata.clicked.connect(self.get_datarange)

        # ---- Detrend and Correct Options ----

        self._detrend = QCheckBox('Detrend')
        self._detrend.setCheckState(Qt.Checked)

        self._correct = QCheckBox('Correct WL')
        self._correct.setEnabled(False)

        # ---- Toolbar

        btn_comp = QPushButton('Compute BRF')
        btn_comp.clicked.connect(self.calc_brf)
        btn_comp.setFocusPolicy(Qt.NoFocus)

        self.btn_show = btn_show = QToolButtonSmall(icons.get_icon('search'))
        btn_show.clicked.connect(self.viewer.show)

        # Layout

        tbar = myqt.QFrameLayout()
        tbar.addWidget(btn_comp, 0, 0)
        tbar.addWidget(btn_show, 0, 1)
        tbar.setColumnStretch(0, 100)

        # ---- Main Layout

        row = 0
        self.addWidget(self._bplag['label'], row, 0)
        self.addWidget(self._bplag['widget'], row, 1)
        row += 1
        self.addWidget(self._etlag['label'], row, 0)
        self.addWidget(self._etlag['widget'], row, 1)
        row += 1
        self.setRowMinimumHeight(row, 15)
        row += 1
        self.addWidget(QLabel('BRF Start :'), row, 0)
        self.addWidget(self._datastart, row, 1)
        self.addWidget(self.btn_seldata, row, 2)
        row += 1
        self.addWidget(QLabel('BRF End :'), row, 0)
        self.addWidget(self._dataend, row, 1)
        row += 1
        self.setRowMinimumHeight(row, 15)
        row += 1
        self.addWidget(self._detrend, row, 0, 1, 2)
        row += 1
        self.addWidget(self._correct, row, 0, 1, 2)
        row += 1
        self.setRowMinimumHeight(row, 5)
        self.setRowStretch(row, 100)
        row += 1
        self.addWidget(tbar, row, 0, 1, 3)

        self.setColumnStretch(self.columnCount(), 100)

        # ---- Install Panel

        if not KGSBRFInstaller().kgsbrf_is_installed():
            self.__install_kgs_brf_installer()

    # ---- Properties

    @property
    def lagBP(self):
        return self._bplag['widget'].value()

    @property
    def lagET(self):
        return self._etlag['widget'].value()

    @property
    def detrend(self):
        if self._detrend.checkState():
            return 'Yes'
        else:
            return 'No'

    @property
    def correct_WL(self):
        return 'No'

    @property
    def brfperiod(self):
        y, m, d = self._datastart.date().getDate()
        dstart = xldate_from_date_tuple((y, m, d), 0)

        y, m, d = self._dataend.date().getDate()
        dend = xldate_from_date_tuple((y, m, d), 0)

        return (dstart, dend)

    # ---- KGS BRF installer

    def __install_kgs_brf_installer(self):
        """
        Installs a KGSBRFInstaller that overlays the whole brf tool
        layout until the KGS_BRF program is installed correctly.
        """
        self.kgs_brf_installer = KGSBRFInstaller()
        self.kgs_brf_installer.sig_kgs_brf_installed.connect(
            self.__uninstall_kgs_brf_installer)
        self.addWidget(self.kgs_brf_installer, 0, 0, self.rowCount(),
                       self.columnCount())

    def __uninstall_kgs_brf_installer(self):
        """
        Uninstall the KGSBRFInstaller after the KGS_BRF program has been
        installed properly.
        """
        self.kgs_brf_installer.sig_kgs_brf_installed.disconnect()
        self.kgs_brf_installer = None

    def set_wldset(self, wldset):
        """Set the namespace for the wldset in the widget."""
        self.wldset = wldset
        self.viewer.set_wldset(wldset)
        self.setEnabled(wldset is not None)
        if wldset is not None:
            date_start, date_end = self.set_datarange(
                self.wldset['Time'][[0, -1]])
            self._datastart.setMinimumDate(date_start)
            self._dataend.setMaximumDate(date_end)

    def get_datarange(self):
        child = self
        while True:
            try:
                child.parent().raise_()
            except Exception:
                break
            else:
                child = child.parent()

    def set_datarange(self, times):
        date_start = xldate_as_tuple(times[0], 0)
        date_start = QDate(date_start[0], date_start[1], date_start[2])
        self._datastart.setDate(date_start)

        date_end = xldate_as_tuple(times[1], 0)
        date_end = QDate(date_end[0], date_end[1], date_end[2])
        self._dataend.setDate(date_end)

        return date_start, date_end

    def calc_brf(self):
        """Prepare the data, calcul the brf, and save and plot the results."""

        # Prepare the datasets.

        well = self.wldset['Well']

        t1 = min(self.brfperiod)
        i1 = np.where(self.wldset['Time'] >= t1)[0][0]

        t2 = max(self.brfperiod)
        i2 = np.where(self.wldset['Time'] <= t2)[0][-1]

        time = np.copy(self.wldset['Time'][i1:i2 + 1])
        wl = np.copy(self.wldset['WL'][i1:i2 + 1])
        bp = np.copy(self.wldset['BP'][i1:i2 + 1])
        if len(bp) == 0:
            msg = ("The barometric response function cannot be computed"
                   " because the currently selected water level dataset does"
                   " not contain any barometric data for the selected period.")
            QMessageBox.warning(self, 'Warning', msg, QMessageBox.Ok)
            return
        et = np.copy(self.wldset['ET'][i1:i2 + 1])
        if len(et) == 0:
            et = np.zeros(len(wl))

        lagBP = self.lagBP
        lagET = self.lagET
        detrend = self.detrend
        correct = self.correct_WL

        # Fill the gaps in the dataset.

        dt = np.min(np.diff(time))
        tc = np.arange(t1, t2 + dt / 2, dt)
        if len(tc) != len(time):
            print('Filling gaps in data with linear interpolation.')
            indx = np.where(~np.isnan(wl))[0]
            wl = np.interp(tc, time[indx], wl[indx])

            indx = np.where(~np.isnan(bp))[0]
            bp = np.interp(tc, time[indx], bp[indx])

            indx = np.where(~np.isnan(et))[0]
            et = np.interp(tc, time[indx], et[indx])

            time = tc

        QApplication.setOverrideCursor(Qt.WaitCursor)
        print('calculating BRF')

        bm.produce_BRFInputtxt(well, time, wl, bp, et)
        msg = 'Not enough data. Try enlarging the selected period'
        msg += ' or reduce the number of BP and ET lags.'
        if lagBP >= len(time) or lagET >= len(time):
            QApplication.restoreOverrideCursor()
            QMessageBox.warning(self, 'Warning', msg, QMessageBox.Ok)
            return

        bm.produce_par_file(lagBP, lagET, detrend, correct)
        bm.run_kgsbrf()

        try:
            lag, A, err = bm.read_BRFOutput()
            date_start = self._datastart.date().getDate()
            date_end = self._dataend.date().getDate()
            self.wldset.save_brf(lag, A, err, date_start, date_end)
            self.viewer.new_brf_added()
            self.viewer.show()
            QApplication.restoreOverrideCursor()
        except Exception:
            QApplication.restoreOverrideCursor()
            QMessageBox.warning(self, 'Warning', msg, QMessageBox.Ok)
            return
Example #12
0
class ImportWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.init_gui()

    def read_sheet(self, file_data, sheet_name):
        self.model.clear()
        for row in file_data[sheet_name]:
            items = [QStandardItem(str(field)) for field in row]
            self.model.appendRow(items)

    def open_filename(self):
        filename = QFileDialog.getOpenFileName(
            self, self.tr("Abrir archivo"), "/home/luciano",
            self.tr("Hojas de Cálculo (*.ods)"))
        if filename[0] != "":
            self._enable_widgets(True)
            self.file_data = get_data(filename[0])
            for key in self.file_data.keys():
                self.cmb_ods_sheets.addItem(key)
            self.read_sheet(self.file_data, list(self.file_data.keys())[0])

    def import_expenses(self):
        try:
            row = int(self.le_initial_row.text()) - 1
            description_col = int(self.le_description_col.text()) - 1
            date_col = int(self.le_date_col.text()) - 1
            default_date = self.default_date.date()
            date_format = self.le_date_format.text()
            percent = 1.0 / len(list(self.current_group.getMembers()))
            while self.model.item(row) is not None:
                print("Row ", row)

                expense = Expense()
                expense.setDescription(
                    self.model.item(row, description_col).text())
                print("Expense: ", expense.getDescription())
                date = QDate.fromString(
                    self.model.item(row, date_col).text(), date_format)
                if not date.isValid():
                    date = default_date
                expense.setDate(date.toString(Qt.ISODate))
                print("Date: ", expense.getDate())

                cost = 0
                users = []
                for member in self.current_group.getMembers():
                    print("Processing member ", member.getFirstName())
                    member_column = int(
                        self.member_widget_map[member.getId()].text()) - 1
                    paid = 0
                    try:
                        paid = float(
                            self.model.item(row, member_column).text())
                        print("Expense: ",
                              self.model.item(row, member_column).text())
                    except:
                        pass
                    cost = cost + paid
                    expense_user = ExpenseUser()
                    expense_user.setId(member.getId())
                    expense_user.setPaidShare(str(paid))
                    users.append(expense_user)
                for expense_user in users:
                    expense_user.setOwedShare(str(cost * percent))
                if cost == 0:
                    raise Exception(
                        self.tr('No se ha introducido monto para el gasto'))
                expense.setCost(str(cost))
                expense.setUsers(users)
                expense.setGroupId(self.current_group.id)
                self.sObj.createExpense(expense)
                row = row + 1
                self.le_initial_row.setText(str(row + 1))
        except Exception as inst:
            QMessageBox.critical(
                self, self.tr("Error"),
                self.tr("Se ha producido un error en la fila") + str(row + 1) +
                "\n" + str(inst))
            traceback.print_exc()

    def _enable_widgets(self, state):
        self.le_initial_row.setEnabled(state)
        self.cmb_group.setEnabled(state)
        self.cmb_ods_sheets.setEnabled(state)
        self.le_date_col.setEnabled(state)
        self.default_date.setEnabled(state)
        self.le_description_col.setEnabled(state)
        self.btn_import.setEnabled(state)
        self.le_date_format.setEnabled(state)

    def sheet_changed(self, sheet_name):
        self.read_sheet(self.file_data, sheet_name)

    def current_group_changed(self, idx):
        item = self.vlayout.takeAt(1)
        item.layout().deleteLater()
        item.invalidate()
        item = None
        self.vlayout.invalidate()
        self.group_members_layout = QFormLayout()
        self.current_group = self.cmb_group.itemData(idx)
        column_number = 1
        self.member_widget_map = {}
        for member in self.current_group.getMembers():
            self.member_widget_map[member.getId()] = QLineEdit(
                str(column_number))
            self.group_members_layout.addRow(
                self.tr("Columna " + member.getFirstName()),
                self.member_widget_map[member.getId()])
            column_number = column_number + 1
        self.vlayout.insertLayout(1, self.group_members_layout)

    def init_gui(self):
        self.form_layout = QFormLayout()
        self.cmb_ods_sheets = QComboBox()
        self.le_initial_row = QLineEdit("1")
        self.le_initial_row.setValidator(QIntValidator(1, 99999))
        self.cmb_group = QComboBox()
        self.le_date_col = QLineEdit("1")
        self.le_date_col.setValidator(QIntValidator(1, 999999))
        self.default_date = QDateTimeEdit(QDate.currentDate())
        self.default_date.setMinimumDate(QDate.currentDate().addDays(-365))
        self.default_date.setMaximumDate(QDate.currentDate().addDays(365))
        self.default_date.setDisplayFormat("dd.MM.yyyy")
        self.default_date.setCalendarPopup(True)
        self.le_date_format = QLineEdit("d/M/yyyy")

        self.le_description_col = QLineEdit("2")
        self.le_description_col.setValidator(QIntValidator(1, 9999))
        self.sObj = get_splitwise()
        groups = self.sObj.getGroups()

        self.cmb_ods_sheets.currentTextChanged.connect(self.sheet_changed)
        for group in groups:
            self.cmb_group.addItem(group.getName(), group)
        self.cmb_group.currentIndexChanged.connect(self.current_group_changed)
        self.cmb_group.setCurrentIndex(0)
        btn_open_filename = QPushButton("Open")
        btn_open_filename.clicked.connect(self.open_filename)
        self.form_layout.addRow(self.tr("Archivo"), btn_open_filename)
        self.form_layout.addRow(self.tr("Hoja"), self.cmb_ods_sheets)
        self.form_layout.addRow(self.tr("Grupos"), self.cmb_group)
        self.form_layout.addRow(self.tr("Fila Inicial"), self.le_initial_row)
        self.form_layout.addRow(self.tr("Columna Fecha"), self.le_date_col)
        self.form_layout.addRow(self.tr("Formato de fecha"),
                                self.le_date_format)
        self.form_layout.addRow(self.tr("Fecha por defecto"),
                                self.default_date)
        self.form_layout.addRow(self.tr("Columna Concepto"),
                                self.le_description_col)

        self.group_members_layout = QFormLayout()

        self.btn_import = QPushButton(self.tr("Importar"))
        self.btn_import.clicked.connect(self.import_expenses)

        self.model = QStandardItemModel(self)
        tableView = QTableView(self)
        tableView.setModel(self.model)

        self.vlayout = QVBoxLayout()
        self.vlayout.addLayout(self.form_layout)
        self.vlayout.addLayout(self.group_members_layout)
        self.vlayout.addWidget(self.btn_import)
        self.vlayout.setStretch(1, 1)

        hlayout = QHBoxLayout()
        hlayout.addWidget(tableView)
        hlayout.addLayout(self.vlayout)

        hlayout.setStretch(1, 0)
        hlayout.setStretch(0, 1)
        self.setLayout(hlayout)
        self._enable_widgets(False)
        self.show()
Example #13
0
class ri(QWidget):  #日报table框组建
    def __init__(self, config, parent=None):
        super(ri, self).__init__(parent)
        self.workThread = WorkThread()  #多线程
        self.workThread.sinOut.connect(self.setp)  #多线程链接信号输出
        layout = QGridLayout()  #创建一个表格排列

        self.sheetbox = QGroupBox("表名")
        self.sheetbox_lo = QGridLayout()
        self.sheetbox.setLayout(self.sheetbox_lo)
        self.rp_config = QGroupBox("日报配置")
        self.rp_config_lo = QGridLayout()
        self.rp_config.setLayout(self.rp_config_lo)
        layout.addWidget(self.sheetbox, 0, 0)
        layout.addWidget(self.rp_config, 1, 0)

        self.fileName1 = ''
        ###############第一行 文件选择框
        ########
        self.rp_config_lo.addWidget(QLabel('报表文件', self.rp_config), 0, 0)
        self.qtfile = QLineEdit('', self.rp_config)
        self.qtfile.insert(config['sheet_day']['filename'] if 'filename' in
                           config['sheet_day'].keys() else '')
        self.qtfile.editingFinished.connect(self.creatsheetCheckBox)
        self.qbfile = QPushButton('选择文件', self.rp_config)
        self.qbfile.clicked.connect(self.button_click)
        self.qbfile.setEnabled(True)
        self.rp_config_lo.addWidget(self.qtfile, 0, 1, 1, 6)
        self.rp_config_lo.addWidget(self.qbfile, 0, 7)
        ######################第二行################################################
        self.rp_config_lo.addWidget(QLabel('规则行', self.rp_config), 1, 0)
        self.gzh = QLineEdit('', self.rp_config)
        self.gzh.insert(config['sheet_day']['gzh'])
        self.gzh.setFixedWidth(40)
        self.rp_config_lo.addWidget(QLabel('时间列', self.rp_config), 1, 2)
        self.sjl = QLineEdit('', self.rp_config)
        self.sjl.insert(config['sheet_day']['sjl'])
        self.sjl.setFixedWidth(40)
        self.rp_config_lo.addWidget(QLabel('BMS厂家', self.rp_config), 1, 4)
        jslist = ['共济', '中联', '栅格']
        self.jsComboBox = QComboBox(self.rp_config)  #下拉菜单
        for i in jslist:
            self.jsComboBox.addItem(i)
        self.jsComboBox.setCurrentIndex(int(config['sheet_day']['cj']))
        self.rp_config_lo.addWidget(QLabel('模式', self.rp_config), 1, 6)
        jslist2 = ['0--寻找日期', '1--最后填充']
        self.js2ComboBox = QComboBox(self.rp_config)  #下拉菜单
        for i in jslist2:
            self.js2ComboBox.addItem(i)
        self.js2ComboBox.setCurrentIndex(int(config['sheet_day']['mode']))
        self.rp_config_lo.addWidget(self.gzh, 1, 1)
        self.rp_config_lo.addWidget(self.sjl, 1, 3)
        self.rp_config_lo.addWidget(self.jsComboBox, 1, 5)
        self.rp_config_lo.addWidget(self.js2ComboBox, 1, 7)
        ######################第三行时间选择行#############################
        self.rp_config_lo.addWidget(QLabel('起始时间', self.rp_config), 2, 0)
        self.dt1 = QDateTimeEdit(QDate.currentDate(),
                                 self.rp_config)  # 创建日期,并初始值
        self.dt1.setDisplayFormat('yyyy-MM-dd')
        #self.dt1.setMinimumDate(QDate.currentDate().addDays(-90)) # 限定时间最小值,当前时间-365天
        self.dt1.setMaximumDate(
            QDate.currentDate().addDays(1))  # 限定时间最大值,当前时间+365天
        self.dt1.setCalendarPopup(
            True)  # 允许弹出窗口选择日期,setMinimumDate()的限定对这个窗口也有效
        # #############结束时间选择
        self.rp_config_lo.addWidget(QLabel('结束时间', self.rp_config), 2, 4)
        self.dt2 = QDateTimeEdit(QDate.currentDate(),
                                 self.rp_config)  # 创建日期,并初始值
        self.dt2.setDate(QDate.currentDate())
        #self.dt2.setMinimumDate(QDate.currentDate().addDays(-90)) # 限定时间最小值,当前时间-365天
        self.dt2.setMaximumDate(
            QDate.currentDate().addDays(1))  # 限定时间最大值,当前时间+365天
        self.dt2.setCalendarPopup(
            True)  # 允许弹出窗口选择日期,setMinimumDate()的限定对这个窗口也有效

        ###########查询按钮###########
        self.qtb1 = QPushButton('查询', self.rp_config)
        self.qtb1.clicked.connect(self.work)

        self.rp_config_lo.addWidget(self.dt1, 2, 1, 1, 3)
        self.rp_config_lo.addWidget(self.dt2, 2, 5, 1, 2)
        self.rp_config_lo.addWidget(self.qtb1, 2, 7)

        #######第四行进度条
        self.rp_config_lo.addWidget(QLabel('进度', self.rp_config), 3, 0)
        self.pbar = QProgressBar(self.rp_config)
        #self.pbar.setFixedWidth(560)
        self.rp_config_lo.addWidget(self.pbar, 3, 1, 1, 6)
        self.setLayout(layout)
        self.creatsheetCheckBox()

    def creatsheetCheckBox(self):
        qlist = self.sheetbox.findChildren((QCheckBox, QLabel))
        #print(help(self.sheetbox_lo))
        for i in qlist:
            self.sheetbox_lo.removeWidget(i)
            sip.delete(i)
        filename = str(self.qtfile.text())
        if not path.exists(filename):
            self.sheetbox_lo.addWidget(QLabel('文件不存在', self.sheetbox), 0, 0)
        else:
            wb = load_workbook(filename)
            sheetname = wb.get_sheet_names()
            for index, i in enumerate(sheetname):
                lc[i] = QCheckBox(self.sheetbox)
                lc[i].setObjectName(i)
                lc[i].setText(i)
                lc[i].setStatusTip(i)
                lc[i].setChecked(True)
                a, b = divmod(index, 5)
                self.sheetbox_lo.addWidget(lc[i], a, b)
        gc.collect()

    def initserverinfo(self, host, port, user, passwd, db):
        self.workThread.init1(host, port, user, passwd, db)

    def setp(self, num):
        if num < 100:
            self.pbar.setValue(num)
        elif num == 1000:
            self.qtb1.setEnabled(True)
            self.pbar.setValue(0)
            self.workThread.quit()
            QMessageBox.information(self, "错误", "文件保存失败,检查文件是否被打开",
                                    QMessageBox.Yes)
        elif num == 2000:
            self.qtb1.setEnabled(True)
            self.pbar.setValue(0)
            #self.workThread.quit()
            QMessageBox.information(self, "错误", "无法导入pymysql依赖包",
                                    QMessageBox.Yes)
        elif num == 2001:
            self.qtb1.setEnabled(True)
            self.pbar.setValue(0)
            #self.workThread.quit()
            QMessageBox.information(self, "错误", "无法导入msmysql依赖包",
                                    QMessageBox.Yes)

        elif num >= 100 and num < 101:
            self.qtb1.setEnabled(True)
            self.pbar.setValue(num)
            QMessageBox.information(self, "提示", "报表导出成功1", QMessageBox.Yes)

    def work(self):
        self.t1 = time.mktime(
            time.strptime(self.dt1.date().toString(Qt.ISODate), "%Y-%m-%d"))
        self.t2 = time.mktime(
            time.strptime(self.dt2.date().toString(Qt.ISODate),
                          "%Y-%m-%d")) + 60 * 60 * 24
        c_cheetname = []
        for i in self.sheetbox.findChildren(QCheckBox):
            if i.isChecked():
                c_cheetname.append(i.statusTip())

        if time.mktime(
                time.strptime(self.dt1.date().toString(
                    Qt.ISODate), "%Y-%m-%d")) > time.mktime(
                        time.strptime(self.dt2.date().toString(Qt.ISODate),
                                      "%Y-%m-%d")):
            QMessageBox.information(self, "信息", "起始时间不能大于结束时间",
                                    QMessageBox.Yes)
        else:
            gzh = self.gzh.text()
            sjl = self.sjl.text()
            cj = self.jsComboBox.currentText()
            self.fileName1 = self.qtfile.text()
            mode = int(self.js2ComboBox.currentText().split('--')[0])
            if not path.exists(self.fileName1):
                QMessageBox.information(self, "提示", "检查配置,找不到模板文件",
                                        QMessageBox.No)
            elif len(c_cheetname) == 0:
                QMessageBox.information(self, "提示", "没有选中任何工作表",
                                        QMessageBox.No)
            else:
                self.qtb1.setEnabled(False)
                self.workThread.init2(self.fileName1, self.t1, self.t2, gzh,
                                      sjl, cj, mode, c_cheetname)
                self.workThread.start()  #计时开始
                #self.workThread.trigger.connect(over)   #当获得循环完毕的信号时,停止计数

    def button_click(self):
        # absolute_path is a QString object
        self.fileName1, self.filetype = QFileDialog.getOpenFileName(
            self, "选取文件", "", "xlsx (*.xlsx)")  #设置文件扩展名过滤,注意用双分号间隔
        if self.fileName1 == '': pass
        else:
            self.qtfile.clear()
            self.qtfile.insert(self.fileName1)
        self.creatsheetCheckBox()
Example #14
0
class ShowInfoWidget(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(1050, 650)
        self.gridLayoutWidget = QtWidgets.QWidget(Form)
        self.gridLayoutWidget.setGeometry(QtCore.QRect(29, 9, 1000, 600))
        self.gridLayoutWidget.setObjectName("gridLayoutWidget")
        #网格布局
        self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setHorizontalSpacing(20)
        self.gridLayout.setObjectName("gridLayout")
        # 日期选择框
        self.dateEdit = QDateTimeEdit(QDateTime.currentDateTime(),
                                      self.gridLayoutWidget)
        self.dateEdit.setObjectName("dateEdit")
        self.dateEdit.setDisplayFormat("yyyy-MM-dd")
        self.dateEdit.setMinimumDate(QDate.currentDate().addDays(-365))
        self.dateEdit.setMaximumDate(QDate.currentDate().addDays(365 * 3))
        self.dateEdit.setCalendarPopup(True)
        self.gridLayout.addWidget(self.dateEdit, 1, 0, 1, 1)
        #下拉列表
        self.comboBox = QtWidgets.QComboBox(self.gridLayoutWidget)
        self.comboBox.setObjectName("comboBox")
        num = self.getLogsItems()
        self.comboBox.setMaxVisibleItems(num)
        self.gridLayout.addWidget(self.comboBox, 2, 0, 1, 1)

        #日志显示框
        self.textEdit = QtWidgets.QTextEdit(self.gridLayoutWidget)
        self.textEdit.setObjectName("textEdit")
        self.gridLayout.addWidget(self.textEdit, 3, 0, 1, 1)
        self.textEdit.setReadOnly(True)

        #按钮
        self.pushButton = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.pushButton.setObjectName("pushButton")
        self.gridLayout.addWidget(self.pushButton, 2, 1, 1, 1)

        self.bindButton()
        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "系统日志查询"))
        self.pushButton.setText(_translate("Form", "显示日志"))

    def bindButton(self):
        self.pushButton.clicked.connect(lambda: self.showFileButtonClicked())
        self.dateEdit.dateTimeChanged.connect(lambda: self.getLogsItems())

    #显示日志按钮点击事件
    def showFileButtonClicked(self):
        self.textEdit.clear()
        path = os.path.abspath(os.getcwd())
        filename = self.comboBox.currentText()
        if not filename:
            self.textEdit.append("这一天没有产生日志")
            return
        filepath = path + "/logs/" + filename
        try:
            with open(filepath, "r", encoding='utf-8') as f:
                count = 1
                data = f.readline()
                while data:
                    if data:
                        datalist = data.split("-", 4)
                        self.textEdit.append("第" + str(count) + "条日志:" +
                                             datalist[1] + "/" + datalist[2] +
                                             datalist[4])
                        count = count + 1
                        data = f.readline()
                    else:
                        self.textEdit.append(filename + "文件为空")
        except FileNotFoundError:
            self.textEdit.append("找不到" + filename + "文件")

    #获取要显示在下拉框中的日志文件名
    def getLogsItems(self):
        path = str(os.path.abspath(os.getcwd())) + "/logs"
        data = self.getChoisedTimeInfoFileData()
        for root, dirs, files in os.walk(path):
            self.comboBox.clear()
        for i in files:
            fileNameList = i.split("-")
            filename = fileNameList[0] + "-" + fileNameList[
                1] + "-" + fileNameList[2]
            if filename == data:
                self.comboBox.addItem(i)
        return len(files)

    #获取当前选择的日期的文件日期
    def getChoisedTimeInfoFileData(self):
        date = self.dateEdit.text()
        return str(date)
Example #15
0
class Page3Win(QWidget):
    def __init__(self, parent=None):
        super(Page3Win, self).__init__(parent)
        self.conditionBox()
        self.resultTable()
        mainLayout = QVBoxLayout()
        mainLayout.addWidget(self.setConditGroup)
        mainLayout.addWidget(self.table)
        mainLayout.addSpacing(12)
        mainLayout.addStretch(1)

        self.setLayout(mainLayout)

    def conditionBox(self):

        self.typeChkBoxGroup()

        ##查找条件设定Box
        self.setConditGroup = QGroupBox("查找条件")
        grid = QGridLayout()

        #COL1
        nameLabel = QLabel("样品姓名:")
        idLabel = QLabel("样品ID")
        companyLabel = QLabel("来源公司")
        typeLabel = QLabel("产品类型")
        time1Label = QLabel("起始时间")
        time2Label = QLabel("结束时间")

        #COL2
        nameEdit = QLineEdit()
        idEdit = QLineEdit()
        companyEdit = QLineEdit()

        self.dateEdit1 = QDateTimeEdit(QDate.currentDate())
        self.dateEdit1.setCalendarPopup(True)

        self.dateEdit2 = QDateTimeEdit(QDate.currentDate())
        self.dateEdit2.setCalendarPopup(True)
        self.dateEdit2.setMaximumDate(QDate.currentDate().addDays(200))

        #COL3
        nameNote = QLabel("支持输入多姓名查找,姓名之间使用','或'/'间隔")
        idNote = QLabel("支持输入多id查找,id之间使用','或'/'间隔")
        companyNote = QLabel("请输入样品来源公司的中文名称,支持模糊匹配")

        grid.addWidget(nameLabel, 0, 0)
        grid.addWidget(idLabel, 1, 0)
        grid.addWidget(companyLabel, 2, 0)
        grid.addWidget(typeLabel, 3, 0)
        grid.addWidget(time1Label, 4, 0)
        grid.addWidget(time2Label, 5, 0)
        grid.addWidget(nameEdit, 0, 1)
        grid.addWidget(idEdit, 1, 1)
        grid.addWidget(companyEdit, 2, 1)
        grid.addWidget(self.typeGroupBox, 3, 1)
        grid.addWidget(self.dateEdit1, 4, 1)
        grid.addWidget(self.dateEdit2, 5, 1)
        grid.addWidget(nameNote, 0, 2)
        grid.addWidget(idNote, 1, 2)
        grid.addWidget(companyNote, 2, 2)

        self.setConditGroup.setLayout(grid)

    def resultTable(self):

        self.table = QTableWidget()
        self.table.setColumnCount(2)
        self.table.setRowCount(2)
        self.table.setVerticalHeaderLabels(["报告数", "样品ID"])
        self.table.setHorizontalHeaderLabels(["常规项目", "9800"])
        self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        #self.table.setSelectionBehavior(QAbstractItemView.SelectColumns)

    def typeChkBoxGroup(self):
        ##用于产品类型的ChkBox
        self.typeGroupBox = QGroupBox()
        self.typeGroupBox.setMaximumSize(500, 40)
        layout = QHBoxLayout()

        CheckBox_cg = QCheckBox("常规项目")
        CheckBox_9800 = QCheckBox("9800项目")

        layout.addWidget(CheckBox_cg)
        layout.addWidget(CheckBox_9800)

        self.typeGroupBox.setLayout(layout)