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 EventController(QWidget):
    def __init__(self, parent=None, default_style='Fusion'):
        super(EventController, self).__init__(parent)

        # main window attribute
        self.setGeometry(300, 100, 800, 800)
        self.setWindowTitle('Event controller')
        QApplication.setStyle(QStyleFactory.create(default_style))

        # needed information
        self.course_list = []
        self.event_list = []

        # call google api
        self.google_cal = GoogleApi('calendar', 'v3')
        self.attendee = []

        # create groups to control widgets position
        self.create_course_group()

        # set style
        style_layout = QHBoxLayout()
        style_label = QLabel('Style:')
        # QLabel.setBuddy

        style_combo = QComboBox()
        style_combo.addItems(QStyleFactory.keys())
        style_combo.activated[str].connect(self.change_style)

        # set style combo box index
        style_index = QStyleFactory.keys()
        style_index = style_index.index(default_style)
        style_combo.setCurrentIndex(style_index)

        style_layout.addWidget(style_label)
        style_layout.addWidget(style_combo)
        style_layout.addStretch(1)

        # set submit button
        submit_layout = QHBoxLayout()
        
        submit_btn = QPushButton('Submit')
        submit_btn.clicked.connect(self.submit_event)

        clean_btn = QPushButton('Clean')
        clean_btn.clicked.connect(self.clean_all)

        submit_layout.addStretch(1)
        submit_layout.addWidget(submit_btn)
        submit_layout.addWidget(clean_btn)

        # set main layout
        main_layout = QGridLayout()
        main_layout.addLayout(style_layout, 0, 0, 1, 2)
        main_layout.addWidget(self.course_group, 1, 0)
        main_layout.addLayout(submit_layout, 2, 0, 1, 2)

        self.setLayout(main_layout)

    def change_style(self, style_name):
        QApplication.setStyle(QStyleFactory.create(style_name))
        QApplication.setPalette(QApplication.style().standardPalette())

    def submit_event(self):
        course_name = self.course_combo.currentText()
        event_type = self.event_combo.currentText()
        desc = self.desc_line_edit.text()

        event_info = f'{course_name}-{event_type}{desc}'
        print(event_info, end=' ')

        start_time = self.start_datetime.dateTime().toString(Qt.ISODate)[:-3]
        end_time = self.end_datetime.dateTime().toString(Qt.ISODate)[:-3]

        print(f'{start_time} -- {end_time}')
        self.google_cal.add_event(event_info, start_time=start_time, event_time=end_time, attendees=self.attendee)

    def clean_all(self):
        """
        reset all parameter
        """
        # reset course_group
        self.course_combo.setCurrentIndex(0)
        self.event_combo.setCurrentIndex(0)
        
        # reset desc line edit
        self.desc_line_edit.clear()

        # reset start
        self.start_datetime.setDateTime(QDateTime.currentDateTime())

        # reset terminal time
        self.end_datetime.setDate(QDate.currentDate())
        self.end_datetime.setTime(QTime(23, 59))
        

    def create_course_group(self):
        self.course_group = QGroupBox('course group')

        self.course_list.extend(['ML', 'DL', 'CD'])
        
        self.event_list.extend(['HW', 'assignment', 'exam', 'lab', 'midterm', 'final'])

        # course name block
        course_layout = QVBoxLayout()
        course_label = QLabel('Course name')

        self.course_combo = QComboBox()
        self.course_combo.addItems(self.course_list)

        # course_layout.addStretch(1)
        course_layout.addWidget(course_label)
        course_layout.addWidget(self.course_combo)
        course_layout.addStretch(1)

        # event type block
        event_layout = QVBoxLayout()
        event_label = QLabel('Event type')

        self.event_combo = QComboBox()
        self.event_combo.addItems(self.event_list)

        # event_layout.addStretch(1)
        event_layout.addWidget(event_label)
        event_layout.addWidget(self.event_combo)
        event_layout.addStretch(1)

        # event description
        desc_layout = QVBoxLayout()
        desc_label = QLabel('Description')

        self.desc_line_edit = QLineEdit()
        self.desc_line_edit.setMaxLength(5)

        # desc_layout.addStretch(1)
        desc_layout.addWidget(desc_label)
        desc_layout.addWidget(self.desc_line_edit)
        desc_layout.addStretch(1)

        # start datetime block
        start_layout = QVBoxLayout()
        start_label = QLabel('Start time')

        self.start_datetime = QDateTimeEdit()
        self.start_datetime.setCalendarPopup(True)
        self.start_datetime.setMinimumDateTime(QDateTime.currentDateTime())
        self.start_datetime.dateChanged.connect(self.datetime_synch)

        # start_layout.addStretch(1)
        start_layout.addWidget(start_label)
        start_layout.addWidget(self.start_datetime)
        start_layout.addStretch(1)

        # end datetime block
        end_layout = QVBoxLayout()
        end_label = QLabel('Terminate time')

        self.end_datetime = QDateTimeEdit()
        self.end_datetime.setCalendarPopup(True)
        self.end_datetime.setMinimumDate(QDate.currentDate())
        self.end_datetime.setTime(QTime(23, 59))

        # end_layout.addStretch(1)
        end_layout.addWidget(end_label)
        end_layout.addWidget(self.end_datetime)
        end_layout.addStretch(1)

        # layout box
        layout = QHBoxLayout()
        layout.addLayout(course_layout)
        layout.addLayout(event_layout)
        layout.addLayout(desc_layout)
        layout.addLayout(start_layout)
        layout.addLayout(end_layout)
        layout.addStretch(1)
        
        self.course_group.setLayout(layout)

    # change end datetime binding to start_datetime
    def datetime_synch(self, date):

        self.end_datetime.setDate(date)
        self.end_datetime.setTime(
            QTime(23, 59)
        )
Example #14
0
    def initUI(self):
        btn_gen = QPushButton('Generate', self)
        btn_gen.setToolTip("Generate meal suggestions")
        btn_gen.setStyleSheet(
            'QPushButton {background-color : rgb(255,0,0); color : black}')

        btn_edit = QPushButton('Edit List', self)
        btn_edit.setToolTip("Edit Meals")

        sld = QSlider(Qt.Horizontal, self)
        sld.setToolTip(
            "The ratio of vegetarian dishes in the next list of suggestions")
        sld.setMinimum(0)
        sld.setMaximum(100)
        sld.setValue(70)

        sld_lab = QLabel("Veg Dishes " + str(sld.value()) + "%", self)

        def onChanged():
            text = "Veg Dishes " + str(sld.value()) + "%"
            sld_lab.setText(text)

        sld.valueChanged.connect(onChanged)

        start_cal = QDateTimeEdit(self)
        start_cal.setCalendarPopup(True)
        start_cal.setMinimumDate(QDate.currentDate())
        start_cal.setDisplayFormat("ddd dd.MM")
        start_cal.setToolTip("Select a starting date")
        start_cal_lab = QLabel("Start:", self)

        end_cal = QDateTimeEdit(self)
        end_cal.setCalendarPopup(True)
        end_cal.setDate(QDate.currentDate().addDays(5))
        end_cal.setMinimumDate(QDate.currentDate().addDays(0))
        end_cal.setDisplayFormat("ddd dd.MM")
        end_cal.setToolTip("Select an end date")
        end_cal_lab = QLabel("End:", self)

        def startrange():
            if end_cal.date() < start_cal.date():
                start_cal.setDate(end_cal.date())

        end_cal.dateChanged.connect(startrange)

        self.setFixedSize(300, 150)
        self.center()
        self.setWindowTitle('suggestible')
        self.setWindowIcon(QIcon('icon.png'))

        def createGridLayout(self):
            self.horizontalGroupBox = QWidget()
            layout = QGridLayout()
            layout.setColumnStretch(0, 5)
            layout.setColumnStretch(1, 5)
            layout.setRowStretch(5, 1)
            layout.setVerticalSpacing(8)

            layout.addWidget(start_cal_lab, 0, 0)
            layout.addWidget(end_cal_lab, 0, 1)
            layout.addWidget(start_cal, 1, 0)
            layout.addWidget(end_cal, 1, 1)
            layout.addWidget(btn_edit, 2, 0)
            layout.addWidget(sld, 2, 1)
            layout.addWidget(sld_lab, 2, 1, 3, 1, alignment=Qt.AlignCenter)
            layout.addWidget(btn_gen, 4, 0, 2, 2)
            layout.setRowMinimumHeight(4, 15)
            layout.setRowMinimumHeight(5, 15)

            self.horizontalGroupBox.setLayout(layout)

        createGridLayout(self)

        windowLayout = QVBoxLayout()
        windowLayout.addWidget(self.horizontalGroupBox)
        self.setLayout(windowLayout)

        self.show()

        def dates(starting, ending):
            end = ending.date()
            start = starting.date()
            en = end.toString("yyyy-MM-dd")
            en = parse(en)
            st = start.toString("yyyy.MM.dd")
            st = parse(st)

            def daterange(st, en):
                for n in range(int((en - st).days) + 1):
                    yield st + timedelta(n)

            fin_dates = []
            for dt in daterange(st, en):
                fin_dates.append(dt.strftime("%A %d.%m"))

            return fin_dates

        def dates_header(starting, ending):
            end = ending.date()
            start = starting.date()
            en = end.toString("dd.MM")
            st = start.toString("dd.MM")
            return st + "-" + en

        def html_creator(starting, ending, ratio0):
            templateLoader = jinja2.FileSystemLoader(searchpath="")
            templateEnv = jinja2.Environment(loader=templateLoader)
            TEMPLATE_FILE = "template_suggestions.html"
            template = templateEnv.get_template(TEMPLATE_FILE)

            outputText = template.render(range=dates_header(starting, ending),
                                         table=main(dates(starting, ending),
                                                    ratio0))
            html_file = open("suggestions" + '.html', 'w')
            html_file.write(outputText)
            html_file.close()

        def generate():
            html_creator(start_cal, end_cal, sld.value() / 100)
            webbrowser.open("suggestions.html", new=1)

        def popupwindow():
            self.editor = tablegui.App()

        btn_gen.clicked.connect(generate)
        btn_edit.clicked.connect(popupwindow)
Example #15
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)