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')
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
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())
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)
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
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()
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) )
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)
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)