class DateDialog(QDialog): def __init__(self, parent=None): super(DateDialog, self).__init__(parent) self.setWindowTitle("DateDialog") layout = QVBoxLayout(self) self.datetime = QDateTimeEdit(self) self.datetime.setCalendarPopup(True) self.datetime.setDateTime(QDateTime.currentDateTime()) layout.addWidget(self.datetime) buttons = QDialogButtonBox( QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self) buttons.accepted.connect(self.accept) buttons.rejected.connect(self.reject) layout.addWidget(buttons) def dateTime(self): return self.datetime.dateTime() @staticmethod def getDateTime(parent=None): dialog = DateDialog(parent) result = dialog.exec() date = dialog.dateTime() return date.date(), date.time(), result == QDialog.Accepted
def group4(window): groupbox = QGroupBox("Group 3") groupbox.setCheckable(True) groupbox.setChecked(True) input = QLineEdit("firmanslur", window) input.setEchoMode(QLineEdit.Password) spin = QSpinBox(window) spin.setValue(50) tanggal = QDateTimeEdit(window) tanggal.setDateTime(QDateTime.currentDateTime()) slider = QSlider(Qt.Horizontal, window) slider.setValue(50) scrollBar = QScrollBar(Qt.Horizontal, window) scrollBar.setValue(60) dial = QDial(window) dial.setValue(30) dial.setNotchesVisible(True) layout = QGridLayout() layout.addWidget(input, 0, 0, 1, 2) layout.addWidget(spin, 1, 0, 1, 2) layout.addWidget(tanggal, 2, 0, 1, 2) layout.addWidget(slider, 3, 0) layout.addWidget(scrollBar, 4, 0) layout.addWidget(dial, 3, 1, 2, 1) layout.setRowStretch(5, 1) groupbox.setLayout(layout) return groupbox
def initUI(self): lbl = QLabel('QTimeEdit') datetimeedit = QDateTimeEdit(self) datetimeedit.setDateTime(QDateTime.currentDateTime()) datetimeedit.setDateTimeRange(QDateTime(1900, 1, 1, 00, 00, 00), QDateTime(2100, 1, 1, 00, 00, 00)) # QDateTimeEdit 클래스를 이용해서 날짜, 시간 편집 위젯(datetimeedit)을 # 하나 만들어줍니다. # # setDateTime 메서드에 QDateTime.currentDateTime()을 # 입력해서 프로그램이 실행될 때 현재 날짜와 시간으로 표시되도록 합니다. # # setDateTimeRange를 이용하면 사용자가 선택할 수 있는 시간의 범위를 제한할 수 있습니다. datetimeedit.setDisplayFormat('yyyy.MM.dd hh:mm:ss') # setDisplayFormat 메서드를 이용해서 시간이 'yyyy.MM.dd hh:mm:ss'의 # 형식으로 표시되도록 설정했습니다. vbox = QVBoxLayout() vbox.addWidget(lbl) vbox.addWidget(datetimeedit) vbox.addStretch() # 수직 박스 레이아웃을 이용해서 라벨과 날짜, # 시간 편집 위젯을 수직으로 배치하고, 전체 위젯의 레이아웃으로 설정합니다. self.setLayout(vbox) self.setWindowTitle('QDateTimeEdit') self.setGeometry(300, 300, 300, 200) self.show()
class Dialog(QDialog): def __init__(self, parent=None): super(Dialog, self).__init__(parent) layout = QVBoxLayout(self) self.label = QLabel(self) self.datetime = QDateTimeEdit(self) self.datetime.setCalendarPopup(True) self.datetime.setDateTime(QDateTime.currentDateTime()) self.label.setText("请选择日期") layout.addWidget(self.label) layout.addWidget(self.datetime) buttons = QDialogButtonBox( QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self) buttons.accepted.connect(self.accept) #点击ok,隐士存在该方法 buttons.rejected.connect(self.reject) #点击cancel,该方法默认隐士存在 layout.addWidget(buttons) #该方法在父类方法中调用,直接打开了子窗体,返回值则用于向父窗体数据的传递 @staticmethod def getResult(self, parent=None): dialog = Dialog(parent) result = dialog.exec_() d = dialog.datetime.dateTime() return (d.date(), d.time(), result)
class Dialog(QDialog): #自定义消息 dialogSignel = pyqtSignal(int, str) def __init__(self, parent=None): super(Dialog, self).__init__(parent) layout = QVBoxLayout(self) self.label = QLabel(self) self.datetime = QDateTimeEdit(self) self.datetime.setCalendarPopup(True) self.datetime.setDateTime(QDateTime.currentDateTime()) self.label.setText("请选择日期") layout.addWidget(self.label) layout.addWidget(self.datetime) buttons = QDialogButtonBox( QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self) buttons.accepted.connect(self.accept) #点击ok buttons.rejected.connect(self.reject) #点击cancel layout.addWidget(buttons) def accept(self): #点击ok是发送内置信号 print("accept") self.dialogSignel.emit(0, self.datetime.text()) self.destroy() def reject(self): #点击cancel时,发送自定义信号 print('reject') self.dialogSignel.emit(1, "清空") self.destroy()
def createBottomRightGroupBox(self): self.bottomRightGroupBox = QGroupBox("Group 3") self.bottomRightGroupBox.setCheckable(True) self.bottomRightGroupBox.setChecked(True) lineEdit = QLineEdit('s3cRe7') lineEdit.setEchoMode(QLineEdit.Password) spinBox = QSpinBox(self.bottomRightGroupBox) spinBox.setValue(50) dateTimeEdit = QDateTimeEdit(self.bottomRightGroupBox) dateTimeEdit.setDateTime(QDateTime.currentDateTime()) slider = QSlider(Qt.Horizontal, self.bottomRightGroupBox) slider.setValue(40) scrollBar = QScrollBar(Qt.Horizontal, self.bottomRightGroupBox) scrollBar.setValue(60) dial = QDial(self.bottomRightGroupBox) dial.setValue(30) dial.setNotchesVisible(True) layout = QGridLayout() layout.addWidget(lineEdit, 0, 0, 1, 2) layout.addWidget(spinBox, 1, 0, 1, 2) layout.addWidget(dateTimeEdit, 2, 0, 1, 2) layout.addWidget(slider, 3, 0) layout.addWidget(scrollBar, 4, 0) layout.addWidget(dial, 3, 1, 2, 1) layout.setRowStretch(5, 1) self.bottomRightGroupBox.setLayout(layout)
def createEditor(self, parent, option, index): date_edit = QDateTimeEdit(parent) date_edit.setDisplayFormat("yyyy/MM/dd HH:mm") date_edit.setDateTime(QDateTime.currentDateTime()) date_edit.setCalendarPopup(True) return date_edit
class DateDialog(QDialog): def __init__(self, parent=None): super(DateDialog, self).__init__(parent) layout = QVBoxLayout(self) # nice widget for editing the date self.datetime = QDateTimeEdit(self) self.datetime.setCalendarPopup(True) self.datetime.setDateTime(QDateTime.currentDateTime()) layout.addWidget(self.datetime) # OK and Cancel buttons self.buttons = QDialogButtonBox( QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self) layout.addWidget(self.buttons) self.buttons.accepted.connect(self.accept) self.buttons.rejected.connect(self.reject) # get current date and time from the dialog def dateTime(self): return self.datetime.dateTime() # static method to create the dialog and return (date, time, accepted) @staticmethod def getDateTime(parent=None): dialog = DateDialog(parent) result = dialog.exec_() date = dialog.dateTime() return (date.date(), date.time(), result == QDialog.Accepted)
class SliceWidget(QWidget): """Custom widget to slice data""" # Signals sliceTimes = pyqtSignal(str, str) def __init__(self): super().__init__() self.initUI() def initUI(self): # Labels sliceLabel = QLabel("Slicing") startLabel = QLabel("Start: ") endLabel = QLabel("End: ") # DateTimeEdit self.startDateTimeEdit = QDateTimeEdit() self.endDateTimeEdit = QDateTimeEdit() # Buttons applyButton = QPushButton("Apply") applyButton.clicked.connect(self.sendTimes) hideButton = QPushButton("Hide") hideButton.clicked.connect(self.hide) # Layouts # - Horizontal for start hStart = QHBoxLayout() hStart.addWidget(startLabel) hStart.addWidget(self.startDateTimeEdit) # - Horizontal for end hEnd = QHBoxLayout() hEnd.addWidget(endLabel) hEnd.addWidget(self.endDateTimeEdit) # - Vertical for self vWidget = QVBoxLayout() vWidget.addWidget(sliceLabel) vWidget.addLayout(hStart) vWidget.addLayout(hEnd) vWidget.addWidget(applyButton) vWidget.addWidget(hideButton) self.setLayout(vWidget) def sendTimes(self): self.sliceTimes.emit(self.startDateTimeEdit.text(), self.endDateTimeEdit.text()) def refresh(self, start, end): self.startDateTimeEdit.setMinimumDateTime(start) self.startDateTimeEdit.setMaximumDateTime(end) self.startDateTimeEdit.setDateTime(start) self.endDateTimeEdit.setMinimumDateTime(start) self.endDateTimeEdit.setMaximumDateTime(end) self.endDateTimeEdit.setDateTime(end)
def createBottomRightGroupBox(self): self.bottomRightGroupBox = QGroupBox("Group 3") self.bottomRightGroupBox.setCheckable(True) self.bottomRightGroupBox.setChecked(True) lineEdit = QLineEdit('4.0') lineEdit.setEchoMode(QLineEdit.Password) styleLabelLine = QLabel("&GPA") styleLabelLine.setBuddy(lineEdit) lineEdit1 = QLineEdit('2') styleLabelLine1 = QLabel("&SCI paper") styleLabelLine1.setBuddy(lineEdit1) spinBox = QSpinBox(self.bottomRightGroupBox) spinBox.setValue(10) styleLabelLine2 = QLabel("&Years") styleLabelLine2.setBuddy(spinBox) # connect button to function on_click #self.lineEdit.clicked.connect(self.on_click) #self.show() dateTimeEdit = QDateTimeEdit(self.bottomRightGroupBox) dateTimeEdit.setDateTime(QDateTime.currentDateTime()) styleLabelLine3 = QLabel("&Semester") styleLabelLine3.setBuddy(dateTimeEdit) #slider = QSlider(Qt.Horizontal, self.bottomRightGroupBox) #slider.setValue(40) #scrollBar = QScrollBar(Qt.Horizontal, self.bottomRightGroupBox) #scrollBar.setValue(60) #dial = QDial(self.bottomRightGroupBox) #dial.setValue(30) #dial.setNotchesVisible(True) layout = QGridLayout() layout.addWidget(styleLabelLine, 0, 0, 1, 2) layout.addWidget(lineEdit, 0, 1, 1, 2) layout.addWidget(styleLabelLine1, 1, 0, 1, 2) layout.addWidget(lineEdit1, 1, 1, 1, 2) layout.addWidget(styleLabelLine2, 2, 0, 1, 2) layout.addWidget(spinBox, 2, 1, 1, 2) layout.addWidget(styleLabelLine3, 3, 0, 1, 2) layout.addWidget(dateTimeEdit, 3, 1, 1, 2) #layout.addWidget(slider, 3, 0) #layout.addWidget(scrollBar, 4, 0) #layout.addWidget(dial, 3, 1, 2, 1) #layout.setRowStretch(5, 1) self.bottomRightGroupBox.setLayout(layout)
class MainWidget(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): vlayout = QVBoxLayout() grid = QGridLayout() label1 = QLabel('文件路径') self.lineEdit = QLineEdit() label2 = QLabel('时间点') self.dateEdit = QDateTimeEdit() self.dateEdit.setDisplayFormat('yyyy-MM-dd hh:mm:ss') grid.addWidget(label1, 0, 0) grid.addWidget( self.lineEdit, 0, 1, ) grid.addWidget(label2, 1, 0) grid.addWidget(self.dateEdit, 1, 1) vlayout.addLayout(grid) vlayout.addStretch(1) self.setLayout(vlayout) def onClipboradChanged(self): clipboard = QApplication.clipboard() text = clipboard.text() if text: content = str(text) print('onClipboradChanged---' + content + ' len = ' + str(len(content))) if content.startswith('file:///'): path = content.replace('file:///', '') if not os.path.exists(path): return name = Utils.fileName(path) self.lineEdit.setText(path) if Utils.isAllowConvert2Time(name): self.updateDateTimeEdit(filename=name) pass elif len(content) < 50: self.updateDateTimeEdit(content=content) def updateDateTimeEdit(self, filename='', content=''): if filename: times = Utils.extractTimeFromFile(filename) elif content: times = Utils.extractTime(content) if times == -1: return timestr = Utils.convertSeconds2TimeStr(times) print(timestr) self.dateEdit.setDateTime( QDateTime.fromString(timestr, 'yyyy-MM-dd hh:mm:ss')) pass
def group_datetime_spinbox(self): group2 = QGroupBox('QDateTimeEdit') lbl = QLabel('QDateTimeEdit') date_time_edit = QDateTimeEdit(self) date_time_edit.setDateTime(QDateTime.currentDateTime()) date_time_edit.setDateTimeRange(QDateTime(1900, 1, 1, 00, 00, 00), QDateTime(2100, 1, 1, 00, 00, 00)) date_time_edit.setDisplayFormat('yyyy-MM-dd hh:mm:ss') date_time_edit.dateTimeChanged.connect(self.datetime_value_change) self.lbl5 = QLabel( date_time_edit.dateTime().toString('yyyy-MM-dd hh:mm:ss')) layout_group5 = QHBoxLayout() layout_group5.addWidget(lbl) layout_group5.addWidget(date_time_edit) layout_group5.addWidget(self.lbl5) return layout_group5
class DateTimeFilterPage(QWidget): def __init__(self, parent=None): super(DateTimeFilterPage, self).__init__(parent) self.fromEdit = QDateTimeEdit() self.toEdit = QDateTimeEdit() groupLayout = QFormLayout() groupLayout.addRow("Od:", self.fromEdit) groupLayout.addRow("Do:", self.toEdit) self.group = QGroupBox("Datum a čas") self.group.setCheckable(True) self.group.setChecked(False) self.group.setLayout(groupLayout) layout = QVBoxLayout() layout.addWidget(self.group) layout.addStretch(1) self.setLayout(layout) def initControls(self, filter_): self.group.setChecked(False) for key in ['start_datetime', 'end_datetime']: if key in filter_: self.group.setChecked(True) break start = filter_.get('start_datetime', datetime.utcnow()) start = calendar.timegm(start.timetuple()) end = filter_.get('end_datetime', datetime.utcnow()) end = calendar.timegm(end.timetuple()) self.fromEdit.setDateTime(QDateTime.fromTime_t(start, TZ)) self.toEdit.setDateTime(QDateTime.fromTime_t(end, TZ)) def getFilter(self): filter_ = {} if self.group.isChecked(): start = self.fromEdit.dateTime().toTime_t() end = self.toEdit.dateTime().toTime_t() filter_['start_datetime'] = datetime.utcfromtimestamp(start) filter_['end_datetime'] = datetime.utcfromtimestamp(end) return filter_
def initUI(self): lb = QLabel('QTimeEdit :') dte = QDateTimeEdit(self) dte.setDateTime(QDateTime.currentDateTime()) dte.setDateTimeRange( QDateTime(1900, 1, 1, 00, 00, 00), QDateTime(2100, 1, 1, 00, 00, 00), ) dte.setDisplayFormat('yyyy.MM.dd hh:mm:ss') vbox = QVBoxLayout() vbox.addWidget(lb) vbox.addWidget(dte) vbox.addStretch() self.setLayout(vbox)
def createBottomRightGroupBox(self): '''Create a checkable group widget useful in the case of form login etc''' self.bottomRightGroupBox = QGroupBox("Group 3") self.bottomRightGroupBox.setCheckable( True) # sets the state aware mode self.bottomRightGroupBox.setChecked( True) # sets the default state to active # # create the required widgets # a lineEdit Widget for password entry. Activate the security by setEchoMode() # a spinBox Widget which lets the field change using scroll # a Date Time Edit Widget # a Slider Widget responsive to scroll as well as press and move # a Scroll Widget responsive to scroll as well as press and move # a Dial Widget responsive to scroll as well as press and move # lineEdit = QLineEdit('s3cRe7') lineEdit.setEchoMode(QLineEdit.Password) spinBox = QSpinBox(self.bottomRightGroupBox) spinBox.setValue(25) dateTimeEdit = QDateTimeEdit(self.bottomRightGroupBox) dateTimeEdit.setDateTime(QDateTime.currentDateTime()) slider = QSlider(Qt.Horizontal, self.bottomRightGroupBox) slider.setValue(40) scrollBar = QScrollBar(Qt.Horizontal, self.bottomRightGroupBox) scrollBar.setValue(60) dial = QDial(self.bottomRightGroupBox) dial.setValue(30) dial.setNotchesVisible(True) # # create the internal layout of the group Widget # layout = QGridLayout() layout.addWidget(lineEdit, 0, 0, 1, 3) layout.addWidget(spinBox, 1, 0, 1, 2) layout.addWidget(dateTimeEdit, 2, 0, 1, 2) layout.addWidget(slider, 3, 0) layout.addWidget(scrollBar, 4, 0) layout.addWidget(dial, 3, 1, 2, 2) layout.setRowStretch(50, 1) # ?? whatdoes RowStretch do? self.bottomRightGroupBox.setLayout(layout)
def importEvents(self, data): self.setRowCount(0) TimeStampsIndex = 0 for key in data: self.rowNumb = self.rowCount() self.setRowCount(self.rowNumb + len(data[key])) timeStamp = QDateTimeEdit() timeStamp.setDisplayFormat("dd.MM.yyyy") timeStamp.setReadOnly(True) timeStampCell = QDateTime.currentDateTime() timeStampCell = QDateTime.fromString(key, "dd.MM.yyyy") timeStamp.setDateTime(timeStampCell) self.setCellWidget(TimeStampsIndex, 0, timeStamp) if len(data[key]) > 1: self.setSpan(TimeStampsIndex, 0, len(data[key]) , 1) for row in range(len(data[key])): cell_0 = QTableWidgetItem('') cell_0.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter) cell_0.setFlags( Qt.ItemIsSelectable | Qt.ItemIsEnabled ) cell_1 = QTableWidgetItem('') cell_1.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter) cell_1.setFlags( Qt.ItemIsSelectable | Qt.ItemIsEnabled ) self.setItem(TimeStampsIndex + row, 1, cell_0) self.setItem(TimeStampsIndex + row, 2, cell_1) self.item(TimeStampsIndex + row, 1).setText(self._IncomeSourceCategory[data[key][row][0]['cell_0']]) try: if len(data[key][row][1]) == 2: self.item(TimeStampsIndex + row, 2).setText("%.2f" % round(float(data[key][row][1]['cell_1.1']), 2) + self._CurrencyIndex[data[key][row][1]['cell_1.2']]) elif len(data[key][row][1]) == 4: self.item(TimeStampsIndex + row, 2).setText("%.2f" % round(float(data[key][row][1]['cell_1.1']), 2) + self._CurrencyIndex[data[key][row][1]['cell_1.2']] + " -- კონვერტირდა --> " + "%.2f" % round(float(data[key][row][1]['cell_1.3']), 2) + self._CurrencyIndex[data[key][row][1]['cell_1.4']]) except ValueError: pass TimeStampsIndex = TimeStampsIndex + len(data[key]) self.horizontalHeader().setSectionResizeMode(0, QHeaderView.ResizeToContents) self.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch) self.horizontalHeader().setSectionResizeMode(2, QHeaderView.Stretch) self.scrollToBottom()
def initUI(self): lbl = QLabel('QTimeEdit') datetimeedit = QDateTimeEdit(self) datetimeedit.setDateTime(QDateTime.currentDateTime()) datetimeedit.setDateTimeRange(QDateTime(1900, 1, 1, 00, 00, 00), QDateTime(2100, 1, 1, 00, 00, 00)) datetimeedit.setDisplayFormat('yyyy.MM.dd hh:mm:ss') vbox = QVBoxLayout() vbox.addWidget(lbl) vbox.addWidget(datetimeedit) vbox.addStretch() self.setLayout(vbox) self.setWindowTitle('QDateTimeEdit') self.setGeometry(300, 300, 300, 200) self.show()
class filterPopup(QDialog): def __init__(self, parent=None): super().__init__(parent) self.filterConfiguration = QLabel("Filter Configuration",self) self.filterConfiguration.setFont(QtGui.QFont("Roboto",12, QtGui.QFont.Bold)) self.creatorLabel = QLabel("Creator", self) self.creatorLabel.setFont(QtGui.QFont("Roboto",12, QtGui.QFont.Bold)) self.eventType = QLabel("Event Type", self) self.eventType.setFont(QtGui.QFont("Roboto",12, QtGui.QFont.Bold)) self.keyWordSearch = QLineEdit(self) #Key Word text self.redBox = QCheckBox(self) #Red Check Box self.blueBox = QCheckBox(self) #Blue Check Box self.whiteBox = QCheckBox(self) #White Check Box self.redBox2 = QCheckBox(self) #Red Check Box self.blueBox2 = QCheckBox(self) #Blue Check Box self.whiteBox2 = QCheckBox(self) #White Check Box self.startTime = QDateTimeEdit(self) #Start time text self.endTime = QDateTimeEdit(self) #End Time text self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel, self) self.formGroupBox = QGroupBox("ihjnrsdijn") layout = QFormLayout(self) layout.addRow(self.filterConfiguration) layout.addRow("Keyword Search:", self.keyWordSearch) layout.addRow(self.creatorLabel) layout.addRow("Red", self.redBox) layout.addRow("Blue", self.blueBox) layout.addRow("White", self.whiteBox) layout.addRow(self.eventType) layout.addRow("Red", self.redBox2) layout.addRow("Blue", self.blueBox2) layout.addRow("White", self.whiteBox2) layout.addRow("Start TimeStamp:", self.startTime) layout.addRow("End TimeStamp:", self.endTime) layout.addWidget(self.buttonBox) def setDT(self, startDT = "2000-01-01T00:00:00", endDT = "2000-01-01T00:00:00",): self.startTime.setDateTime(QtCore.QDateTime.fromString(startDT, "yyyy-MM-ddThh:mm:ss")) self.endTime.setDateTime(QtCore.QDateTime.fromString(endDT, "yyyy-MM-ddThh:mm:ss"))
class DatetimeEditField(DataEditField): """ Class for editing datetime fields. """ def __init__(self, parent, title, help_text): self.field = QDateTimeEdit(datetime.now()) self.field.setCalendarPopup(True) self.field.setDisplayFormat("dd-MM-yyyy hh:mm:ss") DataEditField.__init__(self, parent, title, help_text, self.field) def clearField(self): """ Set field to current datetime """ self.field.setDateTime(datetime.now()) def getValue(self): """ Get value of DateTimeEditField """ return qDateTime2Datetime(self.field.dateTime())
class DateDialog(QDialog): def __init__(self, parent=None): super(DateDialog, self).__init__(parent) layout = QVBoxLayout(self) # info text self.label = QLabel( text='The file appears to contain relative dates.\n' 'Please specify a reference date.') layout.addWidget(self.label) # nice widget for editing the date self.datetime = QDateTimeEdit(self) self.datetime.setCalendarPopup(True) self.datetime.setDisplayFormat('yyyy-MM-dd hh:mm:ss') self.datetime.setDateTime(QDateTime.currentDateTime()) layout.addWidget(self.datetime) # OK and Cancel buttons self.buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) self.buttons.accepted.connect(self.accept) self.buttons.rejected.connect(self.reject) layout.addWidget(self.buttons) self.setLayout(layout) # get current date and time from the dialog def date_time(self): return self.datetime.dateTime() # static method to create the dialog and return (date, time, accepted) @staticmethod def get_date_time(parent=None): dialog = DateDialog(parent) result = dialog.exec_() date = dialog.date_time() return date.toPyDateTime(), result == QDialog.Accepted
class DateDialog(QDialog): def __init__(self, parent=None): super(DateDialog, self).__init__(parent) layout = QVBoxLayout(self) # nice widget for editing the date self.datetime = QDateTimeEdit(self) self.datetime.setCalendarPopup(True) self.datetime.setDateTime(QDateTime.currentDateTime()) layout.addWidget(self.datetime) # OK and Cancel buttons self.buttons = QDialogButtonBox( QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self) layout.addWidget(self.buttons) self.buttons.accepted.connect(self.accept) self.buttons.rejected.connect(self.reject) # get current date and time from the dialog def dateTime(self): return self.datetime.dateTime()
class DateDialog(QDialog): """对话窗口""" def __init__(self, parent=None): super().__init__(parent=parent) self.setWindowTitle("多窗口利用控件属性传递参数") self.resize(200, 100) self.datetimedit = QDateTimeEdit(parent=self) self.datetimedit.setCalendarPopup(True) self.datetimedit.setMinimumSize(100, 20) self.datetimedit.setDateTime(QDateTime.currentDateTime()) buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, parent=self) # 两个按钮, 分别连接dialog.accept()和dialog.reject() buttons.accepted.connect(self.accept) buttons.rejected.connect(self.reject) v_layout = QVBoxLayout() v_layout.addWidget(self.datetimedit) v_layout.addWidget(buttons) self.setLayout(v_layout) def date_time(self): """从对话框中获取当前日期和时间""" return self.datetimedit.dateTime() @staticmethod def get_date_time(parent=None): """静态方法, 创建一个自己, 返回时间""" dialog = DateDialog(parent) result = dialog.exec() date = dialog.date_time() return date.date(), date.time(), result == QDialog.Accepted
class NewDateDialog(QDialog): Signal_OneParameter = pyqtSignal(str) def __init__(self, parent=None): super(NewDateDialog, self).__init__(parent) self.setWindowTitle('子窗口:用来发射信号') # 在布局中添加部件 layout = QVBoxLayout(self) self.label = QLabel(self) self.label.setText('前者发射内置信号\n后者发射自定义信号') self.datetime_inner = QDateTimeEdit(self) self.datetime_inner.setCalendarPopup(True) self.datetime_inner.setDateTime(QDateTime.currentDateTime()) self.datetime_emit = QDateTimeEdit(self) self.datetime_emit.setCalendarPopup(True) self.datetime_emit.setDateTime(QDateTime.currentDateTime()) layout.addWidget(self.label) layout.addWidget(self.datetime_inner) layout.addWidget(self.datetime_emit) # 使用两个button(ok和cancel)分别连接accept()和reject()槽函数 buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self) buttons.accepted.connect(self.accept) buttons.rejected.connect(self.reject) layout.addWidget(buttons) self.datetime_emit.dateTimeChanged.connect(self.emit_signal) def emit_signal(self): date_str = self.datetime_emit.dateTime().toString() self.Signal_OneParameter.emit(date_str)
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 Ui_MainWindow(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.transprot_mass =[] self.netprot_mass =[] self.filtering_is_on = 0 grid = QGridLayout() self.setLayout(grid) self.IP_list = IP_list(self) self.TransProt_list = TransProt_list(self) self.NetProt_list = NetProt_list(self) self.setWindowTitle('Гамма') self.setWindowIcon(QIcon('допочки\Gamma_200x200.png')) self.resize(740, 830) self.to_center() self.centralwidget = QWidget(self) self.tabWidget = QTabWidget(self.centralwidget) self.tabWidget.setGeometry(QRect(20, 20, 700, 750)) self.tab = QWidget() grid.addWidget(self.tab) self.cb_time = QCheckBox(self.tab) self.cb_time.setGeometry(QRect(360, 130, 120, 20)) self.cb_time.setText("Фильтр по времени") self.cb_prot = QCheckBox(self.tab) self.cb_prot.setGeometry(QRect(20, 130, 140, 20)) self.cb_prot.setText("Фильтр по протоколам") self.cb_addr = QCheckBox(self.tab) self.cb_addr.setGeometry(QRect(360, 290, 130, 20)) self.cb_addr.setText("Фильтр по IP-адресам") self.dt_beg = QDateTimeEdit(self.tab) self.dt_beg.setGeometry(QRect(360, 210, 150, 20)) self.dt_beg.setDateTime(QDateTime.currentDateTime()) self.dt_beg.setDisplayFormat("dd.MM.yyyy H:mm:ss.zzz") self.dt_beg.setCalendarPopup(True) self.dt_beg.setToolTip('Выбрать начальное время (>=)') self.dt_beg.setEnabled(False) self.dt_end = QDateTimeEdit(self.tab) self.dt_end.setGeometry(QRect(520, 210, 150, 20)) self.dt_end.setDateTime(QDateTime.currentDateTime()) self.dt_end.setDisplayFormat("dd.MM.yyyy H:mm:ss.zzz") self.dt_end.setCalendarPopup(True) self.dt_end.setToolTip('Выбрать конечное время (<)') self.dt_end.setEnabled(False) self.dt_beg.dateChanged.connect(lambda dc: self.date_changed(1)) self.dt_end.dateChanged.connect(lambda dc: self.date_changed(2)) #self.l_input_dir = QLabel(self.tab) #self.l_input_dir.setGeometry(QRect(102, 50, 180, 15)) #self.l_input_dir.setText("Выберите директорию с файлами") #self.l_or = QLabel(self.tab) #self.l_or.setGeometry(QRect(340, 50, 21, 16)) #self.l_or.setText("ИЛИ") self.l_input_file = QLabel(self.tab) self.l_input_file.setGeometry(QRect(300, 50, 90, 15)) self.l_input_file.setText("Выберите файлы") self.l_transpr = QLabel(self.tab) self.l_transpr.setGeometry(QRect(50, 190, 180, 16)) self.l_transpr.setEnabled(False) self.l_transpr.setText("Протоколы Транспортного уровня") self.l_netpr = QLabel(self.tab) self.l_netpr.setGeometry(QRect(50, 290, 180, 16)) self.l_netpr.setEnabled(False) self.l_netpr.setText("Протоколы Сетевого уровня") self.l_beg = QLabel(self.tab) self.l_beg.setGeometry(QRect(390, 190, 60, 16)) self.l_beg.setEnabled(False) self.l_beg.setText("Начиная с..") self.l_end = QLabel(self.tab) self.l_end.setGeometry(QRect(560, 190, 80, 16)) self.l_end.setEnabled(False) self.l_end.setText("Оканчивая до..") self.l_name = QLabel(self.tab) self.l_name.setGeometry(QRect(300, 450, 96, 16)) self.l_name.setText("Как назвать файл?") self.l_filt = QLabel(self.tab) self.l_filt.setGeometry(QRect(300, 10, 91, 16)) self.l_filt.setText("Выборка пакетов") self.line = QFrame(self.tab) self.line.setGeometry(QRect(0, 110, 690, 15)) self.line.setFrameShape(QFrame.HLine) self.line.setFrameShadow(QFrame.Sunken) self.line_2 = QFrame(self.tab) self.line_2.setGeometry(QRect(340, 120, 15, 300)) self.line_2.setFrameShape(QFrame.VLine) self.line_2.setFrameShadow(QFrame.Sunken) self.line_3 = QFrame(self.tab) self.line_3.setGeometry(QRect(0, 420, 690, 15)) self.line_3.setFrameShape(QFrame.HLine) self.line_3.setFrameShadow(QFrame.Sunken) #self.le_dir = QLineEdit(self.tab) #self.le_dir.setGeometry(QRect(110, 80, 211, 20)) #self.le_dir.setEnabled(False) #self.le_dir.setReadOnly(True) self.le_file = QLineEdit(self.tab) self.le_file.setGeometry(QRect(250, 80, 211, 20)) #self.le_file.setEnabled(False) self.le_file.setReadOnly(True) self.le_name = QLineEdit(self.tab) self.le_name.setGeometry(QRect(250, 480, 231, 20)) self.pt_transpr = QPlainTextEdit(self.tab) self.pt_transpr.setGeometry(QRect(50, 210, 271, 71)) self.pt_transpr.setEnabled(False) self.pt_transpr.setReadOnly(True) self.pt_netpr = QPlainTextEdit(self.tab) self.pt_netpr.setGeometry(QRect(50, 320, 271, 71)) self.pt_netpr.setEnabled(False) self.pt_netpr.setReadOnly(True) self.pt_addr = QPlainTextEdit(self.tab) self.pt_addr.setGeometry(QRect(390, 320, 271, 71)) self.pt_addr.setEnabled(False) self.pt_log = QPlainTextEdit(self.tab) self.pt_log.setGeometry(QRect(20, 610, 651, 101)) self.pt_log.setReadOnly(True) self.progressBar = QProgressBar(self.tab) self.progressBar.setGeometry(QRect(20, 580, 651, 20)) self.progressBar.setFormat("%v" + "%") self.progressBar.setMaximum(100) self.progressBar.setValue(0) #self.pb_dir = QPushButton(self.tab) #self.pb_dir.setGeometry(QRect(80, 80, 21, 20)) #self.pb_dir.setIcon(QIcon('допочки\_folder.png')) #self.pb_dir.clicked.connect(lambda gd: self.get_directory(1)) self.pb_file = QPushButton(self.tab) self.pb_file.setGeometry(QRect(220, 80, 21, 20)) self.pb_file.setIcon(QIcon('допочки\_folder.png')) self.pb_file.clicked.connect(lambda gf: self.get_files(1)) self.pb_time = QPushButton(self.tab) self.pb_time.setGeometry(QRect(480, 240, 71, 20)) self.pb_time.setToolTip('Добавить ещё временной отрезок') self.pb_time.setEnabled(False) self.pb_time.setText("Ещё!") self.pb_transpr = QPushButton(self.tab) self.pb_transpr.setGeometry(QRect(20, 210, 21, 20)) self.pb_transpr.setToolTip('Выбрать протоколы Транспортного уровня') self.pb_transpr.setIcon(QIcon('допочки\_blank.png')) self.pb_transpr.setEnabled(False) self.pb_transpr.clicked.connect(self.TransProt_list.exec) self.pb_netpr = QPushButton(self.tab) self.pb_netpr.setGeometry(QRect(20, 320, 21, 20)) self.pb_netpr.setToolTip('Выбрать протоколы Сетевого уровня') self.pb_netpr.setIcon(QIcon('допочки\_blank.png')) self.pb_netpr.setEnabled(False) self.pb_netpr.clicked.connect(self.NetProt_list.exec) self.pb_addr = QPushButton(self.tab) self.pb_addr.setGeometry(QRect(530, 290, 132, 20)) self.pb_addr.setText('Редактировать список') self.pb_addr.setEnabled(False) self.pb_addr.clicked.connect(self.IP_list.exec) self.pb_name = QPushButton(self.tab) self.pb_name.setGeometry(QRect(220, 480, 21, 20)) self.pb_name.setIcon(QIcon('допочки\_folder.png')) self.pb_name.clicked.connect(lambda ed: self.extract_to_directory(1)) self.pb_start = QPushButton(self.tab) self.pb_start.setGeometry(QRect(220, 510, 261, 41)) self.pb_start.setText("Начать выборку") self.pb_start.clicked.connect(self.do_it_motherFucker) #self.radiobutton = QRadioButton(self.tab) #self.radiobutton.setGeometry(QRect(84, 48, 20, 20)) #self.radiobutton_2 = QRadioButton(self.tab) #self.radiobutton_2.setGeometry(QRect(424, 48, 20, 20)) #self.radiobutton.raise_() #self.radiobutton_2.raise_() self.cb_time.raise_() self.cb_prot.raise_() self.cb_addr.raise_() self.dt_beg.raise_() self.dt_end.raise_() #self.l_input_dir.raise_() #self.l_or.raise_() self.l_input_file.raise_() self.l_transpr.raise_() self.l_netpr.raise_() self.l_beg.raise_() self.l_end.raise_() self.l_name.raise_() self.l_filt.raise_() self.line.raise_() self.line_2.raise_() self.line_3.raise_() #self.le_dir.raise_() self.le_file.raise_() self.le_name.raise_() self.pt_transpr.raise_() self.pt_netpr.raise_() self.pt_addr.raise_() self.pt_log.raise_() self.progressBar.raise_() #self.pb_dir.raise_() self.pb_file.raise_() self.pb_time.raise_() self.pb_transpr.raise_() self.pb_netpr.raise_() self.pb_addr.raise_() self.pb_name.raise_() self.pb_start.raise_() self.setCentralWidget(self.centralwidget) self.statusbar = QStatusBar(self) self.setStatusBar(self.statusbar) self.tabWidget.addTab(self.tab, "") self.cb_time.clicked['bool'].connect(self.dt_beg.setEnabled) self.cb_time.clicked['bool'].connect(self.dt_end.setEnabled) self.cb_time.clicked['bool'].connect(self.l_beg.setEnabled) self.cb_time.clicked['bool'].connect(self.l_end.setEnabled) self.cb_prot.clicked['bool'].connect(self.l_transpr.setEnabled) self.cb_prot.clicked['bool'].connect(self.l_netpr.setEnabled) self.cb_prot.clicked['bool'].connect(self.pt_transpr.setEnabled) self.cb_prot.clicked['bool'].connect(self.pt_netpr.setEnabled) self.cb_prot.clicked['bool'].connect(self.pb_transpr.setEnabled) self.cb_prot.clicked['bool'].connect(self.pb_netpr.setEnabled) self.cb_addr.clicked['bool'].connect(self.pt_addr.setEnabled) self.cb_addr.clicked['bool'].connect(self.pb_addr.setEnabled) #####------------------------------2_TAB self.tab_2 = QWidget() self.tabWidget.addTab(self.tab_2, "") self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), ("II работа с файлами")) self.l_merge = QLabel(self.tab_2) self.l_merge.setGeometry(QRect(300, 10, 180, 16)) self.l_merge.setText("Объединение файлов") self.l_arch = QLabel(self.tab_2) self.l_arch.setGeometry(QRect(300, 250, 180, 16)) self.l_arch.setText("Архивирование файлов") #self.radiobutton_3 = QRadioButton(self.tab_2) #self.radiobutton_3.setGeometry(QRect(84, 48, 20, 20)) #self.radiobutton_4 = QRadioButton(self.tab_2) #self.radiobutton_4.setGeometry(QRect(424, 48, 20, 20)) #self.l_input_dir2 = QLabel(self.tab_2) #self.l_input_dir2.setGeometry(QRect(102, 50, 180, 15)) #self.l_input_dir2.setText("Выберите директорию с файлами") #self.l_or2 = QLabel(self.tab_2) #self.l_or2.setGeometry(QRect(340, 50, 21, 16)) #self.l_or2.setText("ИЛИ") self.l_input_file2 = QLabel(self.tab_2) self.l_input_file2.setGeometry(QRect(102, 50, 180, 15))#442, 50, 90, 15)) self.l_input_file2.setText("Выберите файлы") self.l_name2 = QLabel(self.tab_2) self.l_name2.setGeometry(QRect(442, 50, 180, 15))#280, 140, 180, 16)) self.l_name2.setText("Куда сохранить результат?") self.l_ciph2 = QLabel(self.tab_2) self.l_ciph2.setGeometry(QRect(84, 298, 180, 15)) self.l_ciph2.setText("Убрать шифрованный трафик") self.l_arch2 = QLabel(self.tab_2) self.l_arch2.setGeometry(QRect(424, 298, 180, 15)) self.l_arch2.setText("Заархивировать файлы") #self.le_dir2 = QLineEdit(self.tab_2) #self.le_dir2.setGeometry(QRect(110, 80, 211, 20)) #self.le_dir2.setEnabled(False) self.le_file2 = QLineEdit(self.tab_2) self.le_file2.setGeometry(QRect(110, 80, 211, 20))#450, 80, 211, 20)) self.le_file2.setReadOnly(True) self.le_name2 = QLineEdit(self.tab_2) self.le_name2.setGeometry(QRect(450, 80, 211, 20))#260, 170, 180, 20)) #self.pb_dir2 = QPushButton(self.tab_2) #self.pb_dir2.setGeometry(QRect(80, 80, 21, 20)) #self.pb_dir2.setIcon(QIcon('допочки\_folder.png')) #self.pb_dir2.clicked.connect(lambda gd: self.get_directory(2)) self.pb_file2 = QPushButton(self.tab_2) self.pb_file2.setGeometry(QRect(80, 80, 21, 20))#420, 80, 21, 20)) self.pb_file2.setIcon(QIcon('допочки\_folder.png')) self.pb_file2.clicked.connect(lambda gf: self.get_files(2)) self.pb_name2 = QPushButton(self.tab_2) self.pb_name2.setGeometry(QRect(420, 80, 21, 20))#230, 170, 21, 20)) self.pb_name2.setIcon(QIcon('допочки\_folder.png')) self.pb_name2.clicked.connect(lambda ed: self.extract_to_directory(2)) self.pb_merge = QPushButton(self.tab_2) self.pb_merge.setGeometry(QRect(270, 170, 160, 20)) self.pb_merge.setText("Объединить") self.pb_merge.clicked.connect(self.merge_it_motherFucker) self.line_4 = QFrame(self.tab_2) self.line_4.setGeometry(QRect(0, 280, 690, 15)) self.line_4.setFrameShape(QFrame.HLine) self.line_4.setFrameShadow(QFrame.Sunken) self.line_5 = QFrame(self.tab_2) self.line_5.setGeometry(QRect(0, 580, 690, 15)) self.line_5.setFrameShape(QFrame.HLine) self.line_5.setFrameShadow(QFrame.Sunken) self.pt_log2 = QPlainTextEdit(self.tab_2) self.pt_log2.setGeometry(QRect(20, 610, 651, 101)) self.pt_log2.setReadOnly(True) self.graphicsView = QGraphicsView(self.tab_2) self.graphicsView.setGeometry(QRect(0, 330, 714, 277)) self.scene = QGraphicsScene() self.graphicsView.setScene(self.scene) self.scene.addPixmap(QPixmap('допочки\_in_working_3.png')) self.l_merge.raise_() self.l_arch.raise_() #self.l_input_dir2.raise_() #self.l_or2.raise_() self.l_input_file2.raise_() self.l_name2.raise_() #self.radiobutton_3.raise_() #self.radiobutton_4.raise_() #self.pb_dir2.raise_() self.pb_file2.raise_() self.pb_name2.raise_() #self.le_dir2.raise_() self.le_file2.raise_() self.le_name2.raise_() self.line_4.raise_() self.line_5.raise_() self.pt_log2.raise_() #####------------------------------2_TAB #####------------------------------3_TAB self.tab_3 = QWidget() self.tabWidget.addTab(self.tab_3, "") self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), ("III Проверка на аномальную активность")) self.tab_3.setEnabled(False) self.l_filt3 = QLabel(self.tab_3) self.l_filt3.setGeometry(QRect(300, 10, 91, 16)) self.l_filt3.setText("Выборка пакетов") self.l_input_file3 = QLabel(self.tab_3) self.l_input_file3.setGeometry(QRect(300, 50, 90, 15)) self.l_input_file3.setText("Выберите файлы") self.pb_file3 = QPushButton(self.tab_3) self.pb_file3.setGeometry(QRect(220, 80, 21, 20)) self.pb_file3.setIcon(QIcon('допочки\_folder.png')) self.pb_file3.clicked.connect(lambda gf: self.get_files(3)) self.le_file3 = QLineEdit(self.tab_3) self.le_file3.setGeometry(QRect(250, 80, 211, 20)) self.le_file3.setReadOnly(True) self.pb_graphy = QPushButton(self.tab_3) self.pb_graphy.setGeometry(QRect(270, 170, 160, 20)) self.pb_graphy.setText("Построить граф") #self.pb_graphy.clicked.connect(self.graph_it) #self.label_6 = QLabel(self.tab_3) #self.pixmap = QPixmap('допочки\_in_working_1.png') #self.label_6.setPixmap(self.pixmap) self.l_filt3.raise_() self.l_input_file3.raise_() self.pb_file3.raise_() self.le_file3.raise_() #####------------------------------3_TAB #####----------------------------IN_WORK self.tab_4 = QWidget() self.tabWidget.addTab(self.tab_4, "") self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_4), ("...IV visualization...")) self.tab_4.setEnabled(False) self.label_7 = QLabel(self.tab_4) self.pixmap_2 = QPixmap('допочки\_in_working_2.png') self.label_7.setPixmap(self.pixmap_2) #####----------------------------IN_WORK self.tabWidget.setCurrentIndex(0) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), ("I выборка пакетов")) QMetaObject.connectSlotsByName(self) self.show() def closeEvent(self, event): reply = QMessageBox.question(self, 'Ща закроется всё', "Ты чо, реально хочешь выйти?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: event.accept() else: event.ignore() def to_center(self): qr = self.frameGeometry() qr.moveCenter(QDesktopWidget().availableGeometry().center()) self.move(qr.topLeft()) def get_directory(self, gd): if gd == 1: result = QFileDialog.getExistingDirectory() #self.le_dir.setText(result) self.le_file.setDisabled(True) #self.le_dir.setEnabled(True) #self.radiobutton_2.setChecked(False) #self.radiobutton.setChecked(True) else: result = QFileDialog.getExistingDirectory() #self.le_dir2.setText(result) self.le_file2.setDisabled(True) #self.le_dir2.setEnabled(True) #self.radiobutton_4.setChecked(False) #self.radiobutton_3.setChecked(True) def get_files(self, gf): if gf == 1: result, bullshit = QFileDialog.getOpenFileNames(self, "Выберите pcap-файлы", getcwd(), "files (*.pcap *.pcapng)") #self.le_dir.setDisabled(True) self.le_file.setEnabled(True) #self.radiobutton.setChecked(False) #self.radiobutton_2.setChecked(True) if len(result): self.le_file.setText(", ".join(result)) elif gf == 3: result, bullshit = QFileDialog.getOpenFileNames(self, "Выберите pcap-файлы", getcwd(), "files (*.pcap *.pcapng)") #self.le_dir.setDisabled(True) self.le_file3.setEnabled(True) #self.radiobutton.setChecked(False) #self.radiobutton_2.setChecked(True) if len(result): self.le_file3.setText(", ".join(result)) else: result, bullshit = QFileDialog.getOpenFileNames(self, "Выберите pcap-файлы", getcwd(), "files (*.pcap *.pcapng)") #self.le_dir2.setDisabled(True) self.le_file2.setEnabled(True) #self.radiobutton_3.setChecked(False) #self.radiobutton_4.setChecked(True) if len(result): self.le_file2.setText(", ".join(result)) def date_changed(self, dc): if dc == 1: self.dt_end.setMinimumDateTime(QDateTime(self.dt_beg.dateTime())) else: self.dt_beg.setMaximumDateTime(QDateTime(self.dt_end.dateTime())) def extract_to_directory(self, ed): if ed == 1: result, bullshit =QFileDialog.getSaveFileName(self, "Сохранить файл", getcwd(), "files (*.pcap *.pcapng)") self.le_name.setText(result) else: result, bullshit =QFileDialog.getSaveFileName(self, "Сохранить файл", getcwd(), "files (*.pcap *.pcapng)") self.le_name2.setText(result) def do_it_motherFucker(self): if self.filtering_is_on == 0: #if ((not self.radiobutton.isChecked() and not self.radiobutton_2.isChecked())\ # or (self.radiobutton.isChecked() and self.le_dir.text() == '')\ # or (self.radiobutton_2.isChecked() and self.le_file.text() == ''))\ # and self.le_name.text() == '': if self.le_file.text() == '' and self.le_name.text() == '': self.pt_log.appendPlainText(" " + "Какие файлы обработать? Куда сохранить? Такая неопределённость..") #elif (not self.radiobutton.isChecked() and not self.radiobutton_2.isChecked()) or (self.radiobutton.isChecked() and self.le_dir.text() == '') or (self.radiobutton_2.isChecked() and self.le_file.text() == ''): elif self.le_file.text() == '': self.pt_log.appendPlainText(" " + "Какие файлы обработать?") elif self.le_name.text() == '': self.pt_log.appendPlainText(" " + "Куда сохранить?") else: self.filtering_is_on = 1 # эти пиздецы в идеале нужно заменить на что-нибудь адекватное self.count_for_pr_b = 0 # эти пиздецы в идеале нужно заменить на что-нибудь адекватное self.progressBar.setValue(0) self.pb_start.setText("Остановить выборку") #my_directory = self.le_dir.text() pcap_files_in = self.le_file.text() pcap_file_out = self.le_name.text() per_quest = 0 per_beg = '' per_end = '' prot_quest = 0 net_prot = 0 trans_prot = 0 appl_prot = 0 ## ip_quest = 0 netprot_mass = [] transprot_mass = [] addr_mass = [] if (pcap_file_out.endswith(".pcap") or pcap_file_out.endswith(".pcapng")) == False: pcap_file_out = pcap_file_out + ".pcap" self.pt_log.appendPlainText("Сохранить в:") self.pt_log.appendPlainText(" " + pcap_file_out) #if self.radiobutton.isChecked(): # onlyfiles = [my_directory + '/' + f for f in listdir(my_directory) if # f.endswith(".pcap") or f.endswith(".pcapng") and isfile(join(my_directory, f))] # self.for_pr_b = len(onlyfiles) # # self.pt_log.appendPlainText("Выбрана директория:") # self.pt_log.appendPlainText(" " + self.le_dir.text()) # self.pt_log.appendPlainText("С pcap-файлами:") # for file in onlyfiles: # bullshit, fname = file.rsplit('/', 1) # self.pt_log.appendPlainText(" " + fname) #elif self.radiobutton_2.isChecked(): onlyfiles = pcap_files_in.split(', ') self.for_pr_b = len(onlyfiles) self.pt_log.appendPlainText("Выбраны pcap-файлы:") for file in onlyfiles: self.pt_log.appendPlainText(" " + (file)) if self.cb_addr.isChecked() and self.pt_addr.toPlainText() != '': ip_quest = 1 addr_mass = self.pt_addr.toPlainText().splitlines() if self.cb_time.isChecked(): per_quest = 1 per_beg = self.dt_beg.dateTime() per_end = self.dt_end.dateTime() if self.cb_prot.isChecked(): prot_quest = 1 transprot_mass = self.transprot_mass netprot_mass = self.netprot_mass if self.pt_transpr.toPlainText() != '': trans_prot = 1 if self.pt_netpr.toPlainText() != '': net_prot = 1 #self.radiobutton.setDisabled(True) #self.radiobutton_2.setDisabled(True) #self.l_input_dir.setDisabled(True) #self.l_or.setDisabled(True) self.l_input_file.setDisabled(True) #self.pb_dir.setDisabled(True) self.pb_file.setDisabled(True) #self.le_dir.setDisabled(True) self.le_file.setDisabled(True) self.cb_time.setDisabled(True) self.cb_prot.setDisabled(True) self.cb_addr.setDisabled(True) self.l_transpr.setDisabled(True) self.l_netpr.setDisabled(True) self.l_beg.setDisabled(True) self.l_end.setDisabled(True) self.l_name.setDisabled(True) self.l_filt.setDisabled(True) self.le_name.setDisabled(True) self.dt_beg.setDisabled(True) self.dt_end.setDisabled(True) self.pt_transpr.setDisabled(True) self.pt_netpr.setDisabled(True) self.pt_addr.setDisabled(True) self.pb_time.setDisabled(True) self.pb_transpr.setDisabled(True) self.pb_netpr.setDisabled(True) self.pb_addr.setDisabled(True) self.pb_name.setDisabled(True) self.worker = WorkerThread(onlyfiles, pcap_file_out, per_quest, per_beg, per_end, prot_quest, net_prot, netprot_mass, trans_prot, transprot_mass, appl_prot, ip_quest, addr_mass) self.worker.callback_received.connect(self.append_to_log) self.worker.start() self.pt_log.appendPlainText("") self.pt_log.appendPlainText("В работе:") elif self.filtering_is_on == 1: self.worker.terminate() self.pt_log.appendPlainText("") self.pt_log.appendPlainText("Работа прервана") self.pt_log.appendPlainText("") self.pt_log.appendPlainText("") self.go_to_starting_set() def append_to_log(self, x): self.count_for_pr_b += 1 self.pt_log.appendPlainText("") self.pt_log.appendPlainText(x) self.progressBar.setValue(self.count_for_pr_b * 100 / (self.for_pr_b + 1)) if self.progressBar.value() == 100: self.pt_log.appendPlainText("") self.pt_log.appendPlainText("") self.go_to_starting_set() def go_to_starting_set(self): self.filtering_is_on = 0 self.pb_start.setText("Начать выборку") #self.radiobutton.setDisabled(False) #self.radiobutton_2.setDisabled(False) #self.l_input_dir.setDisabled(False) #self.l_or.setDisabled(False) self.l_input_file.setDisabled(False) #self.pb_dir.setDisabled(False) self.pb_file.setDisabled(False) #self.le_dir.setDisabled(False) self.le_file.setDisabled(False) self.cb_time.setDisabled(False) self.cb_prot.setDisabled(False) self.cb_addr.setDisabled(False) self.l_name.setDisabled(False) self.l_filt.setDisabled(False) self.le_name.setDisabled(False) self.pb_name.setDisabled(False) if self.cb_time.isChecked(): self.dt_beg.setEnabled(True) self.dt_end.setEnabled(True) self.l_beg.setEnabled(True) self.l_end.setEnabled(True) if self.cb_prot.isChecked(): self.l_transpr.setEnabled(True) self.l_netpr.setEnabled(True) self.pt_transpr.setEnabled(True) self.pt_netpr.setEnabled(True) self.pb_transpr.setEnabled(True) self.pb_netpr.setEnabled(True) if self.cb_addr.isChecked(): self.pt_addr.setEnabled(True) self.pb_addr.setEnabled(True) def merge_it_motherFucker(self): #if self.radiobutton_3.isChecked(): # self.pt_log2.appendPlainText("Выбрана директория с pcap-файлами:") # self.pt_log2.appendPlainText(" " + self.le_dir2.text()) # self.pt_log2.appendPlainText('Просматриваем "{}"...'.format(self.le_dir2.text())) # onlyfiles = [self.le_dir2.text() + '/' + f for f in listdir(self.le_dir2.text()) if # f.endswith(".pcap") or f.endswith(".pcapng") and isfile(join(self.le_dir2.text(), f))] # self.pt_log2.appendPlainText(str(onlyfiles)) #elif self.radiobutton_4.isChecked(): self.pt_log2.appendPlainText("Выбраны pcap-файлы:") self.pt_log2.appendPlainText(" " + self.le_file2.text()) onlyfiles = self.le_file2.text().split(', ') self.pt_log2.appendPlainText('Работаем с "{}"...'.format(onlyfiles)) merge_file_out = self.le_name2.text() if (merge_file_out.endswith(".pcap") or merge_file_out.endswith(".pcapng")) == False: merge_file_out = merge_file_out + ".pcap" self.pt_log2.appendPlainText("Сохранить в:") self.pt_log2.appendPlainText(" " + merge_file_out) self.pt_log2.appendPlainText("") merge.mergecap(onlyfiles, merge_file_out)
class MainWidget(QWidget): ''' The MainWidget class is the home screen of the app and allows the user to input parameters for analysis. Attributes: output_path (str): the output path selected by the user file (str): the file path selected by the user ad_number (int): the integer selected by the user for the averaging duration ad_unit (int): the unit of time selected by the user for the averaging duration time_selected (bool): whether or not the user has selected a specific time range VALID_FILES (list of str): the list of valid file types accepted AD_UNITS (list of str): the list of time units selectable by the user time_selectors (QWidget): a widget containing the time range inputs layout (QVBoxLayout): a vertical layout for the screen ''' def __init__(self): super().__init__() # initialize variables self.output_path = None self.file = None self.ad_number = None self.ad_unit = None self.time_selected = False # single definition point for hardcoded values (valid file types and averaging duration units) self.VALID_FILES = ["xlsx", "xls", "csv"] self.AD_UNITS = ["Minutes", "Hours", "Days", "Weeks", "Months", "Years"] # create static UI elements title_label = QLabel("CDC Air Quality Analysis") title_label.setObjectName("title") file_select_layout = self.file_select_layout() output_path_layout = self.output_path_layout() averaging_duration_layout = self.averaging_duration_layout() time_range_layout = self.time_range_layout() self.time_selectors = self.create_time_selectors() # create process button and connect to function process_file = QPushButton("Process File") process_file.clicked.connect(self.begin_process) # define the layout of the screen self.layout = QVBoxLayout() self.layout.addWidget(title_label) self.layout.addLayout(file_select_layout) self.layout.addLayout(output_path_layout) self.layout.addLayout(averaging_duration_layout) self.layout.addLayout(time_range_layout) self.layout.addWidget(self.time_selectors) self.layout.addWidget(process_file) self.setLayout(self.layout) # define UI elements and layout for the file select input def file_select_layout(self): instruction_label = QLabel("Select Data File:") instruction_label.setObjectName("instruction") self.file_name = QLabel("No File Selected") self.file_name.setObjectName("fileName") self.file_name.setFixedWidth(200) button = QPushButton("Browse") button.setFixedWidth(100) button.clicked.connect(partial(self.get_file, self.file_name)) layout = QHBoxLayout() layout.addWidget(instruction_label) layout.addWidget(self.file_name) layout.addWidget(button) layout.setContentsMargins(6, 10, 6, 8) return layout # define UI elements and layout for the output path select input def output_path_layout(self): instruction_label = QLabel("Select Output Path:") instruction_label.setObjectName("instruction") self.output_select = QLabel("No Path Selected") self.output_select.setObjectName("fileName") self.output_select.setFixedWidth(200) button = QPushButton("Browse") button.setFixedWidth(100) button.clicked.connect(partial(self.get_output, self.output_select)) layout = QHBoxLayout() layout.addWidget(instruction_label) layout.addWidget(self.output_select) layout.addWidget(button) layout.setContentsMargins(6, 10, 6, 8) return layout # define UI elements and layout for averaging duration input def averaging_duration_layout(self): instruction_label = QLabel("Select Averaging Duration:") instruction_label.setObjectName("instruction") self.ad_number_input = QLineEdit(self) self.ad_number_input.setPlaceholderText("Input an Integer") self.ad_number_input.setFixedWidth(125) self.ad_number_input.setFixedHeight(25) # define dropdown menu (known as a ComboBox) self.ad_unit = self.AD_UNITS[0] # default comboBox = QComboBox(self) comboBox.setFixedWidth(100) for item in self.AD_UNITS: comboBox.addItem(item) comboBox.currentIndexChanged.connect(partial(self.selection_change, comboBox)) layout = QHBoxLayout() layout.addWidget(instruction_label) layout.addWidget(self.ad_number_input) layout.addWidget(comboBox) layout.setContentsMargins(6, 8, 6, 8) return layout # called whenever the user makes a new selection from the averaging duration dropdown def selection_change(self, cb): self.ad_unit = cb.currentText() # define UI elements and layout for the time range input def time_range_layout(self): instruction_label = QLabel("Use Time Range?") instruction_label.setObjectName("instruction") # time range is optional, so these radio buttons formalize that choice yes_rb = QRadioButton("Yes") no_rb = QRadioButton("No") no_rb.setChecked(True) yes_rb.toggled.connect(partial(self.rb_state, yes_rb)) no_rb.toggled.connect(partial(self.rb_state, no_rb)) layout = QHBoxLayout() layout.addWidget(instruction_label) layout.addWidget(yes_rb) layout.addWidget(no_rb) layout.setContentsMargins(6,8,6,8) layout.insertSpacing(1, 85) layout.insertSpacing(3, 80) return layout # define UI elements and layout for the time range selectors def create_time_selectors(self): instruction_label = QLabel("Start Time:") instruction_label.setObjectName("instruction") self.start = QDateTimeEdit(self) self.start.setCalendarPopup(True) self.start.setDateTime(QDateTime.currentDateTime()) instruction2_label = QLabel("End Time:") instruction2_label.setObjectName("instruction") self.end = QDateTimeEdit(self) self.end.setCalendarPopup(True) self.end.setDateTime(QDateTime.currentDateTime()) layout = QHBoxLayout() layout.setContentsMargins(6, 8, 6, 10) layout.addWidget(instruction_label) layout.addWidget(self.start) layout.addWidget(instruction2_label) layout.addWidget(self.end) # define a new widget so we can enable and disable it based on the radio button input widget = QWidget() widget.setLayout(layout) widget.setFixedHeight(50) widget.setEnabled(False) return widget # called when the user clicks the select file button def get_file(self, label): # get valid file types from array valid_files = "" for ext in self.VALID_FILES: valid_files += "*." + ext + " " # open file explorer dialog prefilled with valid file types file_name, _ = QFileDialog.getOpenFileName(self, "Select Data Files", "", "Data Files (" + valid_files.strip() +");;All Files (*)") # if user closes dialog without selecting a file path, it will return None if file_name: self.file = file_name.split("/")[-1] self.file_path = file_name label.setText(self.file) # called when the user clicks the select output path button def get_output(self, label): path = QFileDialog.getExistingDirectory(self, "Choose an Output Directory", options=QFileDialog.ShowDirsOnly) if path: self.output_path = path split_path = path.split("/") if len(split_path) >= 2: label.setText(split_path[-2] + "/" + split_path[-1]) else: label.setText(self.output_path) # change the state of the radio buttons and toggle the time range widget def rb_state(self, clicked): if clicked.text() == "Yes" and clicked.isChecked() == True: self.time_selectors.setEnabled(True) self.time_selected = True elif clicked.text() == "No" and clicked.isChecked() == True: self.time_selectors.setEnabled(False) self.time_selected = False # perform input validation and begin processing def begin_process(self): main_window = self.parentWidget().parentWidget() # check that a file has been selected if not self.file: main_window.raise_error("Input Error", "No File Selected", "Please select a file for analysis.") return extension = self.file.split(".")[-1] # check that the file selected is a valid file type if not extension in self.VALID_FILES: main_window.raise_error("Input Error", "Invalid File Type Selected", "Valid file types include " + ", ".join(self.VALID_FILES) + ".") return # check that the user has inputted a number and unit for averaging duration self.ad_number = self.ad_number_input.text() if not self.ad_number or not self.ad_unit: main_window.raise_error("Input Error", "Invalid Averaging Duration Selected", "Please input an integer and unit for the averaging duration.") return # check that the ad_num input is actually a number try: self.ad_number = int(self.ad_number) except ValueError: main_window.raise_error("Input Error", "Invalid Averaging Duration Selected", "Averaging duration must be a whole number.") return # check that the ad_num input is actually an integer # we want the user to be made aware that it must be an integer if not round(self.ad_number) == self.ad_number: main_window.raise_error("Input Error", "Invalid Averaging Duration Selected", "Averaging duration must be a whole number.") return # if the user has chosen a time range, make sure that end time is not before start time if self.time_selected: start_time = self.start.dateTime() end_time = self.end.dateTime() if start_time > end_time: main_window.raise_error("Input Error", "Invalid Time Entered", "End Time cannot be greater than Start Time.") return else: start_time = None end_time = None # callback to main window to initiate process and change the screen main_window.start_analysis( self.file, self.file_path, self.output_path, self.ad_number, self.ad_unit, start_time, end_time ) # reset and clear all inputs def reset(self): self.file = None self.file_name.setText("No File Selected") self.output_path = None self.output_select.setText("No Path Selected") self.ad_number = None self.ad_number_input.clear() self.start.setDateTime(QDateTime.currentDateTime()) self.end.setDateTime(QDateTime.currentDateTime())
class StockMemoEditor(QDialog): def __init__(self, sas: StockAnalysisSystem, memo_record: RecordSet, parent: QWidget = None): super(StockMemoEditor, self).__init__(parent) self.__sas = sas self.__memo_recordset = memo_record self.__current_stock = None self.__current_index = None self.__current_record: Record = None data_utility = self.__sas.get_data_hub_entry().get_data_utility( ) if self.__sas is not None else None self.__combo_stock = SecuritiesSelector(data_utility) self.__table_memo_index = EasyQTableWidget() self.__datetime_time = QDateTimeEdit(QDateTime().currentDateTime()) self.__line_brief = QLineEdit() self.__text_record = QTextEdit() self.__button_new = QPushButton('新建') self.__button_apply = QPushButton('保存') self.init_ui() self.config_ui() def init_ui(self): root_layout = QHBoxLayout() self.setLayout(root_layout) group_box, group_layout = create_v_group_box('') group_layout.addWidget(self.__combo_stock, 1) group_layout.addWidget(self.__table_memo_index, 99) root_layout.addWidget(group_box, 4) group_box, group_layout = create_v_group_box('') group_layout.addLayout( horizon_layout( [QLabel('时间:'), self.__datetime_time, self.__button_new], [1, 99, 1])) group_layout.addLayout( horizon_layout([QLabel('摘要:'), self.__line_brief], [1, 99])) group_layout.addWidget(self.__text_record) group_layout.addLayout( horizon_layout([QLabel(''), self.__button_apply], [99, 1])) root_layout.addWidget(group_box, 6) self.setMinimumSize(500, 600) def config_ui(self): self.setWindowTitle('笔记编辑器') self.__datetime_time.setCalendarPopup(True) self.__combo_stock.setEditable(False) self.__combo_stock.currentIndexChanged.connect( self.on_combo_select_changed) self.__table_memo_index.insertColumn(0) self.__table_memo_index.insertColumn(0) self.__table_memo_index.setHorizontalHeaderLabels(['时间', '摘要']) self.__table_memo_index.setSelectionMode( QAbstractItemView.SingleSelection) self.__table_memo_index.setSelectionBehavior( QAbstractItemView.SelectRows) self.__table_memo_index.itemSelectionChanged.connect( self.on_table_selection_changed) self.__table_memo_index.horizontalHeader().setSectionResizeMode( QHeaderView.ResizeToContents) self.__button_new.clicked.connect(self.on_button_new) self.__button_apply.clicked.connect(self.on_button_apply) # self.setWindowFlags( # QtCore.Qt.Window | # QtCore.Qt.CustomizeWindowHint | # QtCore.Qt.WindowTitleHint | # QtCore.Qt.WindowCloseButtonHint | # QtCore.Qt.WindowStaysOnTopHint # ) def on_button_new(self): if self.__current_stock is None: QMessageBox.information(self, '错误', '请选择需要做笔记的股票', QMessageBox.Ok, QMessageBox.Ok) self.create_new_memo(None) def on_button_apply(self): _time = self.__datetime_time.dateTime().toPyDateTime() brief = self.__line_brief.text() content = self.__text_record.toPlainText() if not str_available(brief): QMessageBox.information(self, '错误', '请至少填写笔记摘要', QMessageBox.Ok, QMessageBox.Ok) return if self.__current_index is not None: ret = self.__current_record.update_record(self.__current_index, _time, brief, content, True) else: ret, index = self.__current_record.add_record( _time, brief, content, 'memo', True) self.__current_index = index if ret: self.__reload_stock_memo() def on_combo_select_changed(self): input_securities = self.__combo_stock.get_input_securities() self.__load_stock_memo(input_securities) def on_table_selection_changed(self): if self.__current_record is None: return sel_index = self.__table_memo_index.GetCurrentIndex() if sel_index < 0: return sel_item = self.__table_memo_index.item(sel_index, 0) if item is None: return df_index = sel_item.data(Qt.UserRole) self.__load_memo_by_index(df_index) def select_stock(self, stock_identity: str): index = self.__combo_stock.findData(stock_identity) if index != -1: print('Select combox index: %s' % index) self.__combo_stock.setCurrentIndex(index) else: print('No index in combox for %s' % stock_identity) self.__combo_stock.setCurrentIndex(-1) self.__load_stock_memo(stock_identity) def select_memo_by_time(self, _time: datetime.datetime): if self.__current_record is None or self.__current_record.is_empty(): self.create_new_memo(_time) return df = self.__current_record.get_records('memo') time_serial = df['time'].dt.normalize() select_df = df[time_serial == _time.replace( hour=0, minute=0, second=0, microsecond=0)] select_index = None for index, row in select_df.iterrows(): select_index = index break if select_index is not None: self.select_memo_by_index(select_index) else: self.create_new_memo(_time) def select_memo_by_index(self, index: int): for row in range(0, self.__table_memo_index.rowCount()): table_item = self.__table_memo_index.item(row, 0) row_index = table_item.data(Qt.UserRole) if row_index == index: self.__table_memo_index.selectRow(row) break def create_new_memo(self, _time: datetime.datetime): self.__table_memo_index.clearSelection() if _time is not None: self.__datetime_time.setDateTime(_time) self.__line_brief.setText('') self.__text_record.setText('') self.__current_index = None # ------------------------------------------------------------------- def __load_stock_memo(self, stock_identity: str): print('Load stock memo for %s' % stock_identity) self.__table_memo_index.clear() self.__table_memo_index.setRowCount(0) self.__table_memo_index.setHorizontalHeaderLabels(['时间', '摘要']) self.__current_stock = stock_identity self.__current_record = None self.__current_index = None if self.__memo_recordset is None or \ self.__current_stock is None or self.__current_stock == '': return self.__current_record = self.__memo_recordset.get_record( stock_identity) df = self.__current_record.get_records('memo') select_index = None for index, row in df.iterrows(): if select_index is None: select_index = index self.__table_memo_index.AppendRow( [datetime2text(row['time']), row['brief']], index) self.select_memo_by_index(select_index) def __reload_stock_memo(self): self.__line_brief.setText('') self.__text_record.setText('') self.__table_memo_index.clear() self.__table_memo_index.setRowCount(0) self.__table_memo_index.setHorizontalHeaderLabels(['时间', '摘要']) if self.__current_record is None: print('Warning: Current record is None, cannot reload.') return df = self.__current_record.get_records('memo') select_index = self.__current_index for index, row in df.iterrows(): if select_index is None: select_index = index self.__table_memo_index.AppendRow( [datetime2text(row['time']), row['brief']], index) self.select_memo_by_index(select_index) def __load_memo_by_index(self, index: int): self.__table_memo_index.clearSelection() if self.__current_record is None or index is None: return df = self.__current_record.get_records('memo') s = df.loc[index] if len(s) == 0: return self.__current_index = index _time = s['time'] brief = s['brief'] content = s['content'] self.__datetime_time.setDateTime(to_py_datetime(_time)) self.__line_brief.setText(brief) self.__text_record.setText(content)
class MainWindow(QWidget): def __init__(self): super(MainWindow, self).__init__() self.notifications_table = QTableWidget() self.notification_title = QLineEdit() self.notification_description = QLineEdit() self.notification_type = QComboBox() self.one_time_notification_details = QComboBox() self.notification_date_time = QDateTimeEdit() self.add_notification_button = QPushButton() self.notification_list = [] self.initialize_data() self.init_ui() def init_ui(self): super(MainWindow, self).setWindowIcon(QIcon("./resources/icons/icon.png")) vertical_box = QVBoxLayout() self.setLayout(vertical_box) notifications_group = QGroupBox() notifications_group.setCheckable(False) notifications_group.setTitle("Upcoming notifications.") vertical_box.addWidget(notifications_group) vertical_table_box = QVBoxLayout() notifications_group.setLayout(vertical_table_box) vertical_table_box.addWidget(self.notifications_table) self.notifications_table.setColumnCount(6) self.notifications_table.setRowCount(3) self.notifications_table.setHorizontalHeaderLabels([ 'Title', 'Description', 'Notification type', 'Time', 'Remaining time', 'Action' ]) push_button = QPushButton("Przycisk") push_button.setStyleSheet("QPushButton{ background-color: #ff1234 }") self.notifications_table.setCellWidget(0, 5, push_button) add_notification_group = QGroupBox() add_notification_group.setTitle("Add new notification.") add_notification_group.setCheckable(False) vertical_box.addWidget(add_notification_group) add_notification_group_layout = QVBoxLayout() add_notification_group.setLayout(add_notification_group_layout) add_notification_first_line = QHBoxLayout() add_notification_second_line = QHBoxLayout() add_notification_third_line = QHBoxLayout() add_notification_fourth_line = QHBoxLayout() add_notification_group_layout.addLayout(add_notification_first_line) add_notification_group_layout.addLayout(add_notification_second_line) add_notification_group_layout.addLayout(add_notification_third_line) add_notification_group_layout.addLayout(add_notification_fourth_line) self.notification_date_time.setDateTime(QDateTime.currentDateTime()) notification_type_items = [ "One-time notification", "Cyclical notification" ] self.notification_type.addItems(notification_type_items) one_time_notification_details_types = [ "At the exact time", "After a given time" ] self.one_time_notification_details.addItems( one_time_notification_details_types) cyclical_notification_details = QComboBox() add_notification_first_line.addWidget(QLabel("Title:")) add_notification_first_line.addWidget(self.notification_title) add_notification_first_line.addStretch() add_notification_first_line.addWidget(QLabel("Notification type:")) add_notification_first_line.addWidget(self.notification_type) add_notification_second_line.addWidget(QLabel("Description")) add_notification_second_line.addWidget(self.notification_description) add_notification_second_line.addStretch() add_notification_second_line.addWidget(QLabel("Notification details")) add_notification_second_line.addWidget( self.one_time_notification_details) add_notification_third_line.addStretch() add_notification_third_line.addWidget(QLabel("Pick a time: ")) add_notification_third_line.addWidget(self.notification_date_time) self.add_notification_button.clicked.connect(self.handle_add_button) self.add_notification_button.setText("Add") add_notification_fourth_line.addStretch() add_notification_fourth_line.addWidget(self.add_notification_button) self.setGeometry(600, 300, 600, 300) self.setWindowTitle("Reminder") self.show() def save_data(self) -> None: pass def initialize_data(self) -> None: pass def handle_add_button(self) -> None: pass def handle_notification_type_changed(self) -> None: pass def handle_notification_details_changed(self) -> None: pass def handle_time_changed(self) -> None: pass
class StockMemoEditor(QDialog): def __init__(self, history: History): super(StockMemoEditor, self).__init__() self.__history = history self.__source = '' self.__current_record = None self.__label_uuid = QLabel() self.__label_source = QLabel() self.__text_record = QTextEdit() self.__datetime_time = QDateTimeEdit(QDateTime.currentDateTime()) self.__button_apply = QPushButton('保存') self.__button_cancel = QPushButton('取消') self.init_ui() self.config_ui() def init_ui(self): root_layout = QVBoxLayout() self.setLayout(root_layout) group_box, group_layout = create_v_group_box('') group_layout.addWidget(self.__label_uuid) group_layout.addWidget(self.__label_source) group_layout.addWidget(self.__datetime_time) # group_layout.addLayout(horizon_layout([QLabel('笔记ID'), self.__label_uuid])) # group_layout.addLayout(horizon_layout([QLabel('笔记文件'), self.__label_source])) # group_layout.addLayout(horizon_layout([QLabel('记录时间'), self.__datetime_time])) root_layout.addWidget(group_box, 0) root_layout.addWidget(self.__text_record, 10) root_layout.addLayout(horizon_layout([self.__button_apply, self.__button_cancel])) self.setMinimumSize(500, 600) def config_ui(self): self.__label_uuid.setEnabled(False) self.__label_source.setEnabled(False) self.setWindowTitle('笔记') self.__datetime_time.setCalendarPopup(True) self.__button_apply.clicked.connect(self.on_button_apply) self.__button_cancel.clicked.connect(self.on_button_cancel) def on_button_apply(self): if self.__current_record is None: self.__current_record = HistoricalRecord() else: self.__current_record.reset() if not self.ui_to_record(self.__current_record): QMessageBox.information(self, QtCore.QCoreApplication.translate('History', '错误'), QtCore.QCoreApplication.translate('History', '采集界面数据错误'), QMessageBox.Ok, QMessageBox.Ok) return if self.__source is None or self.__source == '': QMessageBox.information(self, QtCore.QCoreApplication.translate('History', '错误'), QtCore.QCoreApplication.translate('History', '没有指定数据源,无法保存'), QMessageBox.Ok, QMessageBox.Ok) return self.__current_record.set_source(self.__source) self.__history.update_records([self.__current_record]) records = self.__history.get_record_by_source(self.__source) result = HistoricalRecordLoader.to_local_source(records, self.__source) if not result: QMessageBox.information(self, QtCore.QCoreApplication.translate('History', '错误'), QtCore.QCoreApplication.translate('History', '保存到数据源 [%s] 失败' % self.__source), QMessageBox.Ok, QMessageBox.Ok) return self.close() def on_button_cancel(self): self.close() # --------------------------------------------------------------------------- def set_memo(self, memo: HistoricalRecord): self.__current_record = memo self.__source = memo.source() self.record_to_ui(memo) def set_source(self, source: str): self.__source = source def set_memo_datetime(self, date_time: datetime.datetime): self.__datetime_time.setDateTime(date_time) # -------------------------------- Operation -------------------------------- def clear_ui(self): self.__label_uuid.setText('') self.__label_source.setText('') self.__text_record.clear() def ui_to_record(self, record: HistoricalRecord) -> bool: input_time = self.__datetime_time.dateTime() input_memo = self.__text_record.toPlainText() date_time = input_time.toPyDateTime() record.set_label_tags('time', date_time.strftime('%Y-%m-%d %H:%M:%S')) record.set_label_tags('event', input_memo) record.set_focus_label('time') return True def record_to_ui(self, record: HistoricalRecord or str): self.clear_ui() self.__label_uuid.setText(LabelTagParser.tags_to_text(record.uuid())) self.__label_source.setText(self.__source) self.__text_record.setText(LabelTagParser.tags_to_text(record.event())) since = record.since() pytime = HistoryTime.tick_to_pytime(since) self.__datetime_time.setDateTime(pytime)
class Downtime(QDialog): """ Class who create Downtime QDialog for hosts/services """ def __init__(self, parent=None): super(Downtime, self).__init__(parent) self.setWindowTitle('Request a Downtime') self.setWindowFlags(Qt.FramelessWindowHint) self.setStyleSheet(get_css()) self.setWindowIcon(QIcon(get_image_path('icon'))) self.setMinimumSize(360, 460) # Fields self.fixed = True self.duration = QTimeEdit() self.start_time = QDateTimeEdit() self.end_time = QDateTimeEdit() self.comment_edit = QTextEdit() def initialize(self, item_type, item_name, comment): """ Initialize Downtime QDialog :param item_type: type of item to acknowledge : host | service :type item_type: str :param item_name: name of the item to acknowledge :type item_name: str :param comment: the default comment of action :type comment: str """ # Main layout main_layout = QVBoxLayout(self) main_layout.setContentsMargins(0, 0, 0, 0) main_layout.addWidget(get_logo_widget(self)) downtime_widget = QWidget() downtime_widget.setObjectName('login') downtime_layout = QGridLayout(downtime_widget) ack_title = QLabel('<h2>Request a downtime</h2>') downtime_layout.addWidget(ack_title, 0, 0, 1, 3) host_label = QLabel('<h2>%s: %s</h2>' % (item_type.capitalize(), item_name)) downtime_layout.addWidget(host_label, 1, 0, 1, 1) options_label = QLabel('Downtime options:') options_label.setObjectName('actions') downtime_layout.addWidget(options_label, 2, 0, 1, 1) fixed_checkbox = QCheckBox() fixed_checkbox.setObjectName('actions') fixed_checkbox.setChecked(self.fixed) fixed_checkbox.setFixedSize(18, 18) downtime_layout.addWidget(fixed_checkbox, 2, 1, 1, 1) fixed_label = QLabel('Fixed') fixed_label.setObjectName('actions') downtime_layout.addWidget(fixed_label, 2, 2, 1, 1) fixed_info = QLabel( '<i>If checked, downtime will start and end at the times specified' ' by the “start time” and “end time” fields.</i>') fixed_info.setWordWrap(True) downtime_layout.addWidget(fixed_info, 3, 0, 1, 3) duration_label = QLabel('Duration') duration_label.setObjectName('actions') downtime_layout.addWidget(duration_label, 4, 0, 1, 1) duration_clock = QLabel() duration_clock.setPixmap(QPixmap(get_image_path('clock'))) downtime_layout.addWidget(duration_clock, 4, 1, 1, 1) duration_clock.setFixedSize(16, 16) duration_clock.setScaledContents(True) self.duration.setTime(QTime(4, 00)) self.duration.setDisplayFormat("HH'h'mm") downtime_layout.addWidget(self.duration, 4, 2, 1, 1) duration_info = QLabel( '<i>Sets the duration if it is a non-fixed downtime.</i>') downtime_layout.addWidget(duration_info, 5, 0, 1, 3) date_range_label = QLabel('Downtime date range') date_range_label.setObjectName('actions') downtime_layout.addWidget(date_range_label, 6, 0, 1, 1) calendar_label = QLabel() calendar_label.setPixmap(QPixmap(get_image_path('calendar'))) calendar_label.setFixedSize(16, 16) calendar_label.setScaledContents(True) downtime_layout.addWidget(calendar_label, 6, 1, 1, 1) start_time_label = QLabel('Start time:') downtime_layout.addWidget(start_time_label, 7, 0, 1, 1) self.start_time.setCalendarPopup(True) self.start_time.setDateTime(datetime.datetime.now()) self.start_time.setDisplayFormat("dd/MM/yyyy HH'h'mm") downtime_layout.addWidget(self.start_time, 7, 1, 1, 2) end_time_label = QLabel('End time:') downtime_layout.addWidget(end_time_label, 8, 0, 1, 1) self.end_time.setCalendarPopup(True) self.end_time.setDateTime(datetime.datetime.now() + datetime.timedelta(hours=2)) self.end_time.setDisplayFormat("dd/MM/yyyy HH'h'mm") downtime_layout.addWidget(self.end_time, 8, 1, 1, 2) self.comment_edit.setText(comment) self.comment_edit.setMaximumHeight(60) downtime_layout.addWidget(self.comment_edit, 9, 0, 1, 3) request_btn = QPushButton('REQUEST DOWNTIME', self) request_btn.clicked.connect(self.handle_accept) request_btn.setObjectName('valid') request_btn.setMinimumHeight(30) request_btn.setDefault(True) downtime_layout.addWidget(request_btn, 10, 0, 1, 3) main_layout.addWidget(downtime_widget) def duration_to_seconds(self): """ Return "duration" QTimeEdit value in seconds :return: "duration" in seconds :rtype: int """ return QTime(0, 0).secsTo(self.duration.time()) def handle_accept(self): """ Check if end_time timestamp is not lower than start_time """ if self.start_time.dateTime().toTime_t() > self.end_time.dateTime( ).toTime_t(): logger.warning( 'Try to add Downtime with "End Time" lower than "Start Time"') else: self.accept() def mousePressEvent(self, event): """ QWidget.mousePressEvent(QMouseEvent) """ self.offset = event.pos() def mouseMoveEvent(self, event): """ QWidget.mousePressEvent(QMouseEvent) """ try: x = event.globalX() y = event.globalY() x_w = self.offset.x() y_w = self.offset.y() self.move(x - x_w, y - y_w) except AttributeError as e: logger.warning('Move Event %s: %s', self.objectName(), str(e))
class LogFilterDialog(QDialog): OPERATION_OPTIONS = ['', 'insert', 'delete'] TABLENAME_OPTIONS = ['', 'blocks', 'devices', 'measurements',\ 'raw_data_view'] def __init__(self, parent=None): super(LogFilterDialog, self).__init__(parent) self.accepted.connect(self.createFilter) self.operationCombo = QComboBox() self.operationCombo.addItems(LogFilterDialog.OPERATION_OPTIONS) self.tablenameCombo = QComboBox() self.tablenameCombo.addItems(LogFilterDialog.TABLENAME_OPTIONS) self.fromEdit = QDateTimeEdit() self.toEdit = QDateTimeEdit() groupLayout = QFormLayout() groupLayout.addRow("Od: ", self.fromEdit) groupLayout.addRow("Do: ", self.toEdit) groupLayout.addRow("Operace: ", self.operationCombo) groupLayout.addRow("Tabulka: ", self.tablenameCombo) rejectButton = QPushButton("Storno") rejectButton.clicked.connect(self.reject) acceptButton = QPushButton("OK") acceptButton.clicked.connect(self.accept) buttonsLayout = QHBoxLayout() buttonsLayout.addStretch(1) buttonsLayout.addWidget(acceptButton) buttonsLayout.addWidget(rejectButton) layout = QVBoxLayout() layout.addLayout(groupLayout) layout.addSpacing(12) layout.addLayout(buttonsLayout) self.setLayout(layout) self.setMinimumWidth(300) self.setWindowTitle("Filtrování logů") def initControls(self, filter_): selected = filter_.get('operation', '') try: index = LogFilterDialog.OPERATION_OPTIONS.index(selected) except ValueError: index = 0 self.operationCombo.setCurrentIndex(index) selected = filter_.get('tablename', '') try: index = LogFilterDialog.TABLENAME_OPTIONS.index(selected) except ValueError: index = 0 self.tablenameCombo.setCurrentIndex(index) start = filter_.get('start_datetime', None) if start is None: start = datetime.utcnow() start = calendar.timegm(start.timetuple()) - 3600*24 else: start = calendar.timegm(start.timetuple()) end = filter_.get('end_datetime', datetime.utcnow()) end = calendar.timegm(end.timetuple()) self.fromEdit.setDateTime(QDateTime.fromTime_t(start, TZ)) self.toEdit.setDateTime(QDateTime.fromTime_t(end, TZ)) def getFilter(self): filter_ = {} start = self.fromEdit.dateTime().toTime_t() end = self.toEdit.dateTime().toTime_t() filter_['start_datetime'] = datetime.utcfromtimestamp(start) filter_['end_datetime'] = datetime.utcfromtimestamp(end) if self.operationCombo.currentText(): filter_['operation'] = self.operationCombo.currentText() if self.tablenameCombo.currentText(): filter_['tablename'] = self.tablenameCombo.currentText() return filter_ @pyqtSlot() def createFilter(self): self._filter = self.getFilter() def filter(self): return self._filter
class DataHubUi(QWidget): def __init__(self, data_center: UniversalDataCenter): super(DataHubUi, self).__init__() self.__data_center = data_center self.__translate = QtCore.QCoreApplication.translate self.__combo_uri = QComboBox() self.__line_identity = QLineEdit() self.__table_main = EasyQTableWidget() self.__datetime_since = QDateTimeEdit() self.__datetime_until = QDateTimeEdit() self.__button_query = QPushButton(self.__translate('', 'Query')) self.__check_identity_enable = QCheckBox( self.__translate('', 'Identity')) self.__check_datetime_enable = QCheckBox( self.__translate('', 'Datetime')) self.init_ui() # ---------------------------------------------------- UI Init ----------------------------------------------------- def init_ui(self): self.__layout_control() self.__config_control() def __layout_control(self): main_layout = QVBoxLayout() self.setLayout(main_layout) line = QHBoxLayout() line.addWidget(QLabel(self.__translate('', 'URI')), 0) line.addWidget(self.__combo_uri, 10) main_layout.addLayout(line) line = QHBoxLayout() line.addWidget(self.__check_identity_enable, 0) line.addWidget(self.__line_identity, 10) main_layout.addLayout(line) line = QHBoxLayout() line.addWidget(self.__check_datetime_enable, 0) line.addWidget(self.__datetime_since, 10) line.addWidget(self.__datetime_until, 10) main_layout.addLayout(line) line = QHBoxLayout() line.addWidget(QLabel(' '), 10) line.addWidget(self.__button_query, 1) main_layout.addLayout(line) main_layout.addWidget(self.__table_main) def __config_control(self): # self.__combo_uri.setEditable(True) self.__check_identity_enable.setChecked(True) self.__check_datetime_enable.setChecked(True) self.__datetime_since.setDateTime(default_since()) self.__datetime_until.setDateTime(now()) self.__button_query.clicked.connect(self.on_button_query) all_uri = self.__data_center.get_all_uri() for uri in all_uri: self.__combo_uri.addItem(uri) def on_button_query(self): uri = self.__combo_uri.currentText() identity = self.__line_identity.text( ) if self.__check_identity_enable.isChecked() else None since = self.__datetime_since.dateTime().toPyDateTime( ) if self.__check_datetime_enable.isChecked() else None until = self.__datetime_until.dateTime().toPyDateTime( ) if self.__check_datetime_enable.isChecked() else None result = self.__data_center.query( uri, identity, (since, until)) if self.__data_center is not None else None if result is not None and '_id' in result.columns: del result['_id'] write_df_to_qtable(result, self.__table_main)
class MainWindow(QWidget): def __init__(self, parent=None): super().__init__(parent) self.files = files.get_files() self.height = 300 self.checkboxes = [] self.col_selects = [] self.initUI() def initUI(self): self.layout = QVBoxLayout() pic = QLabel() pic.setPixmap(QPixmap(os.getcwd() + "/logo3.jpg")) self.layout.addWidget(pic) self.flash_msg = QLabel("") self.flash_msg.setStyleSheet("QLabel { color : red; }") self.layout.addWidget(self.flash_msg) self.flash_msg.hide() self.layout.addWidget(QLabel("Wähle Größen:")) for file in self.files: checkbox = QCheckBox() text = "{} ({})".format(str(file), file.unit) checkbox.setText(text) self.layout.addWidget(checkbox) self.checkboxes.append(checkbox) col_select = Col_select(file.columns) col_select.hide() self.col_selects.append(col_select) self.layout.addWidget(col_select) checkbox.stateChanged.connect(self.toggle_checkbox(col_select)) self._set_date_time_edit() button = QPushButton("Weiter") button.clicked.connect(self.plot) self.layout.addWidget(button) self.setGeometry(300, 300, 200, self.height) self.setLayout(self.layout) self.setWindowTitle('Csv Plotter') self.show() def _set_date_time_edit(self): gridLayout = QGridLayout() self.start = QDateTimeEdit() self.end = QDateTimeEdit() gridLayout.addWidget(QLabel("Startzeit"), 0, 0) gridLayout.addWidget(self.start, 0, 1) gridLayout.addWidget(QLabel("Endzeit"), 1, 0) gridLayout.addWidget(self.end, 1, 1) self.layout.addLayout(gridLayout) def _check_submission(self, files_, columns): "checks if submit is valid, shows error message if not" msg = "" for idx, col in enumerate(columns): if col == []: msg = ("Bitte eine Größe zu folgender Kategorie auswählen: {}" .format(files_[idx].quantity)) if len(set((file.unit for file in files_))) != 1: msg = "Die Ausgewählten Größen haben unterschiedliche Einheiten." if msg: self.flash_msg.setText(msg) self.flash_msg.show() return False self.flash_msg.hide() return True def plot(self): files_and_columns = [(file, col_select) for file, checkbox, col_select in zip(self.files, self.checkboxes, self.col_selects) if checkbox.isChecked()] files_ = [file for file, col in files_and_columns] columns = [col.get_selected() for file, col in files_and_columns] if not self._check_submission(files_, columns): return files.plot_files(self.start.dateTime().toPyDateTime(), self.end.dateTime().toPyDateTime(), files_, columns) def _set_start(self, py_datetime): qt_datetime = _datetime_to_Qdatetime(py_datetime) if self.start.dateTime() < qt_datetime: self.start.setDateTime(qt_datetime) def _set_end(self, py_datetime): qt_datetime = _datetime_to_Qdatetime(py_datetime) default = QDateTime.fromString("2000-01-01 00:00:00,0" , "yyyy-MM-dd HH:mm:ss,z") if self.end.dateTime() > qt_datetime or self.end.dateTime() == default: self.end.setDateTime(qt_datetime) def toggle_checkbox(self, cb): "expand or collapse more options" def wrapped(): cb.show() if cb.isHidden() else cb.hide() self.height += 100 if cb.isHidden() else - 100 self.resize(200, self.height) file_ind = self.col_selects.index(cb) file = self.files[file_ind] self._set_start(file.start) self._set_end(file.end) return wrapped
class QtDBConsoleWindow(QMainWindow): def __init__(self, master): super(QtDBConsoleWindow, self).__init__() self.master = master self.connection = self.master.connection self.GroupBoxSeg = [1, 10, 1] self.processing = [] #Fixme: QTimer to be added to update the page automatically self.mainWidget = QWidget() self.mainLayout = QGridLayout() self.mainWidget.setLayout(self.mainLayout) self.setCentralWidget(self.mainWidget) self.occupied() self.setLoginUI() self.createHeadLine() self.createMain() self.createApp() if isActive(self.connection): self.connectDB() def setLoginUI(self): self.setGeometry(200, 200, 600, 1200) self.setWindowTitle('Database Console') self.menubar = self.menuBar() self.menubar.setNativeMenuBar(False) ################################################### ## Database Menu ################################################### self.actionDatabase = self.menubar.addMenu("&Database") self.ViewerAction = QAction("&View Table") self.ViewerAction.triggered.connect(self.viewTable) self.actionDatabase.addAction(self.ViewerAction) ################################################### ## Image Menu ################################################### self.actionImage = self.menubar.addMenu("&Image") self.InsertImgAction = QAction("&Insert Image") self.InsertImgAction.triggered.connect(self.insertImage) self.actionImage.addAction(self.InsertImgAction) self.ViewImgAction = QAction("&View Image") self.ViewImgAction.triggered.connect(self.viewImage) self.actionImage.addAction(self.ViewImgAction) ################################################### ## Shipment Menu ################################################### self.actionShipment = self.menubar.addMenu("&Shipment") self.sendPackAction = QAction("&Send Package") self.sendPackAction.triggered.connect(self.sendPackage) self.actionShipment.addAction(self.sendPackAction) self.receivePackAction = QAction("&Receive Package") self.receivePackAction.triggered.connect(self.receivePackage) self.actionShipment.addAction(self.receivePackAction) ################################################### ## User Menu ################################################### self.actionUser = self.menubar.addMenu("&User") self.ShowUserAction = QAction("&Show Users", self) self.ShowUserAction.triggered.connect(self.displayUsers) self.actionUser.addAction(self.ShowUserAction) self.AddUserAction = QAction("&Add Users", self) self.AddUserAction.triggered.connect(self.addUsers) self.actionUser.addAction(self.AddUserAction) self.UpdateUserAction = QAction("&Update Profile", self) self.UpdateUserAction.triggered.connect(self.updateProfile) self.actionUser.addAction(self.UpdateUserAction) self.ShowInstAction = QAction("&Show institute", self) self.ShowInstAction.triggered.connect(self.displayInstitue) self.actionUser.addAction(self.ShowInstAction) ################################################### ## Miscellanea Menu ################################################### self.actionMiscel = self.menubar.addMenu("&Miscellanea") self.ComplaintAction = QAction("&Submit Complaint", self) self.ComplaintAction.triggered.connect(self.fileComplaint) self.actionMiscel.addAction(self.ComplaintAction) self.show() def activateMenuBar(self): self.menubar.setDisabled(False) def deactivateMenuBar(self): self.menubar.setDisabled(True) def enableMenuItem(self, item, enabled): item.setEnabled(enabled) ########################################################################## ## Functions for Table Viewer ########################################################################## def viewTable(self): viewTableTab = QtViewTableTab(self) self.MainTabs.addTab(viewTableTab, "Database Viewer") self.MainTabs.setCurrentWidget(viewTableTab) ########################################################################## ## Functions for Table Viewer (END) ########################################################################## ########################################################################## ## Functions for Image ########################################################################## def insertImage(self): insertImageTab = QtImageInsertionTab(self) self.InsertImgAction.setDisabled(True) self.MainTabs.addTab(insertImageTab, "Insert Image") self.MainTabs.setCurrentWidget(insertImageTab) def viewImage(self): viewImageTab = QtImageViewerTab(self) self.MainTabs.addTab(viewImageTab, "Image Viewer") self.MainTabs.setCurrentWidget(viewImageTab) ########################################################################## ## Functions for Image (END) ########################################################################## ########################################################################## ## Functions for Shipment ########################################################################## def sendPackage(self): self.sendPackageTab = QWidget() # Add tabs self.MainTabs.addTab(self.sendPackageTab, "Send Package") self.sendPackAction.setDisabled(True) self.sendPackageTab.layout = QGridLayout(self) sendPackageLabel = QLabel('<font size="12"> Package Delivery </font>') sendPackageLabel.setMaximumHeight(60) self.SPSenderLabel = QLabel('Sender:') self.SPSenderEdit = QLineEdit('') self.SPSenderEdit.setEchoMode(QLineEdit.Normal) self.SPSenderEdit.setPlaceholderText('Sender Name') self.SPReceiverLabel = QLabel('Receiver:') self.SPReceiverEdit = QLineEdit('') self.SPReceiverEdit.setEchoMode(QLineEdit.Normal) self.SPReceiverEdit.setPlaceholderText('Receiver Name') self.SPReceiverEdit.setDisabled(True) siteList = getByColumnName("institute", describeInstitute(self.connection), retrieveAllInstitute(self.connection)) self.SPOriginLabel = QLabel('Origin:') self.SPOriginCombo = QComboBox() self.SPOriginCombo.addItems(["{0}".format(x) for x in siteList]) self.SPDestinationLabel = QLabel('Destination:') self.SPDestinationCombo = QComboBox() self.SPDestinationCombo.addItems(["{0}".format(x) for x in siteList]) self.SPDateSentLabel = QLabel('date sent:') self.SPDateSentEdit = QDateTimeEdit() self.SPDateSentEdit.setDateTime(QDateTime.currentDateTime()) self.SPDateReceivedLabel = QLabel('date received:') self.SPDateReceivedEdit = QDateTimeEdit() self.SPDateReceivedEdit.setDisabled(True) #self.SPDateReceivedEdit.setDateTime(QDateTime.currentDateTime()) self.SPCarrierLabel = QLabel('Carrier:') self.SPCarrierEdit = QLineEdit('') self.SPCarrierEdit.setEchoMode(QLineEdit.Normal) self.SPCarrierEdit.setPlaceholderText('carrier name') self.SPTrackingLabel = QLabel('Tracking Number:') self.SPTrackingEdit = QLineEdit('') self.SPTrackingEdit.setEchoMode(QLineEdit.Normal) self.SPTrackingEdit.setPlaceholderText('Tracking Code') self.SPCommentLabel = QLabel('Comment:') self.SPCommentEdit = QTextEdit('') self.SPCommentEdit.setPlaceholderText("Your comment") self.SPFeedBackLabel = QLabel() self.SPSubmitButton = QPushButton('Submit') self.SPSubmitButton.clicked.connect(self.submitSPRequest) self.sendPackageTab.layout.addWidget(sendPackageLabel, 0, 0, 1, 4, Qt.AlignTop) self.sendPackageTab.layout.addWidget(self.SPSenderLabel, 1, 0, 1, 1) self.sendPackageTab.layout.addWidget(self.SPSenderEdit, 1, 1, 1, 1) self.sendPackageTab.layout.addWidget(self.SPDateSentLabel, 1, 2, 1, 1) self.sendPackageTab.layout.addWidget(self.SPDateSentEdit, 1, 3, 1, 1) self.sendPackageTab.layout.addWidget(self.SPOriginLabel, 2, 0, 1, 1) self.sendPackageTab.layout.addWidget(self.SPOriginCombo, 2, 1, 1, 1) self.sendPackageTab.layout.addWidget(self.SPDestinationLabel, 2, 2, 1, 1) self.sendPackageTab.layout.addWidget(self.SPDestinationCombo, 2, 3, 1, 1) self.sendPackageTab.layout.addWidget(self.SPCarrierLabel, 3, 0, 1, 1) self.sendPackageTab.layout.addWidget(self.SPCarrierEdit, 3, 1, 1, 1) self.sendPackageTab.layout.addWidget(self.SPTrackingLabel, 3, 2, 1, 1) self.sendPackageTab.layout.addWidget(self.SPTrackingEdit, 3, 3, 1, 1) self.sendPackageTab.layout.addWidget(self.SPCommentLabel, 4, 0, 1, 4, Qt.AlignLeft) self.sendPackageTab.layout.addWidget(self.SPCommentEdit, 5, 0, 3, 4) self.sendPackageTab.layout.addWidget(self.SPFeedBackLabel, 8, 0, 1, 2) self.sendPackageTab.layout.addWidget(self.SPSubmitButton, 8, 3, 1, 1) self.sendPackageTab.setLayout(self.sendPackageTab.layout) self.MainTabs.setCurrentWidget(self.sendPackageTab) def submitSPRequest(self): if self.SPTrackingEdit.text() == "": self.SPFeedBackLabel.setText( "Please make sure Tracking Number are filled") return if self.SPSenderEdit.text() == "": self.SPFeedBackLabel.setText("Please make sure sender are filled") return Args = describeTable(self.connection, "shipment") Data = [] SubmitArgs = [] for arg in Args: if arg == "origin": Data.append(self.SPOriginCombo.currentText()) SubmitArgs.append(arg) if arg == "destination": Data.append(self.SPDestinationCombo.currentText()) SubmitArgs.append(arg) if arg == "sender": Data.append(self.SPSenderEdit.text()) SubmitArgs.append(arg) if arg == "date_sent": Data.append(self.SPDateSentEdit.dateTime().toUTC().toString( "yyyy-dd-MM hh:mm:ss.z")) SubmitArgs.append(arg) if arg == "carrier": Data.append(self.SPCarrierEdit.text()) SubmitArgs.append(arg) if arg == "tracking_number": Data.append(self.SPTrackingEdit.text()) SubmitArgs.append(arg) if arg == "comment": Data.append(self.SPCommentEdit.toPlainText()) SubmitArgs.append(arg) try: insertGenericTable(self.connection, "shipment", SubmitArgs, Data) except: print("Failed to submit the shipment record") return self.SPSenderLabel.deleteLater() self.SPSenderEdit.deleteLater() self.SPDateSentLabel.deleteLater() self.SPDateSentEdit.deleteLater() self.SPOriginLabel.deleteLater() self.SPOriginCombo.deleteLater() self.SPDestinationLabel.deleteLater() self.SPDestinationCombo.deleteLater() self.SPCarrierLabel.deleteLater() self.SPCarrierEdit.deleteLater() self.SPTrackingLabel.deleteLater() self.SPTrackingEdit.deleteLater() self.SPCommentLabel.deleteLater() self.SPCommentEdit.deleteLater() self.SPFeedBackLabel.deleteLater() self.SPSubmitButton.deleteLater() self.sendPackageTab.layout.removeWidget(self.SPSenderLabel) self.sendPackageTab.layout.removeWidget(self.SPSenderEdit) self.sendPackageTab.layout.removeWidget(self.SPDateSentLabel) self.sendPackageTab.layout.removeWidget(self.SPDateSentEdit) self.sendPackageTab.layout.removeWidget(self.SPOriginLabel) self.sendPackageTab.layout.removeWidget(self.SPOriginCombo) #self.sendPackageTab.layout.removeWidget(self.SPDestinationLabel) #self.sendPackageTab.layout.removeWidget(self.SPDestinationCombo) self.sendPackageTab.layout.removeWidget(self.SPCarrierLabel) self.sendPackageTab.layout.removeWidget(self.SPCarrierEdit) self.sendPackageTab.layout.removeWidget(self.SPTrackingLabel) self.sendPackageTab.layout.removeWidget(self.SPTrackingEdit) self.sendPackageTab.layout.removeWidget(self.SPCommentLabel) self.sendPackageTab.layout.removeWidget(self.SPCommentEdit) self.sendPackageTab.layout.removeWidget(self.SPFeedBackLabel) self.sendPackageTab.layout.removeWidget(self.SPSubmitButton) self.SPFeedBackLabel = QLabel("Submitted") self.SPFeedBackLabel.setStyleSheet("color:green") self.SPContinueButton = QPushButton('Continue') self.SPContinueButton.clicked.connect(self.recreateSP) self.SPCloseButton = QPushButton('Close') self.SPCloseButton.clicked.connect(self.closeSP) self.sendPackageTab.layout.addWidget(self.SPFeedBackLabel, 1, 0, 1, 2) self.sendPackageTab.layout.addWidget(self.SPContinueButton, 1, 3, 1, 1) self.sendPackageTab.layout.addWidget(self.SPCloseButton, 1, 4, 1, 1) return def recreateSP(self): self.closeTab(self.MainTabs.currentIndex()) self.sendPackage() def closeSP(self): self.closeTab(self.MainTabs.currentIndex()) def receivePackage(self): self.receivePackageTab = QWidget() # Add tabs self.MainTabs.addTab(self.receivePackageTab, "Receive Package") self.receivePackAction.setDisabled(True) self.receivePackageTab.layout = QGridLayout(self) receivePackageLabel = QLabel( '<font size="12"> Package Delivery </font>') receivePackageLabel.setMaximumHeight(60) self.RPIDLabel = QLabel('ID:') self.RPIDEdit = QLineEdit('') self.RPIDEdit.setEchoMode(QLineEdit.Normal) self.RPIDEdit.setPlaceholderText('Shipment ID') self.RPFetchButton = QPushButton("Fetch") self.RPFetchButton.clicked.connect(self.fillRPRequest) self.RPSenderLabel = QLabel('Sender:') self.RPSenderEdit = QLineEdit('') self.RPSenderEdit.setEchoMode(QLineEdit.Normal) self.RPSenderEdit.setPlaceholderText('Sender Name') self.RPSenderEdit.setDisabled(True) self.RPReceiverLabel = QLabel('Receiver:') self.RPReceiverEdit = QLineEdit('') self.RPReceiverEdit.setEchoMode(QLineEdit.Normal) self.RPReceiverEdit.setPlaceholderText('Receiver Name') siteList = getByColumnName("institute", describeInstitute(self.connection), retrieveAllInstitute(self.connection)) self.RPOriginLabel = QLabel('Origin:') self.RPOriginCombo = QComboBox() self.RPOriginCombo.addItems(["{0}".format(x) for x in siteList]) self.RPOriginCombo.setDisabled(True) self.RPDestinationLabel = QLabel('Destination:') self.RPDestinationCombo = QComboBox() self.RPDestinationCombo.addItems(["{0}".format(x) for x in siteList]) self.RPDestinationCombo.setDisabled(True) self.RPDateSentLabel = QLabel('date sent:') self.RPDateSentEdit = QDateTimeEdit() #self.RPDateSentEdit.setDateTime(QDateTime.currentDateTime()) self.RPDateSentEdit.setDisabled(True) self.RPDateReceivedLabel = QLabel('date received:') self.RPDateReceivedEdit = QDateTimeEdit() self.RPDateReceivedEdit.setDateTime(QDateTime.currentDateTime()) self.RPCarrierLabel = QLabel('Carrier:') self.RPCarrierEdit = QLineEdit('') self.RPCarrierEdit.setEchoMode(QLineEdit.Normal) self.RPCarrierEdit.setPlaceholderText('carrier name') self.RPCarrierEdit.setDisabled(True) self.RPTrackingLabel = QLabel('Tracking Number:') self.RPTrackingEdit = QLineEdit('') self.RPTrackingEdit.setEchoMode(QLineEdit.Normal) self.RPTrackingEdit.setPlaceholderText('Tracking Code') self.RPTrackingEdit.setDisabled(True) self.RPCommentLabel = QLabel('Comment:') self.RPCommentEdit = QTextEdit('') self.RPCommentEdit.setPlaceholderText("Your comment") self.RPFeedBackLabel = QLabel() self.RPSubmitButton = QPushButton('Submit') self.RPSubmitButton.clicked.connect(self.submitRPRequest) self.receivePackageTab.layout.addWidget(receivePackageLabel, 0, 0, 1, 4, Qt.AlignTop) self.receivePackageTab.layout.addWidget(self.RPIDLabel, 1, 0, 1, 1) self.receivePackageTab.layout.addWidget(self.RPIDEdit, 1, 1, 1, 1) self.receivePackageTab.layout.addWidget(self.RPFetchButton, 1, 2, 1, 1) self.receivePackageTab.layout.addWidget(self.RPSenderLabel, 2, 0, 1, 1) self.receivePackageTab.layout.addWidget(self.RPSenderEdit, 2, 1, 1, 1) self.receivePackageTab.layout.addWidget(self.RPDateSentLabel, 2, 2, 1, 1) self.receivePackageTab.layout.addWidget(self.RPDateSentEdit, 2, 3, 1, 1) self.receivePackageTab.layout.addWidget(self.RPReceiverLabel, 3, 0, 1, 1) self.receivePackageTab.layout.addWidget(self.RPReceiverEdit, 3, 1, 1, 1) self.receivePackageTab.layout.addWidget(self.RPDateReceivedLabel, 3, 2, 1, 1) self.receivePackageTab.layout.addWidget(self.RPDateReceivedEdit, 3, 3, 1, 1) self.receivePackageTab.layout.addWidget(self.RPOriginLabel, 4, 0, 1, 1) self.receivePackageTab.layout.addWidget(self.RPOriginCombo, 4, 1, 1, 1) self.receivePackageTab.layout.addWidget(self.RPDestinationLabel, 4, 2, 1, 1) self.receivePackageTab.layout.addWidget(self.RPDestinationCombo, 4, 3, 1, 1) self.receivePackageTab.layout.addWidget(self.RPCarrierLabel, 5, 0, 1, 1) self.receivePackageTab.layout.addWidget(self.RPCarrierEdit, 5, 1, 1, 1) self.receivePackageTab.layout.addWidget(self.RPTrackingLabel, 5, 2, 1, 1) self.receivePackageTab.layout.addWidget(self.RPTrackingEdit, 5, 3, 1, 1) self.receivePackageTab.layout.addWidget(self.RPCommentLabel, 6, 0, 1, 4, Qt.AlignLeft) self.receivePackageTab.layout.addWidget(self.RPCommentEdit, 7, 0, 3, 4) self.receivePackageTab.layout.addWidget(self.RPFeedBackLabel, 10, 0, 1, 3) self.receivePackageTab.layout.addWidget(self.RPSubmitButton, 10, 3, 1, 1) self.receivePackageTab.setLayout(self.receivePackageTab.layout) self.MainTabs.setCurrentWidget(self.receivePackageTab) def fillRPRequest(self): try: header = describeTable(self.connection, "shipment", True) shipmentInfo = retrieveWithConstraint(self.connection, "shipment", id=self.RPIDEdit.text()) except: return if len(shipmentInfo) > 0 and len(header) == len(shipmentInfo[0]): self.RPFeedBackLabel.setText("Delivery Record found") self.RPSenderEdit.setText( getByColumnName("sender", header, shipmentInfo)[0]) origin_index = self.RPOriginCombo.findText( getByColumnName("origin", header, shipmentInfo)[0]) self.RPOriginCombo.setCurrentIndex(origin_index) destination_index = self.RPDestinationCombo.findText( getByColumnName("destination", header, shipmentInfo)[0]) self.RPDestinationCombo.setCurrentIndex(destination_index) time_string = getByColumnName( "date_sent", header, shipmentInfo)[0].strftime("%m/%d/%Y, %H:%M:%S") print(time_string) self.RPDateSentEdit.setDateTime(QDateTime.fromString(time_string)) self.RPCarrierEdit.setText( getByColumnName("carrier", header, shipmentInfo)[0]) self.RPTrackingEdit.setText( getByColumnName("tracking_number", header, shipmentInfo)[0]) self.RPCommentEdit.setText( getByColumnName("comment", header, shipmentInfo)[0]) else: self.RPFeedBackLabel.setText("Shipment ID not found") self.RPSenderEdit.setText("") origin_index = self.RPOriginCombo.findText("") self.RPOriginCombo.setCurrentIndex(origin_index) destination_index = self.RPDestinationCombo.findText("") self.RPDestinationCombo.setCurrentIndex(destination_index) #time_string = datetime.strftime("%m/%d/%Y, %H:%M:%S") #self.RPDateSentEdit.setDateTime(QDateTime.fromString(time_string)) self.RPCarrierEdit.setText("") self.RPTrackingEdit.setText("") self.RPCommentEdit.setText("") def submitRPRequest(self): if self.RPTrackingEdit.text() == "": self.RPFeedBackLabel.setText( "Please make sure Tracking Number are filled") return if self.RPReceiverEdit.text() == "": self.RPFeedBackLabel.setText( "Please make sure receiver are filled") return if self.RPDateReceivedEdit.text() == "": self.RPFeedBackLabel.setText( "Please make sure received time are filled") return Args = describeTable(self.connection, "shipment") Data = [] SubmitArgs = [] for arg in Args: if arg == "receiver": Data.append(self.RPReceiverEdit.text()) SubmitArgs.append(arg) if arg == "date_received": Data.append( self.RPDateReceivedEdit.dateTime().toUTC().toString( "yyyy-dd-MM hh:mm:ss.z")) SubmitArgs.append(arg) if arg == "comment": Data.append(self.RPCommentEdit.toPlainText()) SubmitArgs.append(arg) try: updateGenericTable(self.connection, "shipment", SubmitArgs, Data, id=int(self.RPIDEdit.text())) except: print("Failed to submit the shipment record") return self.RPIDLabel.deleteLater() self.RPIDEdit.deleteLater() self.RPFetchButton.deleteLater() self.RPSenderLabel.deleteLater() self.RPSenderEdit.deleteLater() self.RPDateSentLabel.deleteLater() self.RPDateSentEdit.deleteLater() self.RPReceiverLabel.deleteLater() self.RPReceiverEdit.deleteLater() self.RPDateReceivedLabel.deleteLater() self.RPDateReceivedEdit.deleteLater() self.RPOriginLabel.deleteLater() self.RPOriginCombo.deleteLater() self.RPDestinationLabel.deleteLater() self.RPDestinationCombo.deleteLater() self.RPCarrierLabel.deleteLater() self.RPCarrierEdit.deleteLater() self.RPTrackingLabel.deleteLater() self.RPTrackingEdit.deleteLater() self.RPCommentLabel.deleteLater() self.RPCommentEdit.deleteLater() self.RPFeedBackLabel.deleteLater() self.RPSubmitButton.deleteLater() self.receivePackageTab.layout.removeWidget(self.RPIDEdit) self.receivePackageTab.layout.removeWidget(self.RPIDLabel) self.receivePackageTab.layout.removeWidget(self.RPFetchButton) self.receivePackageTab.layout.removeWidget(self.RPSenderLabel) self.receivePackageTab.layout.removeWidget(self.RPSenderEdit) self.receivePackageTab.layout.removeWidget(self.RPDateSentLabel) self.receivePackageTab.layout.removeWidget(self.RPDateSentEdit) self.receivePackageTab.layout.removeWidget(self.RPReceiverLabel) self.receivePackageTab.layout.removeWidget(self.RPReceiverEdit) self.receivePackageTab.layout.removeWidget(self.RPDateReceivedLabel) self.receivePackageTab.layout.removeWidget(self.RPDateReceivedEdit) self.receivePackageTab.layout.removeWidget(self.RPOriginLabel) self.receivePackageTab.layout.removeWidget(self.RPOriginCombo) self.receivePackageTab.layout.removeWidget(self.RPDestinationLabel) self.receivePackageTab.layout.removeWidget(self.RPDestinationCombo) self.receivePackageTab.layout.removeWidget(self.RPCarrierLabel) self.receivePackageTab.layout.removeWidget(self.RPCarrierEdit) self.receivePackageTab.layout.removeWidget(self.RPTrackingLabel) self.receivePackageTab.layout.removeWidget(self.RPTrackingEdit) self.receivePackageTab.layout.removeWidget(self.RPCommentLabel) self.receivePackageTab.layout.removeWidget(self.RPCommentEdit) self.receivePackageTab.layout.removeWidget(self.RPFeedBackLabel) self.receivePackageTab.layout.removeWidget(self.RPSubmitButton) self.RPFeedBackLabel = QLabel("Submitted") self.RPFeedBackLabel.setStyleSheet("color:green") self.RPContinueButton = QPushButton('Continue') self.RPContinueButton.clicked.connect(self.recreateRP) self.RPCloseButton = QPushButton('Close') self.RPCloseButton.clicked.connect(self.closeRP) self.receivePackageTab.layout.addWidget(self.RPFeedBackLabel, 1, 0, 1, 2) self.receivePackageTab.layout.addWidget(self.RPContinueButton, 1, 3, 1, 1) self.receivePackageTab.layout.addWidget(self.RPCloseButton, 1, 4, 1, 1) return def recreateRP(self): self.closeTab(self.MainTabs.currentIndex()) self.receivePackage() def closeRP(self): self.closeTab(self.MainTabs.currentIndex()) ########################################################################## ## Functions for Shipment (END) ########################################################################## def displayUsers(self): self.processing.append("UserDisplay") UserDisplayTab = QWidget() # Add tabs self.MainTabs.addTab(UserDisplayTab, "User List") UserDisplayTab.layout = QGridLayout() dataList = ([describeTable(self.connection, "people")] + retrieveGenericTable(self.connection, "people")) proxy = QtDBTableWidget(dataList, 0) lineEdit = QLineEdit() lineEdit.textChanged.connect(proxy.on_lineEdit_textChanged) view = QTableView() view.setSortingEnabled(True) comboBox = QComboBox() comboBox.addItems(["{0}".format(x) for x in dataList[0]]) comboBox.currentIndexChanged.connect( proxy.on_comboBox_currentIndexChanged) label = QLabel() label.setText("Regex Filter") view.setModel(proxy) view.setSelectionBehavior(QAbstractItemView.SelectRows) view.setSelectionMode(QAbstractItemView.MultiSelection) view.setEditTriggers(QAbstractItemView.NoEditTriggers) UserDisplayTab.layout.addWidget(lineEdit, 0, 1, 1, 1) UserDisplayTab.layout.addWidget(view, 1, 0, 1, 3) UserDisplayTab.layout.addWidget(comboBox, 0, 2, 1, 1) UserDisplayTab.layout.addWidget(label, 0, 0, 1, 1) UserDisplayTab.setLayout(UserDisplayTab.layout) self.MainTabs.setCurrentWidget(UserDisplayTab) ########################################################################## ## Functions for Managing Users ########################################################################## def addUsers(self): ## Fixme: disable the menu when tab exists, relieaze the menu when closed. self.processing.append("AddUser") AddingUserTab = QWidget() # Add tabs self.MainTabs.addTab(AddingUserTab, "Adding User") self.AddUserAction.setDisabled(True) AddingUserTab.layout = QGridLayout(self) AddUserLabel = QLabel('<font size="12"> Creating new user: </font>') AddUserLabel.setMaximumHeight(60) self.AUNewUsernameLabel = QLabel('username') self.AUNewUsernameEdit = QLineEdit('') self.AUNewUsernameEdit.setEchoMode(QLineEdit.Normal) self.AUNewUsernameEdit.setPlaceholderText('new username') self.AUPasswordLabel = QLabel('password') self.AUPasswordEdit = QLineEdit('') self.AUPasswordEdit.setEchoMode(QLineEdit.Password) self.AUPasswordEdit.setPlaceholderText('new password') self.AURePasswordLabel = QLabel('re-password') self.AURePasswordEdit = QLineEdit('') self.AURePasswordEdit.setEchoMode(QLineEdit.Password) self.AURePasswordEdit.setPlaceholderText('verify password') self.AUNameLabel = QLabel('*name') self.AUNameEdit = QLineEdit('') self.AUNameEdit.setEchoMode(QLineEdit.Normal) self.AUNameEdit.setPlaceholderText('short name') self.AUFullNameLabel = QLabel('*full name') self.AUFullNameEdit = QLineEdit('') self.AUFullNameEdit.setEchoMode(QLineEdit.Normal) self.AUFullNameEdit.setPlaceholderText('full name') self.AUEmailLabel = QLabel('e-mail') self.AUEmailEdit = QLineEdit('') self.AUEmailEdit.setEchoMode(QLineEdit.Normal) self.AUEmailEdit.setPlaceholderText('*****@*****.**') self.AUInstLabel = QLabel('institute') self.AUInstComboBox = QComboBox() siteList = getByColumnName("description", describeInstitute(self.connection), retrieveAllInstitute(self.connection)) self.AUInstComboBox.addItems(["{0}".format(x) for x in siteList]) self.AUFeedBackLabel = QLabel() self.AUSubmitButton = QPushButton('Submit') self.AUSubmitButton.clicked.connect(self.submitAURequest) AddingUserTab.layout.addWidget(AddUserLabel, 0, 0, 1, 4) AddingUserTab.layout.addWidget(self.AUNewUsernameLabel, 1, 0, 1, 1) AddingUserTab.layout.addWidget(self.AUNewUsernameEdit, 1, 1, 1, 1) AddingUserTab.layout.addWidget(self.AUPasswordLabel, 2, 0, 1, 1) AddingUserTab.layout.addWidget(self.AUPasswordEdit, 2, 1, 1, 1) AddingUserTab.layout.addWidget(self.AURePasswordLabel, 3, 0, 1, 1) AddingUserTab.layout.addWidget(self.AURePasswordEdit, 3, 1, 1, 1) AddingUserTab.layout.addWidget(self.AUNameLabel, 4, 0, 1, 1) AddingUserTab.layout.addWidget(self.AUNameEdit, 4, 1, 1, 1) AddingUserTab.layout.addWidget(self.AUFullNameLabel, 4, 2, 1, 1) AddingUserTab.layout.addWidget(self.AUFullNameEdit, 4, 3, 1, 1) AddingUserTab.layout.addWidget(self.AUEmailLabel, 5, 0, 1, 1) AddingUserTab.layout.addWidget(self.AUEmailEdit, 5, 1, 1, 1) AddingUserTab.layout.addWidget(self.AUInstLabel, 5, 2, 1, 1) AddingUserTab.layout.addWidget(self.AUInstComboBox, 5, 3, 1, 1) AddingUserTab.layout.addWidget(self.AUFeedBackLabel, 6, 0, 1, 3) AddingUserTab.layout.addWidget(self.AUSubmitButton, 6, 3, 1, 1) AddingUserTab.setLayout(AddingUserTab.layout) self.MainTabs.setCurrentWidget(AddingUserTab) #self.enableMenuItem(self.AddingUserTab, False) def submitAURequest(self): # check the password consistency if self.AUNewUsernameEdit.text() == "" or self.AUNameEdit.text( ) == "" or self.AUFullNameEdit.text() == "": self.AUFeedBackLabel.setText("key blank is empty") return if self.AUPasswordEdit.text() != self.AURePasswordEdit.text(): self.AUFeedBackLabel.setText("passwords are inconsistent") self.AUPasswordEdit.setText("") self.AURePasswordEdit.setText("") return try: InstituteInfo = retrieveWithConstraint( self.connection, "institute", description=str(self.AUInstComboBox.currentText())) InstName = getByColumnName( "institute", describeTable(self.connection, "institute"), InstituteInfo) TimeZone = getByColumnName( "timezone", describeTable(self.connection, "institute"), InstituteInfo) except: self.AUFeedBackLabel.setText( "Failed to extract institute info, try to reconnect to DB") Args = describeTable(self.connection, "people") Data = [] Data.append(self.AUNewUsernameEdit.text()) Data.append(self.AUNameEdit.text()) Data.append(self.AUFullNameEdit.text()) Data.append(self.AUEmailEdit.text()) Data.append(InstName[0]) Data.append(self.AUPasswordEdit.text()) Data.append(TimeZone[0]) Data.append(0) try: createNewUser(self.connection, Args, Data) self.AUFeedBackLabel.setText("Query submitted") self.AUFeedBackLabel.setStyleSheet("color:green") return except: print("submitFailed") return def updateProfile(self): pass ########################################################################## ## Functions for Adding Users (END) ########################################################################## ########################################################################## ## Functions for Institutes display ########################################################################## def displayInstitue(self): self.processing.append("InstituteDisplay") displayInstiTab = QWidget() # Add tabs self.MainTabs.addTab(displayInstiTab, "Institutes") displayInstiTab.layout = QGridLayout(self) dataList = ([describeInstitute(self.connection)] + retrieveAllInstitute(self.connection)) proxy = QtDBTableWidget(dataList, 0) lineEdit = QLineEdit() lineEdit.textChanged.connect(proxy.on_lineEdit_textChanged) view = QTableView() view.setSortingEnabled(True) comboBox = QComboBox() comboBox.addItems(["{0}".format(x) for x in dataList[0]]) comboBox.currentIndexChanged.connect( proxy.on_comboBox_currentIndexChanged) label = QLabel() label.setText("Regex Filter") view.setModel(proxy) view.setSelectionBehavior(QAbstractItemView.SelectRows) view.setSelectionMode(QAbstractItemView.MultiSelection) view.setEditTriggers(QAbstractItemView.NoEditTriggers) displayInstiTab.layout.addWidget(lineEdit, 0, 1, 1, 1) displayInstiTab.layout.addWidget(view, 1, 0, 1, 3) displayInstiTab.layout.addWidget(comboBox, 0, 2, 1, 1) displayInstiTab.layout.addWidget(label, 0, 0, 1, 1) displayInstiTab.setLayout(displayInstiTab.layout) self.MainTabs.setCurrentWidget(displayInstiTab) ########################################################################## ## Functions for Institutes display (END) ########################################################################## ########################################################################## ## Functions for Complaint submission ########################################################################## def fileComplaint(self): self.ComplaintTab = QWidget() # Add tabs self.MainTabs.addTab(self.ComplaintTab, "Complaint") self.ComplaintAction.setDisabled(True) self.ComplaintTab.layout = QGridLayout(self) ComplaintLabel = QLabel( '<font size="12"> Submit the complaint </font>') ComplaintLabel.setMaximumHeight(60) self.FCNameLabel = QLabel('Name:') self.FCNameEdit = QLineEdit('') self.FCNameEdit.setEchoMode(QLineEdit.Normal) TableInfo = describeTable(self.connection, "people") UserInfo = retrieveWithConstraint(self.connection, "people", username=self.TryUsername) ShortName = getByColumnName("name", TableInfo, UserInfo) if len(ShortName) > 0: self.FCNameEdit.setText(str(ShortName[0])) self.FCDateTimeLabel = QLabel('Date(local)') self.FCDateTimeEdit = QDateTimeEdit() self.FCDateTimeEdit.setDateTime(QDateTime.currentDateTime()) self.FCCommentLabel = QLabel('Comment:') self.FCCommentEdit = QTextEdit('') self.FCCommentEdit.setPlaceholderText("Your comment") self.FCFeedBackLabel = QLabel() self.FCSubmitButton = QPushButton('Submit') self.FCSubmitButton.clicked.connect(self.submitFCRequest) self.ComplaintTab.layout.addWidget(ComplaintLabel, 0, 0, 1, 4, Qt.AlignTop) self.ComplaintTab.layout.addWidget(self.FCNameLabel, 1, 0, 1, 1) self.ComplaintTab.layout.addWidget(self.FCNameEdit, 1, 1, 1, 1) self.ComplaintTab.layout.addWidget(self.FCDateTimeLabel, 1, 2, 1, 1) self.ComplaintTab.layout.addWidget(self.FCDateTimeEdit, 1, 3, 1, 1) self.ComplaintTab.layout.addWidget(self.FCCommentLabel, 2, 0, 1, 4, Qt.AlignLeft) self.ComplaintTab.layout.addWidget(self.FCCommentEdit, 3, 0, 6, 4) self.ComplaintTab.layout.addWidget(self.FCFeedBackLabel, 9, 0, 1, 2) self.ComplaintTab.layout.addWidget(self.FCSubmitButton, 9, 3, 1, 1) self.ComplaintTab.setLayout(self.ComplaintTab.layout) self.MainTabs.setCurrentWidget(self.ComplaintTab) def submitFCRequest(self): if self.FCNameEdit.text() == "" or self.FCCommentEdit.toPlainText( ) == "": self.FCFeedBackLabel.setText( "Please make sure the name/comment are filled") return Args = describeTable(self.connection, "complaint") Data = [] Data.append(self.FCDateTimeEdit.dateTime().toUTC().toString( "yyyy-dd-MM hh:mm:ss.z")) Data.append(self.FCCommentEdit.toPlainText()) Data.append(self.FCNameEdit.text()) print(Data) try: insertGenericTable(self.connection, "complaint", Args, Data) except: print("Failed to submit the text") return self.FCNameLabel.deleteLater() self.FCNameEdit.deleteLater() self.FCDateTimeLabel.deleteLater() self.FCDateTimeEdit.deleteLater() self.FCCommentLabel.deleteLater() self.FCCommentEdit.deleteLater() self.FCFeedBackLabel.deleteLater() self.FCSubmitButton.deleteLater() self.ComplaintTab.layout.removeWidget(self.FCNameLabel) self.ComplaintTab.layout.removeWidget(self.FCNameEdit) self.ComplaintTab.layout.removeWidget(self.FCDateTimeLabel) self.ComplaintTab.layout.removeWidget(self.FCDateTimeEdit) self.ComplaintTab.layout.removeWidget(self.FCCommentLabel) self.ComplaintTab.layout.removeWidget(self.FCCommentEdit) self.ComplaintTab.layout.removeWidget(self.FCFeedBackLabel) self.ComplaintTab.layout.removeWidget(self.FCSubmitButton) self.FCFeedBackLabel = QLabel("Submitted") self.FCFeedBackLabel.setStyleSheet("color:green") self.FCContinueButton = QPushButton('Continue') self.FCContinueButton.clicked.connect(self.recreateFC) self.ComplaintTab.layout.addWidget(self.FCFeedBackLabel, 1, 0, 1, 2) self.ComplaintTab.layout.addWidget(self.FCContinueButton, 1, 3, 1, 1) return def recreateFC(self): self.closeTab(self.MainTabs.currentIndex()) self.fileComplaint() ########################################################################## ## Functions for Complaint submission (END) ########################################################################## def createHeadLine(self): self.deactivateMenuBar() self.HeadBox = QGroupBox() self.HeadLayout = QHBoxLayout() UsernameLabel = QLabel("Username:"******"Password:"******"Host IP:") self.HostEdit = QLineEdit('128.146.38.1') self.HostEdit.setEchoMode(QLineEdit.Normal) self.HostEdit.setMinimumWidth(150) self.HostEdit.setMaximumHeight(30) DatabaseLabel = QLabel("Database:") self.DatabaseEdit = QLineEdit('SampleDB') self.DatabaseEdit.setEchoMode(QLineEdit.Normal) self.DatabaseEdit.setMinimumWidth(150) self.DatabaseEdit.setMaximumHeight(30) self.ConnectButton = QPushButton("&Connect to DB") self.ConnectButton.clicked.connect(self.connectDB) self.HeadLayout.addWidget(UsernameLabel) self.HeadLayout.addWidget(self.UsernameEdit) self.HeadLayout.addWidget(PasswordLabel) self.HeadLayout.addWidget(self.PasswordEdit) self.HeadLayout.addWidget(HostLabel) self.HeadLayout.addWidget(self.HostEdit) self.HeadLayout.addWidget(DatabaseLabel) self.HeadLayout.addWidget(self.DatabaseEdit) self.HeadLayout.addWidget(self.ConnectButton) self.HeadBox.setLayout(self.HeadLayout) self.mainLayout.addWidget(self.HeadBox, 0, 0, self.GroupBoxSeg[0], 1) def destroyHeadLine(self): self.HeadBox.deleteLater() self.mainLayout.removeWidget(self.HeadBox) def clearLogInfo(self): self.connection = "Offline" def connectedHeadLine(self): self.activateMenuBar() self.HeadBox.deleteLater() self.mainLayout.removeWidget(self.HeadBox) self.HeadBox = QGroupBox() self.HeadLayout = QHBoxLayout() WelcomeLabel = QLabel("Hello,{}!".format(self.TryUsername)) statusString, colorString = checkDBConnection(self.connection) DBStatusLabel = QLabel() DBStatusLabel.setText("Database:{}/{}".format(self.TryHostAddress, self.TryDatabase)) DBStatusValue = QLabel() DBStatusValue.setText(statusString) DBStatusValue.setStyleSheet(colorString) self.SwitchButton = QPushButton("&Switch DB") self.SwitchButton.clicked.connect(self.destroyHeadLine) self.SwitchButton.clicked.connect(self.clearLogInfo) self.SwitchButton.clicked.connect(self.createHeadLine) self.HeadLayout.addWidget(WelcomeLabel) self.HeadLayout.addStretch(1) self.HeadLayout.addWidget(DBStatusLabel) self.HeadLayout.addWidget(DBStatusValue) self.HeadLayout.addWidget(self.SwitchButton) self.HeadBox.setLayout(self.HeadLayout) self.HeadBox.setLayout(self.HeadLayout) self.mainLayout.addWidget(self.HeadBox, 0, 0, self.GroupBoxSeg[0], 1) def createMain(self): self.MainBodyBox = QGroupBox() self.mainbodylayout = QHBoxLayout() self.MainTabs = QTabWidget() self.MainTabs.setTabsClosable(True) self.MainTabs.tabCloseRequested.connect( lambda index: self.closeTab(index)) self.mainbodylayout.addWidget(self.MainTabs) self.MainBodyBox.setLayout(self.mainbodylayout) self.mainLayout.addWidget(self.MainBodyBox, sum(self.GroupBoxSeg[0:1]), 0, self.GroupBoxSeg[1], 1) def destroyMain(self): self.MainBodyBox.deleteLater() self.mainLayout.removeWidget(self.MainBodyBox) def createApp(self): self.AppOption = QGroupBox() self.StartLayout = QHBoxLayout() self.ResetButton = QPushButton("&Refresh") self.FinishButton = QPushButton("&Finish") self.FinishButton.setDefault(True) self.FinishButton.clicked.connect(self.closeWindow) self.StartLayout.addWidget(self.ResetButton) self.StartLayout.addWidget(self.FinishButton) self.StartLayout.addStretch(1) self.AppOption.setLayout(self.StartLayout) self.mainLayout.addWidget(self.AppOption, sum(self.GroupBoxSeg[0:2]), 0, self.GroupBoxSeg[2], 1) def destroyApp(self): self.AppOption.deleteLater() self.mainLayout.removeWidget(self.AppOption) def sendBackSignal(self): self.backSignal = True def connectDB(self): try: if isActive(self.connection): self.TryUsername = self.master.TryUsername self.TryHostAddress = self.master.TryHostAddress self.TryDatabase = self.master.TryDatabase self.connectedHeadLine() return self.TryUsername = self.UsernameEdit.text() self.TryPassword = self.PasswordEdit.text() self.TryHostAddress = self.HostEdit.text() self.TryDatabase = self.DatabaseEdit.text() if self.TryUsername == '': msg.information(None, "Error", "Please enter a valid username", QMessageBox.Ok) return self.connection = QtStartConnection(self.TryUsername, self.TryPassword, self.TryHostAddress, self.TryDatabase) if isActive(self.connection): self.connectedHeadLine() except Exception as err: print("Error in connecting to database, {}".format(repr(err))) def syncDB(self): pass def changeDBList(self): self.DBNames = DBNames[str(self.HostName.currentText())] self.DatabaseCombo.clear() self.DatabaseCombo.addItems(self.DBNames) self.DatabaseCombo.setCurrentIndex(0) def closeTab(self, index): self.releaseAction(self.MainTabs.tabText(index)) self.MainTabs.removeTab(index) def releaseAction(self, text): if text == "Adding User": self.AddUserAction.setDisabled(False) return if text == "Complaint": self.ComplaintAction.setDisabled(False) return if text == "Send Package": self.sendPackAction.setDisabled(False) return if text == "Receive Package": self.receivePackAction.setDisabled(False) return if text == "Insert Image": self.InsertImgAction.setDisabled(False) return def closeWindow(self): self.close() self.release() def occupied(self): self.master.DBConsoleButton.setDisabled(True) def release(self): self.master.DBConsoleButton.setDisabled(False) def closeEvent(self, event): #Fixme: strict criterias for process checking should be added here: #if self.ProcessingTest == True: # QMessageBox.critical(self, 'Critical Message', 'There is running process, can not close!') # event.ignore() reply = QMessageBox.question( self, 'Window Close', 'Are you sure you want to exit, all unsubmitted content will be lost?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: print('DB console terminated') event.accept() else: event.ignore()