class Window(QWidget): def __init__(self): super().__init__() # Make widgets ################# self.edit1 = QDateEdit() self.edit2 = QDateEdit() self.edit3 = QDateEdit() self.edit1.setMinimumDate(datetime.date(year=2017, month=9, day=1)) self.edit2.setMinimumDate(datetime.date(year=2017, month=9, day=1)) self.edit3.setMinimumDate(datetime.date(year=2017, month=9, day=1)) self.edit1.setMaximumDate(datetime.date(year=2020, month=9, day=1)) self.edit2.setMaximumDate(datetime.date(year=2020, month=9, day=1)) self.edit3.setMaximumDate(datetime.date(year=2020, month=9, day=1)) self.edit1.setDate(datetime.datetime.now().date()) self.edit2.setDate(datetime.datetime.now().date()) self.edit3.setDate(datetime.datetime.now().date()) 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") self.edit2.setDisplayFormat("dd/MM/yyyy") self.edit3.setDisplayFormat("dddd d MMMM yyyy") 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())
def addRemoveInvoiceTIme(self): self.toolFrame = QFrame() self.toolFrame.setWindowTitle("Platinum Sql Date Corrector") self.toolFrame.setWindowIcon(QIcon("C:\Platinum\Icons\icon_p.ico")) self.toolFrame.resize(600, 300) startDate = QDateEdit() startDate.setDisplayFormat("yyyy-MM-dd") startTime = QTimeEdit() startTime.setDisplayFormat("HH:mm:ss") endDate = QDateEdit() endDate.setDisplayFormat("yyyy-MM-dd") endTime = QTimeEdit() endTime.setDisplayFormat("HH:mm:ss") timeToAdd = QTimeEdit() timeToAdd.setDisplayFormat("HH:mm:ss") runButton = QPushButton("Add Script") runButton.clicked.connect( lambda: self.runScript(startDate.text(), startTime.text( ), endDate.text(), endTime.text(), timeToAdd.text())) subTractScript = QPushButton("Subtract Script") subTractScript.clicked.connect( lambda: self.runScript2(startDate.text(), startTime.text( ), endDate.text(), endTime.text(), timeToAdd.text())) maingrid = QGridLayout() maingrid.addWidget(QLabel("Start Date"), 0, 0) maingrid.addWidget(startDate, 0, 1) maingrid.addWidget(QLabel("Start Time"), 1, 0) maingrid.addWidget(startTime, 1, 1) maingrid.addWidget(QLabel("End Date"), 0, 2) maingrid.addWidget(endDate, 0, 3) maingrid.addWidget(QLabel("End Time"), 1, 2) maingrid.addWidget(endTime, 1, 3) maingrid.addWidget(QLabel("Time"), 2, 0) maingrid.addWidget(timeToAdd, 2, 1) maingrid.addWidget(runButton, 3, 0, 1, 4) maingrid.addWidget(subTractScript, 4, 0, 1, 4) self.toolFrame.setLayout(maingrid) self.toolFrame.show()
class EditSMSLink(QDialog): def __init__(self, sms_data, *args, **kwargs): super(EditSMSLink, self).__init__(*args, **kwargs) layout = QVBoxLayout(margin=0) print(sms_data) self.sms_id = sms_data['id'] # 时间布局 date_time_layout = QHBoxLayout() self.date_edit = QDateEdit(QDate.fromString(sms_data['date'], 'yyyy-MM-dd')) self.date_edit.setCalendarPopup(True) self.date_edit.setDisplayFormat('yyyy-MM-dd') date_time_layout.addWidget(QLabel('日期:')) date_time_layout.addWidget(self.date_edit) date_time_layout.addWidget(QLabel('时间:')) self.time_edit = QTimeEdit(QTime.fromString(sms_data['time'], 'HH:mm:ss')) self.time_edit.setDisplayFormat('HH:mm:ss') date_time_layout.addWidget(self.time_edit) date_time_layout.addStretch() layout.addLayout(date_time_layout) self.show_tips = QLabel() self.text_edit = QTextEdit(textChanged=self.set_show_tips_null) self.text_edit.setPlainText(sms_data['content']) layout.addWidget(self.text_edit) layout.addWidget(self.show_tips) layout.addWidget(QPushButton('确定', clicked=self.commit_sms_edited), alignment=Qt.AlignRight) self.setLayout(layout) self.resize(420, 240) self.setWindowTitle('编辑短信通') def set_show_tips_null(self): self.show_tips.setText('') # 确定提交修改 def commit_sms_edited(self): text = self.text_edit.toPlainText().strip(' ') if not text: self.show_tips.setText('请输入内容。') return # 提交 try: r = requests.put( url=settings.SERVER_ADDR + 'info/sms/' + str(self.sms_id) + '/?mc=' + settings.app_dawn.value('machine'), headers={'AUTHORIZATION': settings.app_dawn.value('AUTHORIZATION')}, data=json.dumps({ 'date': self.date_edit.text(), 'time': self.time_edit.text(), 'content': text }) ) response = json.loads(r.content.decode('utf-8')) if r.status_code != 201: raise ValueError(response['message']) except Exception as e: QMessageBox.information(self, '错误', str(e)) else: QMessageBox.information(self,'成功', '修改成功!') self.close()
class CreateNewTradePolicyPopup(QDialog): def __init__(self, *args, **kwargs): super(CreateNewTradePolicyPopup, self).__init__(*args, **kwargs) layout = QVBoxLayout(margin=0) # 时间布局 date_time_layout = QHBoxLayout() self.date_edit = QDateEdit(QDate.currentDate()) self.date_edit.setCalendarPopup(True) self.date_edit.setDisplayFormat('yyyy-MM-dd') date_time_layout.addWidget(QLabel('日期:')) date_time_layout.addWidget(self.date_edit) date_time_layout.addWidget(QLabel('时间:')) self.time_edit = QTimeEdit(QTime.currentTime()) self.time_edit.setDisplayFormat('HH:mm:ss') date_time_layout.addWidget(self.time_edit) date_time_layout.addStretch() layout.addLayout(date_time_layout) self.text_edit = QTextEdit(textChanged=self.set_show_tips_null) layout.addWidget(self.text_edit) self.show_tips = QLabel() layout.addWidget(self.show_tips) layout.addWidget(QPushButton('确定', clicked=self.commit_trade_policy), alignment=Qt.AlignRight) self.setLayout(layout) self.resize(400, 200) self.setWindowTitle('新建短信通') def set_show_tips_null(self): self.show_tips.setText('') # 确定增加 def commit_trade_policy(self): text = self.text_edit.toPlainText().strip(' ') if not text: self.show_tips.setText('请输入内容。') return # 提交 try: r = requests.post( url=settings.SERVER_ADDR + 'info/trade-policy/?mc=' + settings.app_dawn.value('machine'), headers={'AUTHORIZATION': settings.app_dawn.value('AUTHORIZATION')}, data=json.dumps({ 'date': self.date_edit.text(), 'time': self.time_edit.text(), 'content': text }) ) response = json.loads(r.content.decode('utf-8')) if r.status_code != 201: raise ValueError(response['message']) except Exception as e: self.show_tips.setText(str(e)) else: self.show_tips.setText(response['message'])
class CreateNewSMSLink(QDialog): def __init__(self, *args, **kwargs): super(CreateNewSMSLink, self).__init__(*args, **kwargs) self.setAttribute(Qt.WA_DeleteOnClose) layout = QVBoxLayout() # 时间布局 date_time_layout = QHBoxLayout() self.date_edit = QDateEdit(QDate.currentDate()) self.date_edit.setCalendarPopup(True) self.date_edit.setDisplayFormat('yyyy-MM-dd') date_time_layout.addWidget(QLabel('日期:')) date_time_layout.addWidget(self.date_edit) date_time_layout.addWidget(QLabel('时间:')) self.time_edit = QTimeEdit(QTime.currentTime()) self.time_edit.setDisplayFormat('HH:mm:ss') date_time_layout.addWidget(self.time_edit) date_time_layout.addStretch() layout.addLayout(date_time_layout) self.text_edit = QTextEdit() layout.addWidget(self.text_edit) layout.addWidget(QPushButton('确定', clicked=self.commit_sms), alignment=Qt.AlignRight) self.setLayout(layout) self.setFixedSize(400, 200) self.setWindowTitle('新建短信通') # 确定增加 def commit_sms(self): text = self.text_edit.toPlainText().strip() if not text: QMessageBox.information(self,'错误', '请输入内容。') return # 提交 try: r = requests.post( url=settings.SERVER_ADDR + 'advise/shortmessage/', headers={'Content-Type': 'application/json;charset=utf8'}, data=json.dumps({ 'utoken':settings.app_dawn.value('AUTHORIZATION'), 'custom_time': self.date_edit.text() + ' ' + self.time_edit.text(), 'content': text }) ) response = json.loads(r.content.decode('utf-8')) if r.status_code != 201: raise ValueError(response['message']) except Exception as e: QMessageBox.information(self,'错误', str(e)) else: QMessageBox.information(self,'成功', "新增成功") self.close()
class FinanceCalendarPage(QWidget): def __init__(self, *args, **kwargs): super(FinanceCalendarPage, self).__init__(*args, **kwargs) layout = QVBoxLayout(margin=0, spacing=2) # 日期选择、信息展示与新增按钮 message_button_layout = QHBoxLayout() self.date_edit = QDateEdit(QDate.currentDate(), dateChanged=self.getCurrentFinanceCalendar) self.date_edit.setDisplayFormat('yyyy-MM-dd') self.date_edit.setCalendarPopup(True) message_button_layout.addWidget(QLabel('日期:')) message_button_layout.addWidget(self.date_edit) self.network_message_label = QLabel() message_button_layout.addWidget(self.network_message_label) message_button_layout.addStretch() # 伸缩 message_button_layout.addWidget(QPushButton('新增', clicked=self.create_finance_calendar), alignment=Qt.AlignRight) layout.addLayout(message_button_layout) # 当前数据显示表格 self.finance_table = FinanceCalendarTable() self.finance_table.network_result.connect(self.network_message_label.setText) layout.addWidget(self.finance_table) self.setLayout(layout) # 获取当前日期财经日历 def getCurrentFinanceCalendar(self): current_date = self.date_edit.text() current_page = 1 try: user_id = pickle.loads(settings.app_dawn.value("UKEY")) r = requests.get( url=settings.SERVER_ADDR + 'user/' + str(user_id) + '/fecalendar/?page=' +str(current_page)+'&page_size=50&date=' + current_date, ) response = json.loads(r.content.decode('utf-8')) if r.status_code != 200: raise ValueError(response['message']) except Exception as e: self.network_message_label.setText(str(e)) else: self.finance_table.showRowContents(response['fecalendar']) self.network_message_label.setText(response['message']) # 新增财经日历数据 def create_finance_calendar(self): popup = CreateNewFinanceCalendarPopup(parent=self) popup.exec_()
class WindowClass(QWidget): def __init__(self, parent=None): super(WindowClass, self).__init__(parent) self.btn = QPushButton(self) #self参数则让该按钮显示当前窗体中 self.btn.setText("点击获取日期信息") self.btn.clicked.connect(self.showdate) self.dateEdit = QDateEdit(self) self.timeEdit = QTimeEdit(self) self.dateTimeEdit = QDateTimeEdit(self) self.dateEdit.setCalendarPopup(True) #self.timeEdit.setCalendarPopup(True)#弹出界面是失效的注意; #self.dateTimeEdit.setCalendarPopup(True)#时间是无法选择的 self.dateEdit.move(10, 200) self.timeEdit.move(10, 100) self.dateTimeEdit.move(10, 300) self.dateEdit.setDisplayFormat("yyyy-MM-dd") self.timeEdit.setDisplayFormat("HH:mm:ss") self.dateTimeEdit.setDisplayFormat("yyyy-MM-dd HH:mm:ss") self.setWindowTitle("QDateEdit和QDateTimeEdit控件使用") def showdate(self): print(self.dateEdit.text())
class AddBookingDetails(QMainWindow): closing = pyqtSignal(int) def __init__(self, parent, update, id=None): super().__init__(parent) self.db = DB() self.initUI(update, id) def initUI(self, update, id): self.setWindowModality(Qt.ApplicationModal) frame = QFrame() # frame.setStyleSheet("background-color: rgb(30, 45, 66);") frame.setFrameShape(QFrame.StyledPanel) frame.setFrameShadow(QFrame.Raised) # frame.setMinimumWidth(430) # frame.setFixedHeight(395) # frame.setStyleSheet("border: none") add_booking_button = QLabel(frame) add_booking_button.setAlignment(Qt.AlignCenter) add_booking_button.setGeometry(QRect(110, 30, 210, 41)) add_booking_button.setStyleSheet("font: 75 12pt \"MS Shell Dlg 2\";\n" "background-color: rgb(30, 45, 66);\n" "color: rgb(255, 255, 255);") add_booking_button.setText("Add Reservation Details") # tablelabel = QLabel(frame) # tablelabel.setText("Table") # tablelabel.setGeometry(QRect(50, 120, 81, 20)) # # tabletextbox = QComboBox(frame) # tabletextbox.setGeometry(QRect(170, 110, 181, 31)) # tabletextbox.setFixedWidth(180) # tabletextbox.addItems(["Table 1", "Table 2"]) customernamelabel = QLabel(frame) customernamelabel.setText("Customer Name") customernamelabel.setGeometry(QRect(50, 120, 100, 20)) self.customernametextbox = QLineEdit(frame) self.customernametextbox.setGeometry(QRect(170, 110, 181, 31)) self.customernametextbox.setFixedWidth(180) customercontactlabel = QLabel(frame) customercontactlabel.setText("Customer Contact") customercontactlabel.setGeometry(QRect(50, 160, 145, 19)) self.customercontacttextbox = QLineEdit(frame) self.customercontacttextbox.setGeometry(QRect(170, 150, 181, 31)) self.customercontacttextbox.setFixedWidth(180) datelabel = QLabel(frame) datelabel.setText("Date") datelabel.setGeometry(QRect(50, 200, 145, 19)) self.datetextbox = QDateEdit(frame) self.datetextbox.setGeometry(QRect(170, 190, 181, 31)) self.datetextbox.setFixedWidth(180) self.datetextbox.setDate(QDate.currentDate()) self.datetextbox.setMinimumDate(QDate.currentDate()) self.datetextbox.setDisplayFormat("dd-MM-yyyy") starttimelabel = QLabel(frame) starttimelabel.setText("Start Time") starttimelabel.setGeometry(QRect(50, 240, 121, 16)) self.starttimetextbox = QTimeEdit(frame) self.starttimetextbox.setGeometry(QRect(170, 230, 181, 31)) self.starttimetextbox.setFixedWidth(180) # self.starttimetextbox.setTime(QDate.currentDate()) # self.starttimetextbox.setMinimumDate(QDate.currentDate()) self.addbutton = QPushButton(frame) self.addbutton.setText("Add Booking") self.addbutton.setGeometry(QRect(160, 300, 151, 31)) self.addbutton.setStyleSheet("font: 75 12pt \"MS Shell Dlg 2\";\n" "background-color: rgb(30, 45, 66);\n" "color: rgb(255, 255, 255);") # self.addbutton.clicked.connect(lambda: self.add_button_click("reservations")) if update == 'add': print("Add") print(id) self.addbutton.setText("Add Reservation") self.addbutton.clicked.connect( lambda: self.add_button_click("reservations")) else: print("Update") print(id) self.addbutton.setText("Update Reservation") self.addbutton.clicked.connect( lambda: self.update_button_click("reservations", id)) layout = QVBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(frame) centralWidget = QWidget() centralWidget.setLayout(layout) self.setCentralWidget(centralWidget) # self.setLayout(layout) self.setWindowTitle("Add Reservation Details") self.resize(430, 395) self.show() self.center() def center(self): '''centers the window on the screen''' screen = QDesktopWidget().screenGeometry() size = self.geometry() self.move((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2) def update_button_click(self, where, id): if where == "reservations": print("Tables Finally here") customer_name = self.customernametextbox.text() customer_contact = self.customercontacttextbox.text() start_time = self.starttimetextbox.text() try: date = datetime.datetime.strptime(self.datetextbox.text(), "%d-%m-%Y") booking_date = datetime.datetime.strftime(date, "%Y-%m-%d") except Exception as e: ''' Make sure to add an error message. ''' print(e) return if customer_name != "" and customer_contact != "": query = "update customerBooking set `customer_name`=%s, " \ "`phone_number`=%s, `booking_date`=concat(%s, ' ', %s)" \ "where id=%s;" values = (customer_name, customer_contact, booking_date, start_time, id) result = self.db.execute(query, values) self.closeEvent = self.message() def add_button_click(self, where): if where == "reservations": print("Finally here") customer_name = self.customernametextbox.text() customer_contact = self.customercontacttextbox.text() start_time = self.starttimetextbox.text() try: date = datetime.datetime.strptime(self.datetextbox.text(), "%d-%m-%Y") booking_date = datetime.datetime.strftime(date, "%Y-%m-%d") except Exception as e: ''' Make sure to add an error message. ''' print(e) return if customer_name != "" and customer_contact != "": print("Got Here") query = "insert into customerBooking (`customer_name`, `phone_number`, `booking_date`)" \ "values (%s, %s, concat(%s, ' ', %s));" values = (customer_name, customer_contact, booking_date, start_time) result = self.db.execute(query, values) self.closeEvent = self.message() def message(self): self.closing.emit(1) self.close()
class WidgetNote(QWidget): def __init__(self, parent=None): super(WidgetNote, self).__init__(parent) self.parent = parent # Состояние компонентов (Можно редактировать или нет) self.condition_edit = True # Создание интерфейса self.__init_ui() # id товара self.product_id = 0 # Включение Read Only self.read_only_on_off() # Подключение кнопок self.button_edit.clicked.connect(self.__button_edit_input) self.button_remove.clicked.connect(self.parent.remove_product_list) def __init_ui(self): hbox = QHBoxLayout() self.name_product = QLineEdit() self.name_product.setPlaceholderText('Введите название товара') self.price_product = QLineEdit() self.price_product.setValidator(QDoubleValidator()) self.price_product.setPlaceholderText('Введите цену товара') current_date = QDate() self.date_purchase = QDateEdit() self.date_purchase.setDate(current_date.currentDate()) self.button_edit = QPushButton('Редактировать') self.button_remove = QPushButton('Удалить') hbox.addWidget(self.name_product) hbox.addWidget(QVLine()) hbox.addWidget(self.price_product) hbox.addWidget(QVLine()) hbox.addWidget(self.date_purchase) hbox.addWidget(QVLine()) hbox.addWidget(self.button_edit) hbox.addWidget(QVLine()) hbox.addWidget(self.button_remove) self.setLayout(hbox) # Включение/выключение 'read only' def read_only_on_off(self) -> None: self.condition_edit = not self.condition_edit if self.condition_edit: self.button_edit.setText('Редактировать') else: self.button_edit.setText('Сохранить') self.name_product.setReadOnly(self.condition_edit) self.price_product.setReadOnly(self.condition_edit) self.date_purchase.setReadOnly(self.condition_edit) def __button_edit_input(self): self.read_only_on_off() if self.name_product.text() == '': self.name_product.setText('Product Name') if self.condition_edit: self.parent.edit_product(product_id=self.product_id, name_product=self.name_product.text(), price_product=self.convert_price(), date_purchase=self.convert_date()) def select_name_product(self, text) -> None: self.name_product.setText(text) def select_price_product(self, text) -> None: self.price_product.setText(text) def select_id_product(self, id): self.product_id = id def select_date_purchase(self, date): qt_date = QDate() qt_date.setDate(date.year, date.month, date.day) self.date_purchase.setDate(qt_date) # Преобразовать дату def convert_date(self): day, month, year = self.date_purchase.text().split('.') return datetime.datetime(int(year), int(month), int(day)) # Преобразовать цену def convert_price(self): price = self.price_product.text() if price != '': if ',' in price: return float(price.replace(',', '.')) return float(price) self.price_product.setText('0.0') return 0.0
class FormWindow(QMainWindow): def __init__(self, parent=None): super().__init__(parent) self.initUI() def initUI(self): self.setMinimumSize(QSize(500, 500)) # Устанавливаем размеры #self.setWidth(300) #self.setHeight(280) self.setWindowTitle( "информация об итогах") # Устанавливаем заголовок окна central_widget = QWidget() # Создаём центральный виджет self.setCentralWidget( central_widget) # Устанавливаем центральный виджет self.grid_layout = QGridLayout() self.grid_layout.setSpacing(10) self.title0 = QLabel("выберите промежуток") self.title1 = QLabel("c:") self.title2 = QLabel("по:") self.title01 = QLabel(" ") self.title02 = QLabel(" ") self.title03 = QLabel(" ") self.title04 = QLabel(" ") self.grid_layout.addWidget(self.title01, 2, 0, 1, 5) self.grid_layout.addWidget(self.title02, 3, 0, 1, 5) self.grid_layout.addWidget(self.title03, 4, 0, 1, 5) self.grid_layout.addWidget(self.title04, 5, 0, 1, 5) self.grid_layout.addWidget(self.title0, 0, 0, 1, 5) self.grid_layout.addWidget(self.title1, 1, 0, 1, 1) self.grid_layout.addWidget(self.title2, 1, 2, 1, 1) self.edit1 = QDateEdit() self.edit2 = QDateEdit() self.grid_layout.addWidget(self.edit1, 1, 1, 1, 1) self.grid_layout.addWidget(self.edit2, 1, 3, 1, 1) self.btn_insert = QPushButton("вывод") self.btn_insert.clicked.connect(self.insert) self.btn_close = QPushButton("close") self.btn_close.clicked.connect(self.close_app) self.grid_layout.addWidget(self.btn_insert, 1, 4, 1, 1) self.grid_layout.addWidget(self.btn_close, 6, 3) central_widget.setLayout(self.grid_layout) def insert(self): date1 = self.edit1.text() date2 = self.edit2.text() cursor.execute(""" SELECT count(*) FROM jurnal where date_of_work >= '%s'and date_of_work <='%s'; """ % (date1, date2)) a = list(cursor.fetchone()) self.title01.setText( 'количество записей журнала в данном промежутке = ' + str(a[0])) print('1') cursor.execute(""" select dbo.get_drivers ('%s','%s'); """ % (date1, date2)) a = list(cursor.fetchone()) self.title02.setText( 'количество водителей работавшие в данный период = ' + str(a[0])) print('2') cursor.execute(""" select dbo.get_no_route ('%s','%s'); """ % (date1, date2)) a = list(cursor.fetchone()) self.title03.setText( 'количество маршрутов по которым ездили за данный период = ' + str(a[0])) print('3') cursor.execute(""" select dbo.get_type_transport ('%s','%s'); """ % (date1, date2)) a = list(cursor.fetchone()) self.title04.setText( 'использованых видов транспорта за текущий период =' + str(a[0])) print('4') def close_app(self): self.hide() mw.createedits()
class actualizarCliente(QDialog): def __init__(self, indice, datos, parent=None): super(actualizarCliente, self).__init__() self.parent = parent self.indice = indice self.datos = datos self.setWindowIcon(QIcon("Imagenes/ch.png")) self.setWindowTitle("Обновление клиента") self.setWindowFlags(Qt.WindowCloseButtonHint | Qt.MSWindowsFixedSizeDialogHint) self.setFixedSize(320, 478) self.initUI() def initUI(self): self.groupBoxDatosGenerales = QGroupBox("Общие данные ", self) self.groupBoxDatosGenerales.setFixedSize(300, 223) self.groupBoxDatosGenerales.move(10, 13) labelNombre = QLabel("<font color='#FF3300'>*</font> Имя", self.groupBoxDatosGenerales) labelNombre.move(15, 28) self.lineEditNombre = QLineEdit(self.groupBoxDatosGenerales) self.lineEditNombre.setValidator(QRegExpValidator(QRegExp("[a-zA-Z ]+"), self.lineEditNombre)) self.lineEditNombre.setMaxLength(30) self.lineEditNombre.setFixedWidth(270) self.lineEditNombre.setFocus() self.lineEditNombre.move(15, 46) labelApellido = QLabel("<font color='#FF3300'>*</font> Фамилия", self.groupBoxDatosGenerales) labelApellido.move(15, 74) self.lineEditApellido = QLineEdit(self.groupBoxDatosGenerales) self.lineEditApellido.setValidator(QRegExpValidator(QRegExp("[a-zA-Z ]+"), self.lineEditApellido)) self.lineEditApellido.setMaxLength(30) self.lineEditApellido.setFixedWidth(270) self.lineEditApellido.move(15, 92) labelSexo = QLabel("<font color='#FF3300'>*</font> Пол", self.groupBoxDatosGenerales) labelSexo.move(15, 120) self.comboBoxSexo = QComboBox(self.groupBoxDatosGenerales) self.comboBoxSexo.addItems(["М", "Ж"]) self.comboBoxSexo.setCurrentIndex(-1) self.comboBoxSexo.setFixedWidth(270) self.comboBoxSexo.move(15, 138) labelFechaNacimiento = QLabel("<font color='#FF3300'>*</font> Дата рождения", self.groupBoxDatosGenerales) labelFechaNacimiento.move(15, 166) self.dateEditFechaNacimiento = QDateEdit(self.groupBoxDatosGenerales) self.dateEditFechaNacimiento.setDate(QDate.currentDate()) self.dateEditFechaNacimiento.setMaximumDate(QDate.currentDate()) self.dateEditFechaNacimiento.setDisplayFormat("dd/MM/yyyy") self.dateEditFechaNacimiento.setCalendarPopup(True) self.dateEditFechaNacimiento.setCursor(Qt.PointingHandCursor) self.dateEditFechaNacimiento.setFixedWidth(270) self.dateEditFechaNacimiento.move(15, 184) self.groupBoxUbicacion = QGroupBox("Проживание", self) self.groupBoxUbicacion.setFixedSize(300, 86) self.groupBoxUbicacion.move(10, 250) labelPais = QLabel("<font color='#FF3300'>*</font> Страна", self.groupBoxUbicacion) labelPais.move(15, 28) self.lineEditPais = QLineEdit(self.groupBoxUbicacion) self.lineEditPais.setMaxLength(30) self.lineEditPais.setFixedWidth(270) self.lineEditPais.move(15, 48) self.groupBoxContacto = QGroupBox("Контакты", self) self.groupBoxContacto.setFixedSize(300, 86) self.groupBoxContacto.move(10, 350) labelTelCel = QLabel("<font color='#FF3300'>*</font> Номер телефона", self.groupBoxContacto) labelTelCel.move(15, 28) self.lineEditTelCel = QLineEdit(self.groupBoxContacto) self.lineEditTelCel.setInputMask("9999999999999999; ") self.lineEditTelCel.setFixedWidth(270) self.lineEditTelCel.move(15, 48) labelInformacion = QLabel("<font color='#FF3300'>*</font> Обязательные поля.", self) labelInformacion.move(10, 445) buttonActualizar = QPushButton("Обновить", self) buttonActualizar.setCursor(Qt.PointingHandCursor) buttonActualizar.move(154, 445) buttonCerrar = QPushButton("Закрыть", self) buttonCerrar.setCursor(Qt.PointingHandCursor) buttonCerrar.move(236, 445) buttonActualizar.clicked.connect(self.Actualizar) buttonCerrar.clicked.connect(self.close) self.cargarDatos(self.datos) def cargarDatos(self, datos): self.lineEditNombre.setText(datos[1]) self.lineEditApellido.setText(datos[2]) itemsComboBox = [self.comboBoxSexo.itemText(i) for i in range(self.comboBoxSexo.count())] if datos[3] in itemsComboBox: posicionItem = itemsComboBox.index(datos[3]) self.comboBoxSexo.setCurrentIndex(posicionItem) else: self.comboBoxSexo.setCurrentIndex(-1) self.dateEditFechaNacimiento.setDate(QDate.fromString(datos[4], "dd/MM/yyyy")) self.lineEditPais.setText(datos[5]) self.lineEditTelCel.setText(datos[6]) return def Actualizar(self): nombre = " ".join(self.lineEditNombre.text().split()).title() apellido = " ".join(self.lineEditApellido.text().split()).title() sexo = self.comboBoxSexo.currentText() fecNacimiento = self.dateEditFechaNacimiento.text() pais = " ".join(self.lineEditPais.text().split()).title() telCel = self.lineEditTelCel.text() if not nombre: self.lineEditNombre.setFocus() elif not apellido: self.lineEditApellido.setFocus() elif not sexo: self.comboBoxSexo.setFocus() elif not pais: self.lineEditPais.setFocus() elif not telCel: self.lineEditTelCel.setFocus() else: if QFile.exists("DB_SIACLE/DB_SIACLE.db"): conexion = sqlite3.connect("DB_SIACLE/DB_SIACLE.db") cursor = conexion.cursor() try: datos = [nombre, apellido, sexo, fecNacimiento, pais, telCel, self.datos[0]] cursor.execute("UPDATE CLIENTES SET NOMBRE = ?, APELLIDO = ?, SEXO = ?, " "FECHA_NACIMIENTO = ?, PAIS = ?, TELEFONO_CELULAR = ? " "WHERE ID = ?", datos) conexion.commit() conexion.close() nuevos_datos = (str(self.datos[0]), nombre, apellido, sexo, fecNacimiento, pais, telCel) self.parent.tabla.removeRow(self.indice) numFilas = self.parent.tabla.rowCount() self.parent.tabla.insertRow(numFilas) for indice, dato in enumerate(nuevos_datos): dato = QTableWidgetItem(dato) if indice == 0: dato.setTextAlignment(Qt.AlignCenter) self.parent.tabla.setItem(numFilas, indice, dato) self.lineEditNombre.clear() self.lineEditApellido.clear() self.comboBoxSexo.setCurrentIndex(-1) self.dateEditFechaNacimiento.setDate(QDate.currentDate()) self.lineEditPais.clear() self.lineEditTelCel.clear() QMessageBox.information(self, "Обновление клиента ", "Клиент обновлен." " ", QMessageBox.Ok) self.close() except: conexion.close() QMessageBox.critical(self, "Обновление клиента", "Неизвестная ошибка. ", QMessageBox.Ok) else: QMessageBox.critical(self, "Обновление клиента", "База не найдена " "datos. ", QMessageBox.Ok)
class Patient(QDialog): def __init__(self, base_folder): """Patient dialog :param base_folder: base folder where data will be saved :type base_folder: str """ super().__init__() self.setWindowTitle("New patient") self.setFixedWidth(300) self.l = QGridLayout(self) self.combo = QComboBox() folders = [ i.split("\\")[-1] for i in glob(base_folder + "\\*") if isdir(i) ] if len(folders) == 0: os.mkdir(base_folder + "\\Sprechstunde") folders.append("Sprechstunde") self.combo.addItem("Sprechstunde") for i in folders: if i is not "Sprechstunde": self.combo.addItem(i) self.l.addWidget(QLabel("Folder")) self.l.addWidget(self.combo) self.l.addWidget(QLabel('Last Name / Identifier*')) self.last_name = QLineEdit() self.last_name.setPlaceholderText("e.g. Smith") self.l.addWidget(self.last_name) self.l.addWidget(QLabel("First Name")) self.first_name = QLineEdit() self.first_name.setPlaceholderText("e.g. John") self.l.addWidget(self.first_name) self.l.addWidget(QLabel("Birth data")) self.birth_date = QDateEdit() self.l.addWidget(self.birth_date) self.l.addWidget(QLabel("Comment")) self.comment = QLineEdit() self.comment.setPlaceholderText("e.g. RBH 022") self.l.addWidget(self.comment) b = QPushButton("Continue") b.clicked.connect(self.close) self.l.addWidget(b) self.l.addWidget(QLabel("*: mandatory fields")) def close(self): if not self.last_name.text(): QMessageBox.critical( self, "No identifier", "Please enter identifier (e.g. last name) of the subject.") return super().close() def get(self): return dict(last_name=self.last_name.text(), first_name=self.first_name.text(), birth_date=self.birth_date.text(), comment=self.comment.text(), folder=self.combo.currentText())
class Example(QWidget): def __init__(self): super().__init__() self.hightingColor = QColor(255, 202, 0) self.blueColor = QColor(0, 186, 255) self.greenColor = QColor(0, 147, 44) self.redColor = QColor(255, 0, 0) self.setGeometry(100, 100, 1250, 800) self.setWindowTitle('宝大爷神器') self.show() self.mainUI() self.getUserInfo() # self.clearUI() # self.loginUI() def mainUI(self): self.box = QVBoxLayout() self.box.setSpacing(5) self.setLayout(self.box) def dataUI(self): self.box1 = QHBoxLayout() self.code = QLabel('股票代码') self.box1.addWidget(self.code) self.codeEdit = QLineEdit() self.codeEdit.setText('600519') self.box1.addWidget(self.codeEdit) self.year = QLabel('回报年限') self.yearEdit = QComboBox() for i in yearArr: self.yearEdit.addItem(str(i)) self.yearEdit.setCurrentIndex(5) self.box1.addWidget(self.year) self.box1.addWidget(self.yearEdit) # 同行年限 self.peerYear = QLabel('同行年限') self.peerYearEdit = QComboBox() for i in yearArr: self.peerYearEdit.addItem(str(i)) self.peerYearEdit.setCurrentIndex(2) self.box1.addWidget(self.peerYear) self.box1.addWidget(self.peerYearEdit) #开始日期 self.date = QLabel('开始日期') self.box1.addWidget(self.date) self.dateEdit = QDateEdit(QDate.currentDate().addDays(-365 * 10), self) self.dateEdit.setCalendarPopup(True) self.dateEdit.setDisplayFormat("yyyy-MM-dd") self.box1.addWidget(self.dateEdit) #结束日期 self.dateEnd = QLabel('结束日期') self.box1.addWidget(self.dateEnd) self.dateEditEnd = QDateEdit(QDate.currentDate(), self) self.dateEditEnd.setCalendarPopup(True) self.dateEditEnd.setDisplayFormat("yyyy-MM-dd") self.box1.addWidget(self.dateEditEnd) self.searchButton = QPushButton("估值") self.searchButton.clicked.connect(self.searchEvent) self.box1.addWidget(self.searchButton) self.peerButton = QPushButton("同行对比") self.peerButton.clicked.connect(self.searchPeerEvent) self.box1.addWidget(self.peerButton) self.box.addLayout(self.box1) self.box2 = QHBoxLayout() self.tips = QLabel('例子:以逗号隔开(000123,000333,000345)') self.box2.addWidget(self.tips) self.stockInfo = QLabel('') self.box2.addWidget(self.stockInfo) self.box.addLayout(self.box2) self.table = QTableWidget(30, 15) self.table.setStyleSheet( "QHeaderView::section {background-color:#f3f3f3;color: black;padding-left: 4px;border: 1px dotted #dddddd;}" ) # 设置表头字体,颜色,模式 self.box.addWidget(self.table) self.tipsUI() def loginUI(self): self.username = QLabel('账号') self.usernameEdit = QLineEdit() self.password = QLabel('密码') self.passwordEidt = QLineEdit() self.okButton = QPushButton("登录") self.grid = QGridLayout() self.grid.addWidget(self.username, 1, 0) self.grid.addWidget(self.usernameEdit, 1, 1) self.grid.addWidget(self.password, 2, 0) self.grid.addWidget(self.passwordEidt, 2, 1) self.grid.addWidget(self.okButton, 3, 1) self.box.addLayout(self.grid) self.okButton.clicked.connect(self.loginEvent) def tipsUI(self): self.boxTips = QVBoxLayout() self.boxTips.setSpacing(3) self.box.addLayout(self.boxTips) tipsData = [ '估值方法:', '小熊基本值=5年自由现金流之和/5年资本开支之和', '回本年限默认10年,N=10+护城河(-1/0/1/2)+成长性(-1/0/1/2)', '十年EBIT增长=(2003年EBIT-2012年EBIT)/2012年EBIT', '有形资本汇报率ROIC=(净利润+税+利息)/(流动资产+固定资产+在建工程)=税前息利润EBIT/有形资产合计----------- >15%', '理杏仁中的ROTA对应长投的ROIC,有形资产比他更加详细', 'EV/EQ=(总市值+有息负债-多余现金)/(流动资产+固定资产)=(总市值+有息负债-多余现金)/有形资产合计, EV/EQ=回报年限*ROIC', 'EV=总市值+有息负债-多余现金', '总市值:红色为高估,绿色为低估' ] for item in tipsData: self.boxTips.addWidget(QLabel(item)) def tableUI(self, jsonData): self.table.clear() colData = [{ 'label': '财务费用(累计)', 'value': 'profitStatement-fe' }, { 'label': '利润总额(累计)', 'value': 'profitStatement-tp' }, { 'label': '流动资产合计(累计)', 'value': 'balanceSheet-tca' }, { 'label': '固定资产(累计)', 'value': 'balanceSheet-fa' }, { 'label': '在建工程(累计)', 'value': 'balanceSheet-cip' }, { 'label': 'EBIT', }, { 'label': '有形资产合计', }, { 'label': 'ROIC', }, { 'label': 'EBIT同比增长率', }, { 'label': '经营活动产生的现金流量净额(累计)', 'value': 'cashFlow-ncffoa' }, { 'label': '自由现金流量(累计)', 'value': 'metrics-fcf' }, { 'label': '资本开支', }, { 'label': '货币资金(累计)', 'value': 'balanceSheet-cabb' }, { 'label': '有息负债(累计)', 'value': 'balanceSheet-lwi' }, { 'label': '小熊基本值', }, { 'label': '十年EBIT增长', }, { 'label': 'ROIC平均值', }, { 'label': '回报年限', }, { 'label': 'EQ=有形资产合计', }, { 'label': 'EV=EQ*(回本年限*ROIC)', }, { 'label': '估值总市值', }, { 'label': '当前总市值', }, { 'label': '当前每股股价', }, { 'label': '总股本', }, { 'label': '估值每股股价', }] stockData = [] print(222222, jsonData) for item in jsonData['fsMetricsList']: stockData.append(item) tableHeader = [] # 表头名字数据 tableColData = [] # 表列名字 self.table.setColumnCount(len(stockData)) self.table.setRowCount(len(colData)) print('roic数据的长度', len(stockData)) for index, item in enumerate(stockData): tableHeader.append(item['date'].split('T')[0]) self.table.setColumnWidth(index, 170) data = item['y'] for jIndex, jItem in enumerate(colData): if ('value' in jItem): attr = jItem['value'].split('-') newItem = QTableWidgetItem( str(data[attr[0]].get(attr[1], {'t': 0})['t'])) self.table.setItem(jIndex, index, newItem) item[attr[1]] = data[attr[0]].get( attr[1], {'t': 0})['t'] # 赋值最简值到该元素,方便后续的计算 elif jItem['label'] == 'EBIT': # EBIT = 财务费用+利润总额 newItem = QTableWidgetItem('{:.2f}'.format(item['fe'] + item['tp'])) newItem.setBackground(self.hightingColor) self.table.setItem(jIndex, index, newItem) item['EBIT'] = item['fe'] + item['tp'] elif jItem['label'] == '有形资产合计': # 有形资产合计 = 流动资产合计+固定资产+在建工程 newItem = QTableWidgetItem( '{:.2f}'.format(item['tca'] + item['fa'] + item['cip'])) newItem.setBackground(self.hightingColor) self.table.setItem(jIndex, index, newItem) item['EQ'] = item['tca'] + item['fa'] + item['cip'] elif jItem['label'] == 'ROIC': # ROIC = EBIT/有形资产合计 newItem = QTableWidgetItem( str('{:.2%}'.format(item['EBIT'] / item['EQ']))) newItem.setBackground(self.hightingColor) self.table.setItem(jIndex, index, newItem) item['ROIC'] = item['EBIT'] / item['EQ'] elif jItem['label'] == 'EBIT同比增长率': if index != 0: ebit = (stockData[index - 1]['EBIT'] - item['EBIT']) / item['EBIT'] newItem = QTableWidgetItem('{:.2%}'.format(ebit)) newItem.setBackground(self.hightingColor) self.table.setItem(jIndex, index - 1, newItem) elif jItem['label'] == '资本开支': # 资本开支 = 经营活动产生的现金流量净额-自由现金流量 newItem = QTableWidgetItem( str(item['ncffoa'] - item['fcf'])) newItem.setBackground(self.hightingColor) self.table.setItem(jIndex, index, newItem) item['CAPEX'] = item['ncffoa'] + item['fcf'] calData = self.getCalData(stockData) for index, item in enumerate(colData): tableColData.append(item['label']) if item['label'] == '小熊基本值': newItem = QTableWidgetItem(calData['BaseValue']) newItem.setBackground(self.blueColor) self.table.setItem(index, 0, newItem) elif item['label'] == '十年EBIT增长': stockLen = len(stockData) EBITValue = (stockData[0]['EBIT'] - stockData[stockLen - 1]['EBIT']) / \ stockData[stockLen - 1]['EBIT'] newItem = QTableWidgetItem( str('{:.2f}'.format(EBITValue)) + '倍') newItem.setBackground(self.blueColor) self.table.setItem(index, 0, newItem) elif item['label'] == 'ROIC平均值': newItem = QTableWidgetItem(calData['ROICAVG']) newItem.setBackground(self.blueColor) self.table.setItem(index, 0, newItem) elif item['label'] == 'EQ=有形资产合计': newItem = QTableWidgetItem(str(calData['EQ'])) newItem.setBackground(self.blueColor) self.table.setItem(index, 0, newItem) elif item['label'] == '回报年限': newItem = QTableWidgetItem(self.yearEdit.currentText()) newItem.setForeground(QBrush(QColor(255, 0, 0))) self.table.setItem(index, 0, newItem) elif item['label'] == 'EV=EQ*(回本年限*ROIC)': yearRoic = int(self.yearEdit.currentText()) * float( calData['ROICAVG'].strip('%')) / 100 global EV EV = calData['EQ'] * yearRoic newItem = QTableWidgetItem('{:.0f}'.format(EV)) newItem.setBackground(self.blueColor) self.table.setItem(index, 0, newItem) elif item['label'] == '估值总市值': price = EV - calData['lwi'] + calData['cabb'] self.price_pre = price newItem = QTableWidgetItem('{:.0f}'.format(price)) if price < calData['mc']: newItem.setBackground(self.redColor) else: newItem.setBackground(self.greenColor) self.table.setItem(index, 0, newItem) elif item['label'] == '当前总市值': price = calData['mc'] newItem = QTableWidgetItem(str(price)) self.table.setItem(index, 0, newItem) elif item['label'] == '当前每股股价': price = self.price_sp newItem = QTableWidgetItem(str(price)) self.table.setItem(index, 0, newItem) elif item['label'] == '总股本': price = self.price_num newItem = QTableWidgetItem(str(price)) self.table.setItem(index, 0, newItem) elif item['label'] == '估值每股股价': price = self.price_pre / self.price_num newItem = QTableWidgetItem(str(price)) self.table.setItem(index, 0, newItem) print(tableColData) print(tableHeader) self.table.setHorizontalHeaderLabels(tableHeader) # 设置表头数据 self.table.setVerticalHeaderLabels(tableColData) # 设置表列数据 # 同行对比表格 def peerTable(self, jsonData, stockIdArr): self.table.clear() colData = [] stockData = {} for item in jsonData['fsMetricsList']: id = item['stockId'] if (id in stockData): stockData[id].append(item) else: stockData[id] = [] stockData[id].append(item) tableHeader = [] # 表头名字数据 tableColData = [] # 表列名字 # 遍历股票代码数组,同行对比 idStrArr = self.stockIdArr #遍历行表头 start colData.append({'label': '归属母公司加权ROE'}) for jItem in idStrArr: colData.append({ 'label': self.stockNameData[jItem], 'value': 'ROE', 'id': int(jItem) }) colData.append({ 'label': str(len(idStrArr)) + '家均值', 'value': 'avg', 'type': 'ROE' }) colData.append({'label': '归属母公司扣非ROE'}) for jItem in idStrArr: colData.append({ 'label': self.stockNameData[jItem], 'value': 'ROE_A', 'id': int(jItem) }) colData.append({ 'label': str(len(idStrArr)) + '家均值', 'value': 'avg', 'type': 'ROE_A' }) colData.append({'label': 'ROIC'}) for jItem in idStrArr: colData.append({ 'label': self.stockNameData[jItem], 'value': 'ROIC', 'id': int(jItem) }) colData.append({ 'label': str(len(idStrArr)) + '家均值', 'value': 'avg', 'type': 'ROIC' }) colData.append({'label': '毛利率GM'}) for jItem in idStrArr: colData.append({ 'label': self.stockNameData[jItem], 'value': 'GM', 'id': int(jItem) }) colData.append({ 'label': str(len(idStrArr)) + '家均值', 'value': 'avg', 'type': 'GM' }) colData.append({'label': '净营业周期'}) for jItem in idStrArr: colData.append({ 'label': self.stockNameData[jItem], 'value': 'ROUND', 'id': int(jItem) }) colData.append({ 'label': str(len(idStrArr)) + '家均值', 'value': 'avg', 'type': 'ROUND' }) colData.append({'label': '三费占比'}) for jItem in idStrArr: colData.append({ 'label': self.stockNameData[jItem], 'value': 'FEE', 'id': int(jItem) }) colData.append({ 'label': str(len(idStrArr)) + '家均值', 'value': 'avg', 'type': 'FEE' }) # 遍历行表头 end # 遍历表列名 for index, item in enumerate(colData): tableColData.append(item['label']) #找出行业数据中长度最小的,以防下面遍历出错 stockDataLen = [] for key in stockData: stockDataLen.append(len(stockData[key])) stockDataLen.sort() print('找出行业数据中长度最小的,以防下面遍历出错%s' % stockDataLen[0]) # 平均值对象 avgData = { 'ROE': [], 'ROE_A': [], 'ROIC': [], 'GM': [], 'ROUND': [], 'FEE': [] } year = int(self.peerYearEdit.currentText()) tablePerDataLen = stockDataLen[0] - 1 > year and year or stockDataLen[ 0] - 1 # 净营业周期需要计算期初和期末,len-1 print('同行对比年数:', tablePerDataLen) self.table.setColumnCount(tablePerDataLen + 1) self.table.setRowCount(len(colData)) # 遍历表头,遍历表格内容, for index in range(tablePerDataLen): tableHeader.append( stockData[stockIdArr[0]][index]['date'].split('T')[0]) self.table.setColumnWidth(index, 100) for jIndex, jItem in enumerate(colData): color = self.blueColor if 'value' in jItem: dItem = 'id' in jItem and stockData[jItem['id']] or {} d = '' if jItem['value'] == 'ROE': d = dItem[index]['y']['metrics'].get('wroe', {'t': 0})['t'] d = '{:.2%}'.format(d) dItem[index]['ROE'] = d elif jItem['value'] == 'ROE_A': d = dItem[index]['y']['metrics'].get( 'roe_adnrpatoshaopc', {'t': 0})['t'] d = '{:.2%}'.format(d) dItem[index]['ROE_A'] = d elif jItem['value'] == 'ROIC': d = dItem[index]['y']['metrics'].get('rota', {'t': 0})['t'] d = '{:.2%}'.format(d) dItem[index]['ROIC'] = d elif jItem['value'] == 'GM': d = dItem[index]['y']['profitStatement']['gp_m']['t'] d = '{:.2%}'.format(d) dItem[index]['GM'] = d elif jItem['value'] == 'ROUND': # 净营业周期=存货周转天数+应收账款周转天数-应付账款周转天数 # 应收账款周转天数 arAvg = (dItem[index]['y']['balanceSheet']['ar']['t'] + dItem[index + 1]['y']['balanceSheet']['ar']['t']) / 2 ar = arAvg > 0 and 360 / ( stockData[jItem['id']][index]['y'] ['profitStatement']['oi']['t'] / arAvg) or 0 # 应付账款周转天数 apAvg = (dItem[index]['y']['balanceSheet']['ap']['t'] + dItem[index + 1]['y']['balanceSheet']['ap']['t']) / 2 ap = apAvg > 0 and 360 / ( stockData[jItem['id']][index]['y'] ['profitStatement']['oc']['t'] / apAvg) or 0 i_ds = stockData[ jItem['id']][index]['y']['metrics']['i_ds']['t'] d = i_ds + ar - ap d = '{:.2f}'.format(d) dItem[index]['ROUND'] = d print(i_ds, ar, ap) elif jItem['value'] == 'FEE': d = stockData[jItem['id']][index]['y'][ 'profitStatement']['te_r']['t'] d = '{:.2%}'.format(d) dItem[index]['FEE'] = d elif jItem['value'] == 'avg': #平均值 count = 0 for key in stockData: v = stockData[key][index][jItem['type']] vfloat = float('%' in v and v.strip('%') or v) count += vfloat d = count / len(stockData) d = '%' in v and '{:.2%}'.format( d / 100) or '{:.2f}'.format(d) avgData[jItem['type']].append(d) color = self.hightingColor newItem = QTableWidgetItem(str(d)) newItem.setBackground(color) self.table.setItem(jIndex, index, newItem) #每一行求平均值 tableHeader.append('平均值') for jIndex, jItem in enumerate(colData): if 'value' in jItem: d = 0 color = self.greenColor for index in range(tablePerDataLen): if jItem['value'] == 'avg': # 平均值 v = avgData[jItem['type']][index] else: v = stockData[jItem['id']][index][jItem['value']] vfloat = float('%' in v and v.strip('%') or v) d += vfloat d = d / tablePerDataLen d = '%' in v and '{:.2%}'.format(d / 100) or '{:.2f}'.format(d) newItem = QTableWidgetItem(str(d)) newItem.setBackground(color) self.table.setItem(jIndex, tablePerDataLen, newItem) self.table.setHorizontalHeaderLabels(tableHeader) # 设置表头数据 self.table.setVerticalHeaderLabels(tableColData) # 设置表列数据 # 获取统计数据 def getCalData(self, data): CAPEXSum = 0 # 5年资本开支之和 FCFSum = 0 # 5年自由现金流之和 ROICAVG = 0 # roic平均值 EQ = data[0]['EQ'] # 有形资产合计 lwi = data[0]['lwi'] # 有息负债 cabb = data[0]['cabb'] # 货币资金--多余现金 mc = self.price_mc # 总市值 for jIndex, jItem in enumerate(data): if (jIndex < 5): CAPEXSum += jItem['CAPEX'] FCFSum += jItem['fcf'] ROICAVG += jItem['ROIC'] return { 'BaseValue': '{:.2}'.format(FCFSum / CAPEXSum), 'ROICAVG': '{:.2%}'.format(ROICAVG / len(data)), 'EQ': EQ, 'lwi': lwi, 'cabb': cabb, 'mc': mc } def clearUI(self): for i in range(self.box.count()): boxChild = self.box.itemAt(i) for j in range(boxChild.count()): boxChild.itemAt(j).widget().deleteLater() def getUserInfo(self): self.clearUI() res = requests.get("https://www.lixinger.com/api/user/users/current", headers=Headers) if res.status_code == 200: self.dataUI() else: self.loginUI() def loginEvent(self): data = { 'uniqueName': self.usernameEdit.text(), 'password': self.passwordEidt.text() } # 用户信息 res = requests.post("https://www.lixinger.com/api/login/by-account", data) if res.status_code == 200: m_cookie = res.headers["Set-Cookie"].split(';')[0] Headers["Cookie"] = m_cookie f = open(cookieFilename, 'w') f.write(m_cookie) print(Headers["Cookie"]) self.getUserInfo() else: print("登录连接不成功%s" % (res.status_code)) # 查询按钮事件 def searchEvent(self, type): self.getStockInfo() self.getROICData() def searchPeerEvent(self, type): self.getStockInfo() self.getPeerData() # 获取股票的详细信息 def getStockInfo(self): arr = self.codeEdit.text().split(',') self.stockIdArr = [] detailStr = '' noSearchId = [] self.stockNameData = {} for item in arr: url = 'https://www.lixinger.com/api/stock/stocks/stock/' if '60' == item[0:2]: url += 'sh/' + item + '/' + item else: url += 'sz/' + item + '/' + item res = requests.get(url, headers=Headers) if res.status_code == 200: data = json.loads(res.text) self.stockIdArr.append(item) detailStr += item + ': ' + data['name'] + ' ' self.stockNameData[item] = data['name'] self.price_mc = data['priceMetrics']['mc'] #当前总市值 self.price_sp = data['priceMetrics']['sp'] #每股股价 self.price_num = data['priceMetrics']['mc'] / data[ 'priceMetrics']['sp'] #股本 elif res.status_code == 401: self.loginEvent() else: print('没有' + item + '股票') noSearchId.append(item) print(noSearchId) if len(noSearchId) > 0: noSearchStr = ','.join(noSearchId) detailStr += '(没有找到股票:' + noSearchStr + ')' self.stockInfo.setText(detailStr) print(self.stockNameData) print(self.stockIdArr) # 获取roic数据 def getROICData(self): if len(self.stockIdArr) > 0: print(self.dateEdit.text(), self.dateEditEnd.text()) p = { "stockIds": [int(self.stockIdArr[0])], "startDate": self.dateEdit.text(), "endDate": self.dateEditEnd.text(), "granularities": ["y"], "metricNames": [ "profitStatement.fe", "profitStatement.tp", "balanceSheet.tca", "balanceSheet.fa", "balanceSheet.cip", "balanceSheet.cabb", "balanceSheet.lwi", "cashFlow.ncffoa", "metrics.fcf" ], "expressionCaculateTypes": [ "t", "t_o", "t_y2y", "t_c2c", "c", "c_o", "c_y2y", "c_c2c", "c_2y", "ttm", "ttm_y2y", "ttm_c2c" ] } r = requests.post( 'https://www.lixinger.com/api/analyt/company/fs-metrics/list-info', json=p, headers=Headers) if r.status_code == 200: self.tableUI(json.loads(r.text)) elif r.status_code == 401: self.loginEvent() # 获取同行数据 def getPeerData(self): idsArr = [] time = datetime.datetime.strptime(self.dateEdit.text(), "%Y-%m-%d").date() dateStart = time + datetime.timedelta(days=-365) for val in self.stockIdArr: idsArr.append(int(val)) p = { "stockIds": idsArr, "startDate": str(dateStart), "endDate": self.dateEditEnd.text(), "granularities": ["y"], "metricNames": [ "profitStatement.gp_m", "profitStatement.te_r", "profitStatement.oi", "profitStatement.oc", "metrics.wroe", "metrics.roe_adnrpatoshaopc", "metrics.rota", "metrics.i_ds", "balanceSheet.ar", "balanceSheet.ap" ], "expressionCaculateTypes": [ "t", "t_o", "t_y2y", "t_c2c", "c", "c_o", "c_y2y", "c_c2c", "c_2y", "ttm", "ttm_y2y", "ttm_c2c" ] } r = requests.post( 'https://www.lixinger.com/api/analyt/company/fs-metrics/list-info', json=p, headers=Headers) if r.status_code == 200: self.peerTable(json.loads(r.text), idsArr) elif r.status_code == 401: self.loginEvent()
class RandomBackTest(QDialog): def __init__(self): super(RandomBackTest,self).__init__() self.codepool = ["000001","000002","000004",] self.initUI() def initUI(self): self.resize(900,600) self.setWindowTitle("QUANT XH 金融终端——随机买卖回测") self.setWindowIcon(QIcon("static/icon.png")) self.poollabel = QLabel() self.poollabel.setText("股票池") self.poollabel.setFont(QFont("仿宋", 15)) self.pooledit = QTextEdit() self.pooledit.setFont(QFont("仿宋", 12)) self.pooledit.setFixedSize(120, 30) self.pooladdbtn = QPushButton() self.pooladdbtn.setText("添加股票") self.pooladdbtn.setFont(QFont("仿宋", 12)) self.pooladdbtn.setFixedSize(100, 30) self.pooladdbtn.clicked.connect(self.addCode) self.poolclbtn = QPushButton() self.poolclbtn.setText("清空") self.poolclbtn.setFont(QFont("仿宋", 12)) self.poolclbtn.setFixedSize(80, 30) self.poolclbtn.clicked.connect(self.clearPool) self.pooltb = QTextBrowser() self.pooltb.setFixedSize(300, 300) self.pooltb.setFont(QFont("仿宋", 12)) self.fromtimelabel = QLabel() self.fromtimelabel.setText("开始时间") self.fromtimelabel.setFont(QFont("仿宋", 15)) self.fromtimeedit = QDateEdit() datefrom = datetime.strptime("2019-01-01", "%Y-%m-%d").date() self.fromtimeedit.setDate(datefrom) self.fromtimeedit.setFont(QFont("仿宋", 12)) self.fromtimeedit.setFixedSize(200,30) self.totimelabel = QLabel() self.totimelabel.setText("结束时间") self.totimelabel.setFont(QFont("仿宋", 15)) self.totimeedit = QDateEdit() dateto = datetime.strptime("2019-12-31", "%Y-%m-%d").date() self.totimeedit.setDate(dateto) self.totimeedit.setFont(QFont("仿宋", 12)) self.totimeedit.setFixedSize(200,30) self.cashlabel = QLabel() self.cashlabel.setText("初始资金") self.cashlabel.setFont(QFont("仿宋", 15)) self.cashedit = QTextEdit() self.cashedit.setText("1000000") self.cashedit.setFont(QFont("仿宋", 12)) self.cashedit.setFixedSize(200,30) self.amountlabel = QLabel() self.amountlabel.setText("单笔交易股数") self.amountlabel.setFont(QFont("仿宋", 15)) self.amountedit = QTextEdit() self.amountedit.setText("1000") self.amountedit.setFont(QFont("仿宋", 12)) self.amountedit.setFixedSize(200,30) self.selectbtn = QPushButton() self.selectbtn.setText("开始回测") self.selectbtn.setFixedSize(120,40) self.selectbtn.setFont(QFont("仿宋", 12)) self.selectbtn.clicked.connect(self.backTest) # self.resultbtn = QPushButton() # self.resultbtn.setText("回测结果") # self.resultbtn.setFixedSize(120,40) # self.resultbtn.setFont(QFont("仿宋", 12)) # self.resultbtn.setEnabled(False) self.h11box = QHBoxLayout() self.h11box.addWidget(self.pooledit) self.h11box.addWidget(self.pooladdbtn) self.h11box.addWidget(self.poolclbtn) self.h12box = QHBoxLayout() self.h12box.addWidget(self.pooltb) self.v1box = QVBoxLayout() self.v1box.addStretch(1) self.v1box.addWidget(self.poollabel) self.v1box.addLayout(self.h11box) self.v1box.addLayout(self.h12box) self.v1box.addStretch(1) self.h21box = QHBoxLayout() self.h21box.addWidget(self.selectbtn) # self.h21box.addWidget(self.resultbtn) self.v2box = QVBoxLayout() self.v2box.addStretch(1) self.v2box.addWidget(self.fromtimelabel) self.v2box.addWidget(self.fromtimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.totimelabel) self.v2box.addWidget(self.totimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.cashlabel) self.v2box.addWidget(self.cashedit) self.v2box.addStretch(1) self.v2box.addWidget(self.amountlabel) self.v2box.addWidget(self.amountedit) self.v2box.addStretch(1) self.v2box.addLayout(self.h21box) self.v2box.addStretch(1) self.hbox = QHBoxLayout() self.hbox.addLayout(self.v1box) self.hbox.addLayout(self.v2box) self.setLayout(self.hbox) self.pooltb.setPlainText(' '.join(self.codepool)) def addCode(self): f = FETCH() code = self.pooledit.toPlainText() if code in self.codepool: print(QMessageBox.information(self, "提示", "该股票已经存在于股票池中!", QMessageBox.Yes, QMessageBox.Yes)) elif code not in list(f.fetch_stock_list()['code']): print(QMessageBox.information(self, "提示", "该股票代码不存在!", QMessageBox.Yes, QMessageBox.Yes)) else: self.codepool.append(code) self.pooledit.clear() self.pooltb.setPlainText(' '.join(self.codepool)) def clearPool(self): self.codepool = [] self.pooltb.setPlainText(' '.join(self.codepool)) def backTest(self): def change_name(s): l = s.split('/') if len(l[1]) == 1: l[1] = "0" + l[1] if len(l[2]) == 1: l[2] = "0" + l[2] return ("-".join(l)) r = RBTest(cash=int(self.cashedit.toPlainText())) r.simple_backtest(self.codepool,change_name(self.fromtimeedit.text()), change_name(self.totimeedit.text()),int(self.amountedit.toPlainText())) r.save_to_mongo() # self.resultbtn.clicked.connect(self.btResult(r.ACstr)) # self.resultbtn.setEnabled(True) self.btResult(r.ACstr) def btResult(self,AC_id): dialog = BackTestResult(ACid=AC_id) dialog.setWindowFlags(Qt.WindowStaysOnTopHint) dialog.show() dialog.exec_()
class BookLog(QWidget): NavigationMode, AddingMode, EditingMode = range(3) def __init__(self, parent=None): super(BookLog, self).__init__(parent) self.contacts = SortedDict() self.oldTitle = '' self.oldMemo = '' self.oldShoziflag = False self.oldIsbn = '' self.oldDokuryodate = QDate() self.currentMode = self.NavigationMode #ラベル titleLabel = QLabel("書名:") self.titleLine = QLineEdit() self.titleLine.setReadOnly(True) dokuryoLabel = QLabel("読了日:") self.dokuryodate = QDateEdit() self.dokuryodate.setReadOnly(True) memoLabel = QLabel("メモ:") self.memoText = QTextEdit() self.memoText.setReadOnly(True) isbnLabel = QLabel("ISBN:") self.isbnLine = QLineEdit() self.isbnLine.setReadOnly(True) shoziflag = QLabel("所持:") self.shoziflag = QCheckBox() self.addButton = QPushButton("&追加") self.addButton.show() self.editButton = QPushButton("&編集") self.editButton.setEnabled(False) self.removeButton = QPushButton("&削除") self.removeButton.setEnabled(False) self.findButton = QPushButton("&検索") self.findButton.setEnabled(False) self.submitButton = QPushButton("&挿入") self.submitButton.hide() self.cancelButton = QPushButton("&キャンセル") self.cancelButton.hide() self.nextButton = QPushButton("&次") self.nextButton.setEnabled(False) self.previousButton = QPushButton("&前") self.previousButton.setEnabled(False) self.loadButton = QPushButton("&Load...") self.loadButton.setToolTip("Load contacts from a file") self.saveButton = QPushButton("Sa&ve...") self.saveButton.setToolTip("Save contacts to a file") self.saveButton.setEnabled(False) self.exportButton = QPushButton("Ex&port") self.exportButton.setToolTip("Export as vCard") self.exportButton.setEnabled(False) self.dialog = FindDialog() self.addButton.clicked.connect(self.addContact) self.submitButton.clicked.connect(self.submitContact) self.editButton.clicked.connect(self.editContact) self.removeButton.clicked.connect(self.removeContact) #self.findButton.clicked.connect(self.findContact) self.cancelButton.clicked.connect(self.cancel) self.nextButton.clicked.connect(self.next) self.previousButton.clicked.connect(self.previous) self.loadButton.clicked.connect(self.loadFromFile) self.saveButton.clicked.connect(self.saveToFile) self.exportButton.clicked.connect(self.exportAsVCard) #self.createMenus() #topFiller = QWidget() #topFiller.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) buttonLayout1 = QVBoxLayout() buttonLayout1.addWidget(self.addButton) buttonLayout1.addWidget(self.editButton) buttonLayout1.addWidget(self.removeButton) buttonLayout1.addWidget(self.findButton) buttonLayout1.addWidget(self.submitButton) buttonLayout1.addWidget(self.cancelButton) buttonLayout1.addWidget(self.loadButton) buttonLayout1.addWidget(self.saveButton) buttonLayout1.addWidget(self.exportButton) buttonLayout1.addStretch() buttonLayout2 = QHBoxLayout() buttonLayout2.addWidget(self.previousButton) buttonLayout2.addWidget(self.nextButton) mainLayout = QGridLayout() mainLayout.addWidget(titleLabel, 0, 0) mainLayout.addWidget(self.titleLine, 0, 1) mainLayout.addWidget(memoLabel, 3, 0, Qt.AlignTop) mainLayout.addWidget(self.memoText, 3, 1) mainLayout.addWidget(dokuryoLabel, 2, 0) mainLayout.addWidget(self.dokuryodate, 2, 1) mainLayout.addWidget(isbnLabel, 1, 0) mainLayout.addWidget(self.isbnLine, 1, 1) mainLayout.addWidget(shoziflag, 4, 0) mainLayout.addWidget(self.shoziflag, 4, 1) mainLayout.addLayout(buttonLayout1, 6, 2) mainLayout.addLayout(buttonLayout2, 5, 1) #テーブル self.table = QTableWidget( 100, 5, ) self.table.setHorizontalHeaderLabels(["書名", "ISBN", "読了日", "メモ", "所持"]) self.table.verticalHeader().setVisible(False) #for i, (title, memo) in enumerate(tableData): i = 0 for title, obj in self.contacts.items(): titleItem = QTableWidgetItem(title) memoItem = QTableWidgetItem() memoItem.setData(Qt.DisplayRole, memo) if obj['shoziflag'] == True: maru = '○' else: maru = '' self.table.setItem(i, 0, titleItem) self.table.setItem(i, 1, QTableWidgetItem(obj['isbn'])) self.table.setItem(i, 2, QTableWidgetItem(obj['dokuryodate'])) self.table.setItem(i, 3, QTableWidgetItem(obj['memo'])) self.table.setItem(i, 4, QTableWidgetItem(maru)) i += 1 #table.resize(150, 50) #self.table.resizeColumnToContents(0) self.table.horizontalHeader().setStretchLastSection(True) self.table.doubleClicked.connect(self.tableclick) mainLayout.addWidget(self.table, 6, 1) #mainLayout.addWidget(topFiller) self.setLayout(mainLayout) self.setWindowTitle("Simple Book Log") #self.csvImport() self.loadFromFile('./a.bl') def createUI(self): self.setWindowTitle('Equipment Manager 0.3') #Menu Bar fileMenuBar = QMenuBar(self) menuFile = QMenu(fileMenuBar) actionChangePath = QAction(tr("Change Path"), self) fileMenuBar.addMenu(menuFile) menuFile.addAction(actionChangePath) def addContact(self): self.oldTitle = self.titleLine.text() self.oldMemo = self.memoText.toPlainText() self.oldIsbn = self.isbnLine.text() self.titleLine.clear() self.memoText.clear() self.isbnLine.clear() self.updateInterface(self.AddingMode) def editContact(self): self.oldTitle = self.titleLine.text() self.oldMemo = self.memoText.toPlainText() self.oldDokuryodate = self.dokuryodate.text() self.oldIsbn = self.isbnLine.text() self.oldShoziflag = self.shoziflag.isChecked() self.updateInterface(self.EditingMode) def submitContact(self): title = self.titleLine.text() memo = self.memoText.toPlainText() isbn = self.isbnLine.text() dokuryodate = self.dokuryodate.text() shoziflag = self.shoziflag.isChecked() if title == "" or memo == "": QMessageBox.information(self, "Empty Field", "Please enter a title and memo.") return if self.currentMode == self.AddingMode: if title not in self.contacts: self.contacts[title] = { 'memo': memo, 'dokuryodate': dokuryodate, 'isbn': isbn, 'shoziflag': shoziflag } QMessageBox.information(self, "追加しました", "\"%s\" は追加されました。" % title) else: QMessageBox.information(self, "追加できませんでした", "\"%s\" はすでに存在しています。" % title) return elif self.currentMode == self.EditingMode: if self.oldTitle != title: if title not in self.contacts: QMessageBox.information(self, "編集しました", "\"%s\" は編集されました。" % self.oldTitle) del self.contacts[self.oldTitle] self.contacts[title] = memo else: QMessageBox.information(self, "編集できませんでした。", "\"%s\"はすでに存在しています。" % title) return elif self.oldMemo != memo: QMessageBox.information(self, "編集しました", "\"%s\"は編集されました。" % title) self.contacts[title] = { memo: memo, dokuryodate: dokuryodate, shoziflag: shoziflag, isbn: isbn } self.updateInterface(self.NavigationMode) # ボタンの処理 def cancel(self): self.titleLine.setText(self.oldTitle) self.memoText.setText(self.oldMemo) self.dokuryodate.setDate(self.oldDokuryodate) self.shoziflag.setChecked(self.oldShoziflag) self.isbnLine.setText(self.oldIsbn) self.updateInterface(self.NavigationMode) def removeContact(self): title = self.titleLine.text() memo = self.memoText.toPlainText() if title in self.contacts: button = QMessageBox.question( self, "Confirm Remove", "Are you sure you want to remove \"%s\"?" % title, QMessageBox.Yes | QMessageBox.No) if button == QMessageBox.Yes: self.previous() del self.contacts[title] QMessageBox.information( self, "Remove Successful", "\"%s\" has been removed from your memo book." % title) self.updateInterface(self.NavigationMode) def next(self): title = self.titleLine.text() it = iter(self.contacts) try: while True: this_title, _ = it.next() if this_title == title: next_title, next_memo, next_date = it.next() break except StopIteration: next_title, next_memo = iter(self.contacts).next() self.titleLine.setText(next_title) self.memoText.setText(next_memo) def previous(self): title = self.titleLine.text() prev_title = prev_memo = None for this_title, this_memo in self.contacts: if this_title == title: break prev_title = this_title prev_memo = this_memo else: self.titleLine.clear() self.memoText.clear() return if prev_title is None: for prev_title, prev_memo in self.contacts: pass self.titleLine.setText(prev_title) self.memoText.setText(prev_memo) def Contact(self): self.dialog.show() if self.dialog.exec_() == QDialog.Accepted: contactTitle = self.dialog.getFindText() found = False for this_title, this_memo in self.contacts: # if contactTitle in this_title: if re.search(contactTitle, this_title): found = True break if found: self.titleLine.setText(this_title) self.memoText.setText(self.contacts[this_title]) self.isbnLine.setText(self.contacts[this_title]) self.dokuryodate.setDate(self.contacts[this_title]) self.shoziflag.setChecked(self.contacts[this_title]) else: QMessageBox.information( self, "Contact Not Found", "Sorry, \"%s\" is not in your address book." % contactTitle) return self.updateInterface(self.NavigationMode) # ボタンを押せるか押せないかの処理 def updateInterface(self, mode): self.currentMode = mode if self.currentMode in (self.AddingMode, self.EditingMode): self.titleLine.setReadOnly(False) self.titleLine.setFocus(Qt.OtherFocusReason) self.isbnLine.setReadOnly(False) self.dokuryodate.setReadOnly(False) self.memoText.setReadOnly(False) self.addButton.setEnabled(False) self.editButton.setEnabled(False) self.removeButton.setEnabled(False) self.nextButton.setEnabled(False) self.previousButton.setEnabled(False) self.submitButton.show() self.cancelButton.show() self.loadButton.setEnabled(False) self.saveButton.setEnabled(False) self.exportButton.setEnabled(False) elif self.currentMode == self.NavigationMode: if not self.contacts: self.titleLine.clear() self.memoText.clear() self.dokuryodate.clear() self.isbnLine.clear() self.titleLine.setReadOnly(True) self.memoText.setReadOnly(True) self.dokuryodate.setReadOnly(True) self.shoziflag self.isbnLine.setReadOnly(True) self.addButton.setEnabled(True) number = len(self.contacts) self.editButton.setEnabled(number >= 1) self.removeButton.setEnabled(number >= 1) self.findButton.setEnabled(number > 2) self.nextButton.setEnabled(number > 1) self.previousButton.setEnabled(number > 1) self.submitButton.hide() self.cancelButton.hide() self.exportButton.setEnabled(number >= 1) self.loadButton.setEnabled(True) self.saveButton.setEnabled(number >= 1) #テーブルの更新 i = 0 for title, obj in self.contacts.items(): titleItem = QTableWidgetItem(title) memoItem = QTableWidgetItem() memoItem.setData(Qt.DisplayRole, obj['memo']) if obj['shoziflag'] == True: maru = '○' else: maru = '' self.table.setItem(i, 0, titleItem) self.table.setItem(i, 1, QTableWidgetItem(obj['isbn'])) self.table.setItem(i, 2, QTableWidgetItem(obj['dokuryodate'])) self.table.setItem(i, 3, QTableWidgetItem(obj['memo'])) self.table.setItem(i, 4, QTableWidgetItem(maru)) i += 1 def saveToFile(self): fileTitle, _ = QFileDialog.getSaveFileName( self, "Save book log", '', "Book Log (*.bl);;All Files (*)") if not fileTitle: return try: out_file = open(str(fileTitle), 'wb') except IOError: QMessageBox.information( self, "Unable to open file", "There was an error opening \"%s\"" % fileTitle) return pickle.dump(self.contacts, out_file) out_file.close() def loadFromFile(self, fileName=None): if not fileName: fileName, _ = QFileDialog.getOpenFileName( self, "Open Address Book", '', "Address Book (*.bl);;All Files (*)") try: in_file = open(str(fileName), 'rb') except IOError: QMessageBox.information( self, "Unable to open file", "There was an error opening \"%s\"" % fileName) return self.contacts = pickle.load(in_file) in_file.close() if len(self.contacts) == 0: QMessageBox.information( self, "No contacts in file", "The file you are attempting to open contains no " "contacts.") else: for title, obj in self.contacts: date = QDate.fromString(obj['dokuryodate']) self.titleLine.setText(title) self.memoText.setText(obj['memo']) self.shoziflag.setChecked(obj['shoziflag']) self.isbnLine.setText(obj['isbn']) self.dokuryodate.setDate(date) self.updateInterface(self.NavigationMode) def exportAsVCard(self): title = str(self.titleLine.text()) memo = self.memoText.toPlainText() titleList = title.split() if len(titleList) > 1: firstName = nameList[0] lastName = nameList[-1] else: firstName = name lastName = '' fileName, _ = QFileDialog.getSaveFileName( self, "Export Contact", '', "vCard Files (*.vcf);;All Files (*)") if not fileName: return out_file = QFile(fileName) if not out_file.open(QIODevice.WriteOnly): QMessageBox.information(self, "Unable to open file", out_file.errorString()) return out_s = QTextStream(out_file) out_s << 'BEGIN:VCARD' << '\n' out_s << 'VERSION:2.1' << '\n' out_s << 'N:' << lastName << ';' << firstName << '\n' out_s << 'FN:' << ' '.join(nameList) << '\n' address.replace(';', '\\;') address.replace('\n', ';') address.replace(',', ' ') out_s << 'ADR;HOME:;' << address << '\n' out_s << 'END:VCARD' << '\n' QMessageBox.information(self, "Export Successful", "\"%s\" has been exported as a vCard." % name) def csvImport(self): with open('MediaMarkerExport.csv', newline='', encoding='utf-8') as f: reader = csv.reader(f) for r in reader: if r[2] == 1: flag = True else: flag = False self.contacts[r[0]] = { 'isbn': r[1], 'dokuryodate': r[3].replace('-', '/'), 'shoziflag': flag, 'memo': '' } aa = 0 def createMenus(self): self.fileMenu = self.menuBar().addMenu("&File") #self.fileMenu.addAction(self.newAct) #self.fileMenu.addAction(self.openAct) #self.fileMenu.addAction(self.saveAct) #self.fileMenu.addAction(self.printAct) #self.fileMenu.addSeparator() #self.fileMenu.addAction(self.exitAct) self.editMenu = self.menuBar().addMenu("&Edit") self.editMenu.addAction(self.undoAct) self.editMenu.addAction(self.redoAct) self.editMenu.addSeparator() self.editMenu.addAction(self.cutAct) self.editMenu.addAction(self.copyAct) self.editMenu.addAction(self.pasteAct) self.editMenu.addSeparator() self.helpMenu = self.menuBar().addMenu("&Help") self.helpMenu.addAction(self.aboutAct) self.helpMenu.addAction(self.aboutQtAct) self.formatMenu = self.editMenu.addMenu("&Format") self.formatMenu.addAction(self.boldAct) self.formatMenu.addAction(self.italicAct) self.formatMenu.addSeparator().setText("Alignment") self.formatMenu.addAction(self.leftAlignAct) self.formatMenu.addAction(self.rightAlignAct) self.formatMenu.addAction(self.justifyAct) self.formatMenu.addAction(self.centerAct) self.formatMenu.addSeparator() self.formatMenu.addAction(self.setLineSpacingAct) self.formatMenu.addAction(self.setParagraphSpacingAct) def tableclick(self, mi): row = mi.row() column = mi.column() #QMessageBox.information(self, "Export Successful", # "%d x %d" % (row, column)) title = self.titleLine.text() it = iter(self.contacts) try: n = 0 while True: next_title, next_obj = it.next() if row == n: break n += 1 except StopIteration: next_title, next_obj = iter(self.contacts).next() self.titleLine.setText(next_title) self.memoText.setText(next_obj['memo']) self.isbnLine.setText(next_obj['isbn']) self.dokuryodate.setDate(next_obj['dokuryodate']) self.shoziflag.setChecked(next_obj['shoziflag'])
class YiBanCY(QWidget): def __init__(self, base_path): super(YiBanCY, self).__init__() self.filename = base_path + "案件信息.xlsx" self.base_path = base_path style_str = "QLabel{font-size: 30px;}" + "QLineEdit{font-size: 30px;}" + \ "QPushButton{font-size: 25px; background-color: green; min-height: 35px}" + \ "QComboBox{font-size: 30px;}" + "QCheckBox{font-size: 30px;}" + \ "QHeaderView{font-size: 25px;} QTableWidget{font-size: 25px;}" + \ "QDateTimeEdit{font-size: 30px;} QMessageBox{font-size: 30px;} QTextEdit{font-color: red}" self.setStyleSheet(style_str) init_data = self.get_init_info() layout = QGridLayout() # 开始时间 self.label_start_time = QLabel("开始时间") if init_data["start_time"]: self.edit_start_time = QDateTimeEdit( datetime.strptime(init_data["start_time"], "%Y-%m-%d %H:%M")) else: self.edit_start_time = QDateTimeEdit(datetime.now()) self.edit_start_time.setDisplayFormat("yyyy-MM-dd HH:mm") layout.addWidget(self.label_start_time, 0, 0) layout.addWidget(self.edit_start_time, 0, 1) # 结束时间 self.label_end_time = QLabel("结束时间") if init_data["end_time"]: self.edit_end_time = QDateTimeEdit( datetime.strptime(init_data["end_time"], "%Y-%m-%d %H:%M")) else: self.edit_end_time = QDateTimeEdit(datetime.now()) self.edit_end_time.setDisplayFormat("yyyy-MM-dd HH:mm") layout.addWidget(self.label_end_time, 0, 2) layout.addWidget(self.edit_end_time, 0, 3) # 被检查人(工商户字号,公司名称) self.label_beijiancharen = QLabel("被检查人(工商户字号,公司名称)") if init_data["beijiancharen"]: self.edit_beijiancharen = QLineEdit(init_data["beijiancharen"]) else: self.edit_beijiancharen = QLineEdit() layout.addWidget(self.label_beijiancharen, 1, 0) layout.addWidget(self.edit_beijiancharen, 1, 1) # 联系方式 self.label_lianxifangshi = QLabel("联系方式") if init_data["lianxifangshi"]: self.edit_lianxifangshi = QLineEdit(init_data["lianxifangshi"]) else: self.edit_lianxifangshi = QLineEdit() layout.addWidget(self.label_lianxifangshi, 1, 2) layout.addWidget(self.edit_lianxifangshi, 1, 3) # 经营者姓名(法定代表人) self.label_jingyingzhe = QLabel("经营者姓名(法定代表人)") if init_data["jingyingzhe"]: self.edit_jingyingzhe = QLineEdit(init_data["jingyingzhe"]) else: self.edit_jingyingzhe = QLineEdit() layout.addWidget(self.label_jingyingzhe, 2, 0) layout.addWidget(self.edit_jingyingzhe, 2, 1) # 身份证件号码 self.label_shenfenzheng = QLabel("身份证件号码") if init_data["shenfenzheng"]: self.edit_shenfenzheng = QLineEdit(init_data["shenfenzheng"]) else: self.edit_shenfenzheng = QLineEdit() layout.addWidget(self.label_shenfenzheng, 2, 2) layout.addWidget(self.edit_shenfenzheng, 2, 3) # 身份证件地址 self.label_shenfenzheng_dizhi = QLabel("身份证件地址") if init_data["shenfenzheng_dizhi"]: self.edit_shenfenzheng_dizhi = QLineEdit( init_data["shenfenzheng_dizhi"]) else: self.edit_shenfenzheng_dizhi = QLineEdit() layout.addWidget(self.label_shenfenzheng_dizhi, 3, 0) layout.addWidget(self.edit_shenfenzheng_dizhi, 3, 1) # 烟草专卖许可证号码 self.label_xukezheng = QLabel("烟草专卖许可证号码") if init_data["xukezheng"]: self.edit_xukezheng = QLineEdit(init_data["xukezheng"]) else: self.edit_xukezheng = QLineEdit() layout.addWidget(self.label_xukezheng, 3, 2) layout.addWidget(self.edit_xukezheng, 3, 3) # 零售户类型 self.label_lingshouhu = QLabel("零售户类型") self.edit_lingshouhu = QComboBox() self.edit_lingshouhu.addItems(["个体零售户", "企业零售户"]) if init_data["lingshouhu"]: self.edit_lingshouhu.setCurrentText(init_data["lingshouhu"]) layout.addWidget(self.label_lingshouhu, 4, 0) layout.addWidget(self.edit_lingshouhu, 4, 1) # 举报时间(非举报不填写) self.jvbao_time = QLabel("举报时间(非举报不填写)") if init_data["jvbao_time"]: self.edit_jvbao_time = QDateTimeEdit( datetime.strptime(init_data["jvbao_time"], "%Y-%m-%d %H:%M")) else: self.edit_jvbao_time = QDateTimeEdit( datetime.strptime("2000-01-01 00:00", "%Y-%m-%d %H:%M")) self.edit_jvbao_time.setDisplayFormat("yyyy-MM-dd HH:mm") layout.addWidget(self.jvbao_time, 4, 2) layout.addWidget(self.edit_jvbao_time, 4, 3) # 案发时间 self.label_qita_guanxiren = QLabel("其他关系人") if init_data["qita_guanxiren"]: self.edit_qita_guanxiren = QLineEdit(init_data["qita_guanxiren"]) else: self.edit_qita_guanxiren = QLineEdit("店员") layout.addWidget(self.label_qita_guanxiren, 5, 0) layout.addWidget(self.edit_qita_guanxiren, 5, 1) # 执法人员 self.label_zhifarenyuan = QLabel("执法人员") if init_data["zhifarenyuan"]: self.edit_zhifarenyuan = QLineEdit(init_data["zhifarenyuan"]) else: self.edit_zhifarenyuan = QLineEdit() layout.addWidget(self.label_zhifarenyuan, 5, 2) layout.addWidget(self.edit_zhifarenyuan, 5, 3) # 许可证有效期 self.label_xukezheng_end = QLabel("许可证有效期") if init_data["xukezheng_end"]: self.edit_xukezheng_end = QDateEdit( datetime.strptime(init_data["xukezheng_end"], "%Y-%m-%d").date()) else: self.edit_xukezheng_end = QDateEdit(datetime.now().date()) self.edit_xukezheng_end.setDisplayFormat("yyyy-MM-dd") layout.addWidget(self.label_xukezheng_end, 6, 0) layout.addWidget(self.edit_xukezheng_end, 6, 1) # 许可证地址 self.label_location = QLabel("许可证地址") if init_data["location"]: self.edit_location = QLineEdit(init_data["location"]) else: self.edit_location = QLineEdit() layout.addWidget(self.label_location, 6, 2) layout.addWidget(self.edit_location, 6, 3) # 案由选择 self.label_anyou = QLabel("案由") self.edit_anyou = AnYou(init_data["anyou"]) layout.addWidget(self.label_anyou, 7, 0) layout.addWidget(self.edit_anyou, 7, 1, 1, 3) # 抽样规则 rule_str = '<p><font color="red">1.数量不足两条:抽取一条或全部数量形成试样。</font></p>' rule_str += '<p><font color="red">2.数量2件以下:所有样品中抽取1~2条形成试样。</font></p>' rule_str += '<p><font color="red">3.数量5件以下:每件抽取1~2条,形成样本,再从样本中随机抽取2条形成试样。</font></p>' rule_str += '<p><font color="red">4.数量5件~10件:每件中随机抽取1条,形成样本,在从样本中随机抽取2条形成试样。</font></p>' rule_str += '<p><font color="red">5.数量10件~50件:随机抽取10件,从每件中随机抽取1条,形成样本,再从样本中随机抽取2~5条形成试样。</font></p>' rule_str += '<p><font color="red">6.数量50件以上:随机抽取20件,从每件中随机抽取1条,形成样本,再从样本中随机抽取5~10条形成试样。</font></p>' self.chou_rule = QTextEdit() self.chou_rule.setHtml(rule_str) self.chou_rule.setFixedHeight(130) self.label_chou_rule = QLabel("抽样规则") layout.addWidget(self.label_chou_rule, 8, 0) layout.addWidget(self.chou_rule, 8, 1, 1, 3) # 抽样记录表 self.table_info = QTableWidget() self.table_info.setColumnCount(4) self.table_info.setHorizontalHeaderLabels( ["物品名称", "品牌规格", "查获数量(条)", "抽样数量(条)"]) self.table_info.horizontalHeader().setSectionResizeMode( QHeaderView.Stretch) if not init_data["chou_data"]: wb = openpyxl.load_workbook(self.filename) yan_datas = get_yan_info(wb) for yan_data in yan_datas: init_data["chou_data"].append({ "yan_name": yan_data["yan_name"], "yan_count": yan_data["yan_count"], "yan_chou": 1, "yan_pinzhong": yan_data["yan_pinzhong"] }) self.init_table(init_data["chou_data"]) # 提交按钮 self.btn_finish = QPushButton("完成") layout.addWidget(self.table_info, 9, 0, 1, 4) layout.addWidget(self.btn_finish, 10, 0, 1, 4) self.setLayout(layout) # 获取初始化信息 def get_init_info(self): wb = openpyxl.load_workbook(self.filename) try: ws = wb["一般案件"] except Exception as e: print(e) print("创建sheet") ws = wb.create_sheet(title="一般案件") anyou = ['', '', '', '', ''] if ws["B9"].value: anyou[0] = ws["B9"].value if ws["C9"].value: anyou[1] = ws["C9"].value if ws["D9"].value: anyou[2] = ws["D9"].value if ws["E9"].value: anyou[3] = ws["E9"].value if ws["E9"].value: anyou[4] = ws["F9"].value data = { "start_time": ws["B1"].value, "end_time": ws["B2"].value, "beijiancharen": ws["B3"].value, "lianxifangshi": ws["B4"].value, "jingyingzhe": ws["B5"].value, "shenfenzheng": ws["B6"].value, "shenfenzheng_dizhi": ws["B7"].value, "xukezheng": ws["B8"].value, "anyou": anyou, # B9 "lingshouhu": ws["B10"].value, "jvbao_time": ws["B11"].value, "qita_guanxiren": ws["B12"].value, "zhifarenyuan": ws["B13"].value, "xukezheng_end": ws["B14"].value, "location": ws["B15"].value, "chou_data": get_chou_data(ws) } wb.save(self.filename) return data # 渲染图表 def init_table(self, datas): self.table_info.setRowCount(len(datas)) for index, data in enumerate(datas): self.table_info.setItem(index, 0, QTableWidgetItem(data["yan_pinzhong"])) self.table_info.setItem(index, 1, QTableWidgetItem(data["yan_name"])) self.table_info.setItem(index, 2, QTableWidgetItem(str(data["yan_count"]))) self.table_info.setCellWidget(index, 3, QLineEdit(str(data["yan_chou"]))) # 清空抽样数据 def clear_chou_data(self, ws): index = 16 while (True): yan_name = ws["A" + str(index)].value if not yan_name: break ws["A" + str(index)] = "" ws["B" + str(index)] = "" ws["C" + str(index)] = "" ws["D" + str(index)] = "" # 存储抽样数据 def handle_chou_data(self, ws): start_index = 16 self.clear_chou_data(ws) for index in range(self.table_info.rowCount()): ws["A" + str(index + start_index)] = self.table_info.item( index, 0).text() ws["B" + str(index + start_index)] = self.table_info.item( index, 1).text() ws["C" + str(index + start_index)] = self.table_info.item( index, 2).text() ws["D" + str(index + start_index)] = self.table_info.cellWidget( index, 3).text() # 处理数据 def handle_info(self): result = {} start_time = self.edit_start_time.text() if not start_time: QMessageBox.critical(self, "错误", "请填写开始时间", QMessageBox.Yes) return False result["start_time"] = datetime.strptime(start_time, "%Y-%m-%d %H:%M") end_time = self.edit_end_time.text() if not end_time: QMessageBox.critical(self, "错误", "请填写结束时间", QMessageBox.Yes) return False result["end_time"] = datetime.strptime(end_time, "%Y-%m-%d %H:%M") beijiancharen = self.edit_beijiancharen.text() if not beijiancharen: QMessageBox.critical(self, "错误", "请填写被检查人(工商户字号,公司名称)", QMessageBox.Yes) return False result["beijiancharen"] = beijiancharen lianxifangshi = self.edit_lianxifangshi.text() if not lianxifangshi: QMessageBox.critical(self, "错误", "请填写联系方式", QMessageBox.Yes) return False result["lianxifangshi"] = lianxifangshi jingyingzhe = self.edit_jingyingzhe.text() if not jingyingzhe: QMessageBox.critical(self, "错误", "请填写经营者姓名(法定代表人)", QMessageBox.Yes) return False result["jingyingzhe"] = jingyingzhe shenfenzheng = self.edit_shenfenzheng.text() if not shenfenzheng: QMessageBox.critical(self, "错误", "请填写经营者身份证件号", QMessageBox.Yes) return False else: try: get_info_from_idcard(shenfenzheng) except Exception as e: QMessageBox.critical(self, "错误", "请填写正确的经营者身份证号", QMessageBox.Yes) return False result["shenfenzheng"] = shenfenzheng shenfenzheng_dizhi = self.edit_shenfenzheng_dizhi.text() if not shenfenzheng_dizhi: QMessageBox.critical(self, "错误", "请填写经营者身份证件地址", QMessageBox.Yes) return False result["shenfenzheng_dizhi"] = shenfenzheng_dizhi xukezheng = self.edit_xukezheng.text() # if not xukezheng: # QMessageBox.critical(self, "错误", "请填写烟草专卖许可证号码", QMessageBox.Yes) # return False result["xukezheng"] = xukezheng anyou_status, anyou = self.edit_anyou.get_anyou_info() if not anyou_status: QMessageBox.critical(self, "错误", "请勾选案由", QMessageBox.Yes) return False result["anyou"] = anyou lingshouhu = self.edit_lingshouhu.currentText() result["lingshouhu"] = lingshouhu jvbao_time = self.edit_jvbao_time.text() result["jvbao_time"] = jvbao_time zhifarenyuan = self.edit_zhifarenyuan.text() if not zhifarenyuan: QMessageBox.critical(self, "错误", "请填写执法人员信息", QMessageBox.Yes) return False result["zhifarenyuan"] = zhifarenyuan xukezheng_end = self.edit_xukezheng_end.text() result["xukezheng_end"] = datetime.strptime(xukezheng_end, "%Y-%m-%d").date() location = self.edit_location.text() if not location: QMessageBox.critical(self, "错误", "请填写许可证地址", QMessageBox.Yes) return False result["location"] = location qita_guanxiren = self.edit_qita_guanxiren.text() result["qita_guanxiren"] = qita_guanxiren # 存储数据 wb = openpyxl.load_workbook(self.filename) ws = wb["一般案件"] ws["A1"] = "开始时间" ws["B1"] = start_time ws["A2"] = "结束时间" ws["B2"] = end_time ws["A3"] = "被检查人(工商户字号,公司名称)" ws["B3"] = beijiancharen ws["A4"] = "联系方式" ws["B4"] = lianxifangshi ws["A5"] = "经营者姓名(法定代表人)" ws["B5"] = jingyingzhe ws["A6"] = "身份证件号码" ws["B6"] = shenfenzheng ws["A7"] = "身份证件地址" ws["B7"] = shenfenzheng_dizhi ws["A8"] = "烟草专卖许可证号码" ws["B8"] = xukezheng ws["A9"] = "案由" ws["B9"] = anyou[0] ws["C9"] = anyou[1] ws["D9"] = anyou[2] ws["E9"] = anyou[3] ws["F9"] = anyou[4] ws["A10"] = "零售户类型" ws["B10"] = lingshouhu ws["A11"] = "举报时间" ws["B11"] = jvbao_time ws["A12"] = "其他关系人" ws["B12"] = qita_guanxiren ws["A13"] = "执法人员" ws["B13"] = zhifarenyuan ws["A14"] = "许可证有效期" ws["B14"] = xukezheng_end ws["A15"] = "许可证地址" ws["B15"] = location # 存储抽样信息 self.handle_chou_data(ws) wb.save(self.filename) createYiBan(wb, result, self.base_path) wb.save(self.filename) return True
class AssignmentDialog(PlannerQDialog): def __init__(self, app, title: str, assignment_id: int = None): super().__init__(app, title, 4) self.course = app.planner.get_current_course() y, m, d = str(datetime.now().date()).split("-") date = QDate(int(y), int(m), int(d)) # Create Widgets self.lineedit_name = QLineEdit() self.lineedit_name.textChanged.connect(self.check_text) self.dateedit_due = QDateEdit() self.dateedit_due.setDate(date) self.dateedit_due.setStyle(QStyleFactory.create("Fusion")) # Add the Widgets self.add_widget("Name", self.lineedit_name) self.add_widget("Due Date", self.dateedit_due) self.lineedit_name.setFocus() self.old_info = None if assignment_id is not None: self.load_info(assignment_id) def get_name(self) -> (str, int, int, str): """Return name from QComboBox""" return self.lineedit_name.text() def get_date(self) -> str: """Return the date from QDateEdit as a string, add extra 0 in front of single digit months or days """ m, d, y = self.dateedit_due.text().split("/") return f"{y}-{0 if len(m) == 1 else ''}{m}-{0 if len(d) == 1 else ''}{d}" def load_info(self, assignment_id: int) -> None: """Loads assignment information into dialog to edit""" self.old_info = self.app.planner.find_assignment(assignment_id) _, name, _, _, due_date = self.old_info y, m, d = due_date.split("-") date = QDate(int(y), int(m), int(d)) self.lineedit_name.setText(name) self.dateedit_due.setDate(date) def ok_clicked(self): """Attempts to add assignment to course""" course_id = self.course[0] name = self.get_name() date = self.get_date() # If the assignment is being edited and the name is the same # except with capitalization changes, accept change # Also applies for if only the date is being changed if len(name) > 25: self.set_message( f"25 character limit ({len(name) - 25} chars over)") elif len(name) < 3: self.set_message("3 character minimum") elif self.old_info is not None and name.lower( ) == self.old_info[1].lower(): self.app.planner.update_assignment(self.old_info[0], "name", name) self.app.planner.update_assignment(self.old_info[0], "due_date", date) self.accept() # If the assignment name is already being used, set message elif self.app.planner.has_assignment(course_id, name): self.set_message("Assignment Already Exists") # If the assignment is being edited and the name is changed to # an available name, update assignment elif self.old_info is not None: self.app.planner.update_assignment(self.old_info[0], "name", name) self.app.planner.update_assignment(self.old_info[0], "due_date", date) self.accept() # Otherwise, the assignment is new and needs to be added else: self.app.planner.add_assignment(self.course[0], name, date) self.accept()
class FinanceCalendarPage(QWidget): def __init__(self, delta_days, *args, **kwargs): super(FinanceCalendarPage, self).__init__(*args, **kwargs) layout = QVBoxLayout(margin=0, spacing=2) # 日期选择 date_widget = QWidget(parent=self, objectName='dateWidget') date_widget.setFixedHeight(22) message_button_layout = QHBoxLayout(margin=0, spacing=0) self.date_edit = QDateEdit(QDate.currentDate().addDays(delta_days), parent=date_widget, dateChanged=self.getCurrentFinanceCalendar, objectName='dateEdit') self.date_edit.setDisplayFormat('yyyy-MM-dd') self.date_edit.setCalendarPopup(True) message_button_layout.addWidget(QLabel('日期:')) message_button_layout.addWidget(self.date_edit) message_button_layout.addStretch() # 伸缩 date_widget.setLayout(message_button_layout) layout.addWidget(date_widget, alignment=Qt.AlignTop) # 当前数据显示表格 self.finance_table = FinanceCalendarTable() layout.addWidget(self.finance_table) # 无数据的显示 self.no_data_label = QLabel('暂无相关数据...', styleSheet='color:rgb(200,100,50)', alignment=Qt.AlignHCenter | Qt.AlignTop) self.no_data_label.hide() layout.addWidget(self.no_data_label) self.setLayout(layout) self.setStyleSheet(""" #dateWidget{ background-color: rgb(178,200,187) } #dateWidget #dateEdit{ background-color: rgb(250,250,250); margin:0; padding:0; border: 1px solid rgb(250,250,250); } #dateWidget #dateEdit::drop-down{ border:2px; background-color:rgb(178,210,197); } #dateWidget #dateEdit::down-arrow{ image:url("media/more.png"); width: 15px; height:15px; } """) # 获取当前日期财经日历 def getCurrentFinanceCalendar(self): current_date = self.date_edit.text() current_page = 1 try: r = requests.get(url=settings.SERVER_ADDR + 'fecalendar/?page=' + str(current_page) + '&page_size=50&date=' + current_date) response = json.loads(r.content.decode('utf-8')) if r.status_code != 200: raise ValueError(response['message']) except Exception: self.finance_table.hide() self.no_data_label.show() else: if response['fecalendar']: self.finance_table.showRowContents(response['fecalendar']) self.finance_table.show() self.no_data_label.hide() else: self.finance_table.hide() self.no_data_label.show()
class AddWindow(QMainWindow): def __init__(self, table="expense"): super(AddWindow, self).__init__() self.setWindowTitle("Add " + table) self.setGeometry(200, 200, 400, 500) self.widget = QWidget() self.layout = QVBoxLayout() intrestrict = QDoubleValidator() if table == "expense": self.name = QLineEdit(placeholderText="Item") self.name.setMaximumWidth(500) self.brand = QLineEdit(placeholderText="Brand") self.brand.setMaximumWidth(500) self.category = QLineEdit(placeholderText="ingredient/equipment") self.category.setMaximumWidth(500) self.quantity = QLineEdit(placeholderText="Quantity") self.quantity.setMaximumWidth(500) self.unit = QLineEdit(placeholderText="unit (g,ml,unit...)") self.unit.setMaximumWidth(500) self.quantity.setMaximumWidth(500) self.supplier = QLineEdit(placeholderText="supplier") self.supplier.setMaximumWidth(500) self.note = QLineEdit(placeholderText="Note") self.note.setMaximumHeight(500) self.note.setMaximumWidth(500) self.date = QDateEdit() self.date.setDateTime(QDateTime.currentDateTime()) self.date.setMaximumWidth(500) self.price = QLineEdit(placeholderText='Cost ($)') self.price.setMaximumWidth(500) self.price.setValidator(intrestrict) self.button = QPushButton("Add Expense") #self.button.clicked.connect(lambda: database.add_expense(self.name.text(), \ # self.supplier.text(), float(self.quantity.text()), self.category.text(), \ # self.unit.text(), self.brand.text(), float(self.price.text()), self.note.text(), self.date.text())) self.button.clicked.connect(self.click_expense) self.expenses_layout() elif table == "sale": self.date = QDateEdit() self.date.setDateTime(QDateTime.currentDateTime()) self.date.setMaximumWidth(400) self.customer = QLineEdit(placeholderText="Customer") self.customer.setMaximumWidth(500) self.product = QLineEdit(placeholderText="Product") self.product.setMaximumWidth(500) self.quantity = QLineEdit(placeholderText="Quantity") self.total = QLineEdit(placeholderText="Total") self.total.setValidator(intrestrict) self.discount = QCheckBox("Discounted") self.button = QPushButton("Add Sale") self.button.clicked.connect(self.click_sale) self.sales_layout() elif table == "product": self.type = QLineEdit( placeholderText="Category (Bread, Pastry...)") self.type.setMaximumWidth(500) self.name = QLineEdit(placeholderText="Product Name") self.name.setMaximumWidth(500) self.price = QLineEdit(placeholderText="Price") self.price.setMaximumWidth(500) self.price.setValidator(intrestrict) # Recipe must be inputted as comma separated values # Each new ingredient must be on a new line self.recipe = QTextEdit( placeholderText="Recipe (Ingredient, Quantity)") self.recipe.setMaximumWidth(700) self.recipe.setMaximumHeight(1000) self.batch_yield = QLineEdit( placeholderText="Batch Yield (in g or unit)") self.batch_yield.setMaximumWidth(500) self.batch_yield.setValidator(intrestrict) self.note = QLineEdit(placeholderText="Note") self.note.setMaximumWidth(700) self.note.setMaximumHeight(500) self.button = QPushButton("Add Product") #self.button.clicked.connect(lambda: database.add_product(self.type.text(),\ # self.name.text(), float(str(self.price.text())), self.read_recipe(self.recipe.toPlainText()), \ # float(str(self.batch_yield.text())), self.note.text())) self.button.clicked.connect(self.click_product) self.products_layout() self.widget.setLayout(self.layout) self.setCentralWidget(self.widget) def click_expense(self): database.add_expense(self.name.text(), \ self.supplier.text(), float(self.quantity.text()), self.category.text(), \ self.unit.text(), self.brand.text(), float(self.price.text()), self.note.text(), self.date.text()) self.close() def click_sale(self): database.add_sale(self.customer.text(), \ self.product.text(), float(self.quantity.text()), float(self.total.text()),\ self.discount.isChecked(), self.date.text()) self.close() def click_product(self): database.add_product(self.type.text(),\ self.name.text(), float(str(self.price.text())), self.read_recipe(self.recipe.toPlainText()), \ float(str(self.batch_yield.text())), self.note.text()) self.close() def expenses_layout(self): self.layout.addWidget(self.name) self.layout.addWidget(self.brand) self.layout.addWidget(self.category) self.layout.addWidget(self.quantity) self.layout.addWidget(self.unit) self.layout.addWidget(self.supplier) self.layout.addWidget(self.price) self.layout.addWidget(self.date) self.layout.addWidget(self.note) self.layout.addWidget(self.button) def sales_layout(self): self.layout.addWidget(self.date) self.layout.addWidget(self.customer) self.layout.addWidget(self.product) self.layout.addWidget(self.quantity) self.layout.addWidget(self.total) self.layout.addWidget(self.discount) self.layout.addWidget(self.button) def read_recipe(self, text): text_by_line = text.split("\n") print(text_by_line) ret = [] for s in text_by_line: if "," in s: line = s.split(",") ing = line[0].strip() quantity = float(line[1].strip()) add = (ing, quantity) ret.append(add) return ret def products_layout(self): self.layout.addWidget(self.type) self.layout.addWidget(self.name) self.layout.addWidget(self.price) self.layout.addWidget(self.recipe) self.layout.addWidget(self.batch_yield) self.layout.addWidget(self.note) self.layout.addWidget(self.button)
class nuevoCliente(QDialog): def __init__(self, parent=None): super(nuevoCliente, self).__init__() self.setWindowIcon(QIcon("Imagenes/new.jpg")) self.setWindowTitle("Новый клиент") self.setWindowFlags(Qt.WindowCloseButtonHint | Qt.MSWindowsFixedSizeDialogHint) self.setFixedSize(320, 478) self.initUI() def initUI(self): self.groupBoxDatosGenerales = QGroupBox("Новый клиент", self) self.groupBoxDatosGenerales.setFixedSize(300, 223) self.groupBoxDatosGenerales.move(10, 13) labelNombre = QLabel("<font color='#FF3300'>*</font> Имя", self.groupBoxDatosGenerales) labelNombre.move(15, 28) self.lineEditNombre = QLineEdit(self.groupBoxDatosGenerales) self.lineEditNombre.setValidator(QRegExpValidator(QRegExp("[a-zA-Z ]+"), self.lineEditNombre)) self.lineEditNombre.setMaxLength(30) self.lineEditNombre.setFixedWidth(270) self.lineEditNombre.setFocus() self.lineEditNombre.move(15, 46) labelApellido = QLabel("<font color='#FF3300'>*</font> Фамилия", self.groupBoxDatosGenerales) labelApellido.move(15, 74) self.lineEditApellido = QLineEdit(self.groupBoxDatosGenerales) self.lineEditApellido.setValidator(QRegExpValidator(QRegExp("[a-zA-Z ]+"), self.lineEditApellido)) self.lineEditApellido.setMaxLength(30) self.lineEditApellido.setFixedWidth(270) self.lineEditApellido.move(15, 92) labelSexo = QLabel("<font color='#FF3300'>*</font> Пол", self.groupBoxDatosGenerales) labelSexo.move(15, 120) self.comboBoxSexo = QComboBox(self.groupBoxDatosGenerales) self.comboBoxSexo.addItems(["М", "Ж"]) self.comboBoxSexo.setCurrentIndex(-1) self.comboBoxSexo.setFixedWidth(270) self.comboBoxSexo.move(15, 138) labelFechaNacimiento = QLabel("<font color='#FF3300'>*</font> Дата рождения", self.groupBoxDatosGenerales) labelFechaNacimiento.move(15, 166) self.dateEditFechaNacimiento = QDateEdit(self.groupBoxDatosGenerales) self.dateEditFechaNacimiento.setDate(QDate.currentDate()) self.dateEditFechaNacimiento.setMaximumDate(QDate.currentDate()) self.dateEditFechaNacimiento.setDisplayFormat("dd/MM/yyyy") self.dateEditFechaNacimiento.setCalendarPopup(True) self.dateEditFechaNacimiento.setCursor(Qt.PointingHandCursor) self.dateEditFechaNacimiento.setFixedWidth(270) self.dateEditFechaNacimiento.move(15, 184) self.groupBoxUbicacion = QGroupBox("Проживание", self) self.groupBoxUbicacion.setFixedSize(300, 86) self.groupBoxUbicacion.move(10, 250) labelPais = QLabel("<font color='#FF3300'>*</font> Страна", self.groupBoxUbicacion) labelPais.move(15, 28) self.lineEditPais = QLineEdit(self.groupBoxUbicacion) self.lineEditPais.setMaxLength(30) self.lineEditPais.setFixedWidth(270) self.lineEditPais.move(15, 48) self.groupBoxContacto = QGroupBox("Контакты", self) self.groupBoxContacto.setFixedSize(300, 86) self.groupBoxContacto.move(10, 350) labelTelCel = QLabel("<font color='#FF3300'>*</font> Номер телефона", self.groupBoxContacto) labelTelCel.move(15, 28) self.lineEditTelCel = QLineEdit(self.groupBoxContacto) self.lineEditTelCel.setInputMask("9999999999999999; ") self.lineEditTelCel.setFixedWidth(270) self.lineEditTelCel.move(15, 48) # ========================================================== labelInformacion = QLabel("<font color='#FF3300'>*</font> Обязательные поля.", self) labelInformacion.move(10, 445) buttonAceptar = QPushButton("Сохранить", self) buttonAceptar.setCursor(Qt.PointingHandCursor) buttonAceptar.move(154, 445) buttonCerrar = QPushButton("Закрыть", self) buttonCerrar.setCursor(Qt.PointingHandCursor) buttonCerrar.move(236, 445) buttonAceptar.clicked.connect(self.Aceptar) buttonCerrar.clicked.connect(self.close) def Aceptar(self): nombre = " ".join(self.lineEditNombre.text().split()).title() apellido = " ".join(self.lineEditApellido.text().split()).title() sexo = self.comboBoxSexo.currentText() fecNacimiento = self.dateEditFechaNacimiento.text() pais = " ".join(self.lineEditPais.text().split()).title() telCel = self.lineEditTelCel.text() if not nombre: self.lineEditNombre.setFocus() elif not apellido: self.lineEditApellido.setFocus() elif not sexo: self.comboBoxSexo.setFocus() elif not pais: self.lineEditPais.setFocus() elif not telCel: self.lineEditTelCel.setFocus() else: if QFile.exists("DB_SIACLE/DB_SIACLE.db"): conexion = sqlite3.connect("DB_SIACLE/DB_SIACLE.db") cursor = conexion.cursor() try: datos = [nombre, apellido, sexo, fecNacimiento, pais, telCel] cursor.execute("INSERT INTO CLIENTES (NOMBRE, APELLIDO, SEXO, " "FECHA_NACIMIENTO, PAIS, TELEFONO_CELULAR) " "VALUES (?,?,?,?,?,?)", datos) conexion.commit() conexion.close() self.lineEditNombre.clear() self.lineEditApellido.clear() self.comboBoxSexo.setCurrentIndex(-1) self.dateEditFechaNacimiento.setDate(QDate.currentDate()) self.lineEditPais.clear() self.lineEditTelCel.clear() QMessageBox.information(self, "Новый клиент", "Клиент зарегестрирован. ", QMessageBox.Ok) except: conexion.close() QMessageBox.critical(self, "Новый клиент", "Неизвестная ошибка. ", QMessageBox.Ok) else: QMessageBox.critical(self, "Новый клиент", "База данных не найдена." " ", QMessageBox.Ok) self.lineEditNombre.setFocus()
class Table(QWidget): def __init__(self, folder): """Table widget for showing patient data. :param folder: folder that contains patient data :type folder: str """ super().__init__() self.l = QGridLayout(self) self.setMinimumWidth(700) # Search options self.surname = QLineEdit() self.surname.setPlaceholderText("Last name, e.g. Smith") self.surname.textChanged.connect(self.search) self.firstname = QLineEdit() self.firstname.setPlaceholderText("First name") self.firstname.textChanged.connect(self.search) self.birthdate = QDateEdit() self.birthdate.dateChanged.connect(self.search) self.search = QPushButton("Search") self.l.addWidget(self.surname, 0, 0) self.l.addWidget(self.firstname, 0, 1) self.l.addWidget(self.birthdate, 0, 2) self.l.addWidget(self.search, 0, 3) self.folder = folder self.im = None # Create empty table self.t = QTableWidget() h = self.t.horizontalHeader() h.setSectionResizeMode(QHeaderView.Stretch) # Look for patient data in given folder self.fns = glob(folder + "\\**\\*.meta", recursive=True) self.patients = [] self.opened = "" # Iterate over metadata files for ii, fn in enumerate(self.fns): meta = json.load(open(fn)) meta['Patient']['date'] = meta['Date'] # Store patient metadata self.patients.append(meta['Patient']) rc = self.t.rowCount() self.t.setRowCount(rc + 1) # Set column when first file is loaded if ii == 0: self.t.setColumnCount(len(self.patients[0].keys())) self.t.setHorizontalHeaderLabels(self.patients[0].keys()) # Show metadata in a single row for i, (k, v) in enumerate(self.patients[-1].items()): item = QTableWidgetItem(v) item.setFlags(item.flags() ^ Qt.ItemIsEditable) self.t.setItem(rc, i, item) # connect self.t.doubleClicked.connect(self.do) self.l.addWidget(self.t, 1, 0, 4, 10) def search(self): """Search for entries in database """ # Get search terms surname = self.surname.text() firstname = self.firstname.text() birthdate = self.birthdate.text() # Iterate over rows # Only show rows that contain relevant data # As entered/selected in search for i in range(self.t.rowCount()): self.t.showRow(i) if surname: if surname not in self.t.item(i, 0).text(): self.t.hideRow(i) if firstname: if firstname not in self.t.item(i, 1).text(): self.t.hideRow(i) if birthdate != QDateEdit().text(): if birthdate != self.t.item(i, 3).text(): self.t.hideRow(i) def do(self, e): """open selected patient :param e: event information :type e: QModelIndex """ # Get clicked row row = e.row() # Get respective file name and look for video fn = self.fns[row] vid_fn = fn.replace(".meta", ".mp4") # If video is already opened, do nothing if vid_fn == self.opened and type(self.im) != None: if self.im.isVisible(): return # Otherwise, read video vid = io.mimread(vid_fn, memtest=False) # Show video self.im = pg.image(np.asarray(vid, np.uint8).transpose(0, 2, 1, 3), title=vid_fn) meta = json.load(open(fn)) self.d = DictViewer(meta) self.d.show() self.opened = vid_fn
class RSINBackTest(QDialog): def __init__(self): super(RSINBackTest,self).__init__() self.codepool = ["000001","000002","000004",] self.initUI() def initUI(self): self.resize(900,600) self.setWindowTitle("QUANT XH 金融终端——RSI N日回测") self.setWindowIcon(QIcon("static/icon.png")) self.poollabel = QLabel() self.poollabel.setText("股票池") self.poollabel.setFont(QFont("仿宋", 15)) self.pooledit = QTextEdit() self.pooledit.setFont(QFont("仿宋", 12)) self.pooledit.setFixedSize(120, 30) self.pooladdbtn = QPushButton() self.pooladdbtn.setText("添加股票") self.pooladdbtn.setFont(QFont("仿宋", 12)) self.pooladdbtn.setFixedSize(100, 30) self.pooladdbtn.clicked.connect(self.addCode) self.poolclbtn = QPushButton() self.poolclbtn.setText("清空") self.poolclbtn.setFont(QFont("仿宋", 12)) self.poolclbtn.setFixedSize(80, 30) self.poolclbtn.clicked.connect(self.clearPool) self.pooltb = QTextBrowser() self.pooltb.setFixedSize(300, 300) self.pooltb.setFont(QFont("仿宋", 12)) self.nlabel = QLabel() self.nlabel.setText("N:") self.nlabel.setFont(QFont("仿宋", 15)) self.nedit = QTextEdit() self.nedit.setText("6") self.nedit.setFont(QFont("仿宋", 12)) self.nedit.setFixedSize(50, 30) self.texttb = QTextBrowser() self.texttb.setFont(QFont("仿宋", 10)) self.texttb.setFixedSize(300, 150) self.texttb.setText("RSI指标分为三个数值:20、50、80,其中,当指标运行到20下方时,预示价格进入超卖区域,短期警示风险来临,不可追空,价格可能出现反弹或上涨;当指标运行到80上方时,预示价格进入超买区域,短线百警示风险来临,不可追多,价格可能出现调整或下跌") self.ckfromtimelabel = QLabel() self.ckfromtimelabel.setText("窗口开始时间") self.ckfromtimelabel.setFont(QFont("仿宋", 15)) self.ckfromtimeedit = QDateEdit() datefrom = datetime.strptime("2018-09-01", "%Y-%m-%d").date() self.ckfromtimeedit.setDate(datefrom) self.ckfromtimeedit.setFont(QFont("仿宋", 12)) self.ckfromtimeedit.setFixedSize(200,30) self.cktotimelabel = QLabel() self.cktotimelabel.setText("窗口结束时间") self.cktotimelabel.setFont(QFont("仿宋", 15)) self.cktotimeedit = QDateEdit() dateto = datetime.strptime("2019-05-20", "%Y-%m-%d").date() self.cktotimeedit.setDate(dateto) self.cktotimeedit.setFont(QFont("仿宋", 12)) self.cktotimeedit.setFixedSize(200,30) self.ycfromtimelabel = QLabel() self.ycfromtimelabel.setText("预测开始时间") self.ycfromtimelabel.setFont(QFont("仿宋", 15)) self.ycfromtimeedit = QDateEdit() datefrom = datetime.strptime("2019-01-01", "%Y-%m-%d").date() self.ycfromtimeedit.setDate(datefrom) self.ycfromtimeedit.setFont(QFont("仿宋", 12)) self.ycfromtimeedit.setFixedSize(200, 30) self.yctotimelabel = QLabel() self.yctotimelabel.setText("预测结束时间") self.yctotimelabel.setFont(QFont("仿宋", 15)) self.yctotimeedit = QDateEdit() dateto = datetime.strptime("2019-05-01", "%Y-%m-%d").date() self.yctotimeedit.setDate(dateto) self.yctotimeedit.setFont(QFont("仿宋", 12)) self.yctotimeedit.setFixedSize(200, 30) self.cashlabel = QLabel() self.cashlabel.setText("初始资金") self.cashlabel.setFont(QFont("仿宋", 15)) self.cashedit = QTextEdit() self.cashedit.setText("1000000") self.cashedit.setFont(QFont("仿宋", 12)) self.cashedit.setFixedSize(200,30) self.amountlabel = QLabel() self.amountlabel.setText("单笔交易股数") self.amountlabel.setFont(QFont("仿宋", 15)) self.amountedit = QTextEdit() self.amountedit.setText("3000") self.amountedit.setFont(QFont("仿宋", 12)) self.amountedit.setFixedSize(200,30) self.selectbtn = QPushButton() self.selectbtn.setText("开始回测") self.selectbtn.setFixedSize(120,40) self.selectbtn.setFont(QFont("仿宋", 12)) self.selectbtn.clicked.connect(self.backTest) # self.resultbtn = QPushButton() # self.resultbtn.setText("回测结果") # self.resultbtn.setFixedSize(120,40) # self.resultbtn.setFont(QFont("仿宋", 12)) # self.resultbtn.setEnabled(False) self.h11box = QHBoxLayout() self.h11box.addWidget(self.pooledit) self.h11box.addWidget(self.pooladdbtn) self.h11box.addWidget(self.poolclbtn) self.h12box = QHBoxLayout() self.h12box.addWidget(self.pooltb) self.h14box = QHBoxLayout() self.h14box.addStretch(1) self.h14box.addWidget(self.texttb) self.h14box.addStretch(1) self.v1box = QVBoxLayout() self.v1box.addStretch(1) self.v1box.addWidget(self.poollabel) self.v1box.addLayout(self.h11box) self.v1box.addLayout(self.h12box) self.v1box.addStretch(1) self.v1box.addLayout(self.h14box) self.v1box.addStretch(1) self.h21box = QHBoxLayout() self.h21box.addWidget(self.selectbtn) # self.h21box.addWidget(self.resultbtn) self.h22box = QHBoxLayout() self.h22box.addStretch(1) self.h22box.addWidget(self.nlabel) self.h22box.addWidget(self.nedit) self.h22box.addStretch(1) self.v2box = QVBoxLayout() self.v2box.addStretch(1) self.v2box.addLayout(self.h22box) self.v2box.addStretch(1) self.v2box.addWidget(self.ckfromtimelabel) self.v2box.addWidget(self.ckfromtimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.cktotimelabel) self.v2box.addWidget(self.cktotimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.ycfromtimelabel) self.v2box.addWidget(self.ycfromtimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.yctotimelabel) self.v2box.addWidget(self.yctotimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.cashlabel) self.v2box.addWidget(self.cashedit) self.v2box.addStretch(1) self.v2box.addWidget(self.amountlabel) self.v2box.addWidget(self.amountedit) self.v2box.addStretch(1) self.v2box.addLayout(self.h21box) self.v2box.addStretch(1) self.hbox = QHBoxLayout() self.hbox.addStretch(1) self.hbox.addLayout(self.v1box) self.hbox.addStretch(1) self.hbox.addLayout(self.v2box) self.hbox.addStretch(1) self.setLayout(self.hbox) self.pooltb.setPlainText(' '.join(self.codepool)) def addCode(self): f = FETCH() code = self.pooledit.toPlainText() if code in self.codepool: print(QMessageBox.information(self, "提示", "该股票已经存在于股票池中!", QMessageBox.Yes, QMessageBox.Yes)) elif code not in list(f.fetch_stock_list()['code']): print(QMessageBox.information(self, "提示", "该股票代码不存在!", QMessageBox.Yes, QMessageBox.Yes)) else: self.codepool.append(code) self.pooledit.clear() self.pooltb.setPlainText(' '.join(self.codepool)) def clearPool(self): self.codepool = [] self.pooltb.setPlainText(' '.join(self.codepool)) def backTest(self): def change_name(s): l = s.split('/') if len(l[1]) == 1: l[1] = "0" + l[1] if len(l[2]) == 1: l[2] = "0" + l[2] return ("-".join(l)) r = RSINtest(cash=int(self.cashedit.toPlainText())) r.RSIN_backtest(code=self.codepool,ckstart=change_name(self.ckfromtimeedit.text()), ckend=change_name(self.cktotimeedit.text()),ycstart=change_name(self.ycfromtimeedit.text()), ycend=change_name(self.yctotimeedit.text()), amount=int(self.amountedit.toPlainText()), N=int(self.nedit.toPlainText())) r.save_to_mongo() # self.resultbtn.clicked.connect(self.btResult(r.ACstr)) # self.resultbtn.setEnabled(True) self.btResult(r.ACstr) def btResult(self,AC_id): dialog = BackTestResult(ACid=AC_id) dialog.setWindowFlags(Qt.WindowStaysOnTopHint) dialog.show() dialog.exec_()
def text(self, *args, **kwargs): vDate = QDateEdit.text(self, *args, **kwargs) [day, month, year] = vDate.split('/') vDate = "{}-{}-{}".format(year, month, day) return vDate
class Windows_2(QWidget): def __init__(self, settings_way_db, settings_panel=None): super().__init__() self.settings_way_db=settings_way_db self.settings_panel=settings_panel self.composition() def composition(self): self.setWindowTitle('Central Bank dynamic rates') self.setGeometry(10,10,430,30) self.setWindowIcon(QIcon(self.settings_panel)) self.period()#Конструктор основных компонентов окна self.show() """Фу-ия period является конструктором для основных элементов окна экземпляров класса Windows_2 """ def period(self): self.txt_per_1 = QDateEdit(self) self.txt_per_2 = QDateEdit(self) self.save_but = QPushButton('Save data') self.exit_but = QPushButton('Exit') self.txt_per_1.setDisplayFormat('dd/MM/yyyy') self.txt_per_2.setDisplayFormat('dd/MM/yyyy') self.lab_per = QLabel('Period of time:', self) self.lab_code = QLabel('Valute:', self) self.send_but = QPushButton('Send') self.send_but.clicked.connect(self.req_dynamic_rate) self.save_but.clicked.connect(self.save_dynamic) self.exit_but.clicked.connect(self.close) self.combo_val_code=QComboBox(self) self.val_code={'R01500':'Молдавский лей', 'R01235':'Доллар США','R01810':'Южноафриканский рэнд', 'R01710':'Туркменский манат','R01670':'Таджикский сомони','R01010':'Австралийский доллар', 'R01035':'Фунт стерлингов Соединенного королевства','R01060':'Армянский драм', 'R01100':'Болгарский лев','R01115':'Бразильский реал','R01135':'Венгерский форинт', 'R01215':'Датская крона','R01239':'Евро','R01270':'Индийская рупия','R01335':'Казахстанский тенге', 'R01350':'Канадский доллар','R01370':'Киргизский сом','R01375':'Китайский юань','R01535':'Норвежская крона','R01565':'Польский злотый', 'R01585':'Румынский лей','R01589':'СДР (специальные права заимствования)', 'R01625':'Сингапурский доллар','R01717':'Узбекский сум','R01720':'Украинская гривна', 'R01760':'Чешская крона','R01770':'Шведская крона','R01775':'Швейцарский франк', 'R01815':'Вон Республики Корея','R01820':'Японская иена'} for key in sorted(list(self.val_code.keys())): self.combo_val_code.addItem(self.val_code[key]) grid = QGridLayout() grid.setSpacing(1) grid.addWidget(self.lab_per, 1, 0, 1, 1) grid.addWidget(self.txt_per_1, 1, 1, 1, 1) grid.addWidget(self.txt_per_2, 1, 2, 1, 1) grid.addWidget(self.lab_code, 2, 0, 1, 1) grid.addWidget(self.combo_val_code, 2, 1, 3, 3) grid.addWidget(self.send_but, 1, 3, 1, 1) grid.addWidget(self.save_but, 5, 2) grid.addWidget(self.exit_but, 5, 3) self.setLayout(grid) """Фу-ия req_dynamic_rate отправляет запрос в базу данных ЦБ РФ, а полученные данные передает создаваемому экземпляру класса Windows_3, который строит сам график изменения курса валюты """ def req_dynamic_rate(self): if datetime(int(self.txt_per_1.text()[6:]), int(self.txt_per_1.text()[3:5]), int(self.txt_per_1.text()[0:2]), hour=0, minute=0, second=0, microsecond=0, tzinfo=None) > datetime.now() or datetime(int(self.txt_per_2.text()[6:]), int(self.txt_per_2.text()[3:5]), int(self.txt_per_2.text()[0:2]), hour=0, minute=0, second=0, microsecond=0, tzinfo=None) > datetime.now(): self.error_no_data = QErrorMessage(self) self.error_no_data.setWindowTitle('No data available') self.error_no_data.showMessage('You entered a date that is greater than the current date') elif datetime(int(self.txt_per_1.text()[6:]), int(self.txt_per_1.text()[3:5]), int(self.txt_per_1.text()[0:2])) > datetime(int(self.txt_per_2.text()[6:]), int(self.txt_per_2.text()[3:5]), int(self.txt_per_2.text()[0:2])): self.error_no_data = QErrorMessage(self) self.error_no_data.setWindowTitle('Error entering date') self.error_no_data.showMessage('You entered the first date period, which is greater than the second date you entered') else: from cb_requests import req_dynamic_rate from requests import ConnectionError for key in self.val_code.keys(): if self.combo_val_code.currentText()==str(self.val_code[key]): try: self.dynamic_req=req_dynamic_rate(self.txt_per_1.text(),self.txt_per_2.text(), str(key)) self.win_3=Windows_3(self.dynamic_req, self.settings_panel) except ConnectionError: self.error_no_connect = QErrorMessage(self) self.error_no_connect.setWindowTitle('Сonnection Error') self.error_no_connect.showMessage('No internet connection') """Фу-ия save_dynamic сохраняет полученные данные из базы данных ЦБ РФ, в собственную базу данных 'Valute', при отсутсвии базы данных создает новую """ def save_dynamic(self): from db_manag import DBmanager from sqlite3 import OperationalError as sqlite3_OperationalError self.data_base = DBmanager(self.settings_way_db, 'valute') try: self.data_base.insert_into_table_dynamic_rate(self.dynamic_req) except sqlite3_OperationalError: self.data_base.create_table_dynamic_rate() self.data_base.insert_into_table_dynamic_rate(self.dynamic_req) self.message_save_data = QMessageBox.information(self, 'Save Data', 'Data saved', QMessageBox.Ok) except AttributeError: self.error_no_data = QErrorMessage(self) self.error_no_data.setWindowTitle('No data') self.error_no_data.showMessage('No data to save') else: self.message_save_data = QMessageBox.information(self, 'Save Data', 'Data saved', QMessageBox.Ok)
class MainApp(QMainWindow): """Esta será la aplicación principal""" def __init__(self, parent=None, *args): super(MainApp, self).__init__(parent=parent) ''' configuración de la pantalla ''' self.setFixedSize( 850, 600) #El tamaño por defecto de la pantalla sin permitir ajustes self.setWindowTitle("Parámetros de la fotografía aérea" ) #Establece el título de la ventana self.setStyleSheet("background-color: rgb(85, 255, 127)" ) #Establece el color de fondo self.setWindowIcon(QIcon( "iconos/main_window.png")) #se establece un ícono para la pantalla ''' Configuración del título ''' self.label_t = QLabel("Definir los parámetros de la fotografía aérea", self) #instanciamos un label self.label_t.setGeometry( 0, 20, 800, 40) #definimos las propiedades geométricas del label self.label_t.setAlignment( Qt.AlignHCenter) #Aliniamos el label en el centro de la pantalla self.label_t.setFont(QFont( 'Times', 24)) #Definimos la fuente del texto del label ''' Configuración de los labels e inputs ''' #label 1 entidad self.label_e = QLabel("Entidad de donde proviene la fotografía:", self) self.label_e.setGeometry(50, 100, 800, 30) self.label_e.setAlignment(Qt.AlignLeft) self.label_e.setFont(QFont('Times', 12)) #input 1 entidad self.input_e = QLineEdit( self) #instanciamos un objeto para realizar una entrada self.input_e.move(600, 100) #movemos el input a estas coordenadas self.input_e.resize(200, 25) #Definimos el tamaño de el campo de texto self.input_e.setStyleSheet( "background-color: #fff") #el color del campo de texto será blanco self.input_e.setMaxLength( 50) #definimos la cantidad maxima de carácteres a recibir #label 2 número de vuelo self.label_n_v = QLabel("Número de vuelo:", self) self.label_n_v.setGeometry(50, 150, 800, 30) self.label_n_v.setAlignment(Qt.AlignLeft) self.label_n_v.setFont(QFont('Times', 12)) #input 2 número de vuelo self.input_n_v = QLineEdit(self) self.input_n_v.move(600, 150) self.input_n_v.resize(200, 25) self.input_n_v.setStyleSheet("background-color: #fff") self.input_n_v.setValidator( QIntValidator(0, 30000, self) ) #Validamos que solo se acepten valores numéricos con un rango de 0 a 30000 #label 3 faja de vuelo self.label_f_v = QLabel("Faja de vuelo:", self) self.label_f_v.setGeometry(50, 200, 800, 30) self.label_f_v.setAlignment(Qt.AlignLeft) self.label_f_v.setFont(QFont('Times', 12)) #input 3 faja de vuelo self.input_f_v = QLineEdit(self) self.input_f_v.move(600, 200) self.input_f_v.resize(200, 25) self.input_f_v.setStyleSheet("background-color: #fff") self.input_f_v.setMaxLength(50) #label 4 escala de la fotografía self.label_e_f = QLabel("Escala de la fotografía 1:", self) self.label_e_f.setGeometry(50, 250, 800, 30) self.label_e_f.setAlignment(Qt.AlignLeft) self.label_e_f.setFont(QFont('Times', 12)) #input 4 escala de la fotografía self.input_e_f = QLineEdit(self) self.input_e_f.move(600, 250) self.input_e_f.resize(200, 25) self.input_e_f.setStyleSheet("background-color: #fff") self.input_e_f.setValidator(QIntValidator(0, 300000, self)) #label 5 altura del vuelo self.label_a_v = QLabel("Altura del vuelo (en metros):", self) self.label_a_v.setGeometry(50, 300, 800, 30) self.label_a_v.setAlignment(Qt.AlignLeft) self.label_a_v.setFont(QFont('Times', 12)) #input 5 altura del vuelo self.input_a_v = QLineEdit(self) self.input_a_v.move(600, 300) self.input_a_v.resize(200, 25) self.input_a_v.setStyleSheet("background-color: #fff") self.input_a_v.setValidator(QIntValidator(0, 300000, self)) #label 6 distancia focal self.label_d_f = QLabel("Distancia focal:", self) self.label_d_f.setGeometry(50, 350, 800, 30) self.label_d_f.setAlignment(Qt.AlignLeft) self.label_d_f.setFont(QFont('Times', 12)) #input 6 distancia focal self.input_d_f = QLineEdit(self) self.input_d_f.move(600, 350) self.input_d_f.resize(200, 25) self.input_d_f.setStyleSheet("background-color: #fff") self.input_d_f.setValidator(QDoubleValidator(0.0, 1000000.0, 4, self)) #label 7 altura del terreno sobre el nivel del mar self.label_a_t_m = QLabel("Altura del terreno/nivel del mar:", self) self.label_a_t_m.setGeometry(50, 400, 800, 30) self.label_a_t_m.setAlignment(Qt.AlignLeft) self.label_a_t_m.setFont(QFont('Times', 12)) #input 7 altura del terreno sobre el nivel del mar self.input_a_t_m = QLineEdit(self) self.input_a_t_m.move(600, 400) self.input_a_t_m.resize(200, 25) self.input_a_t_m.setStyleSheet("background-color: #fff") self.input_a_t_m.setValidator(QIntValidator(0, 300000, self)) #label 8 fecha en que se tomn_v la fotografía self.label_f_f = QLabel("Fecha en que se tomó la fotografía:", self) self.label_f_f.setGeometry(50, 450, 800, 30) self.label_f_f.setAlignment(Qt.AlignLeft) self.label_f_f.setFont(QFont('Times', 12)) #input 8 fecha en que se tomó la fotografía self.input_f_f = QDateEdit(self) self.input_f_f.move(600, 450) self.input_f_f.resize(200, 25) self.input_f_f.setStyleSheet("background-color: #fff") ''' configuración del boton ''' #boton de aceptar self.btn_acept = QPushButton("Aceptar", self) #instanciamos un boton self.btn_acept.setGeometry(0, 0, 100, 50) self.btn_acept.move(375, 500) self.btn_acept.setStyleSheet("background-color: rgb(255, 255, 0)") self.btn_acept.clicked.connect( self.slot_aceptar ) #definimos que evento realizará al ser presionado self.label_er = QLabel( "", self ) #definimos un label de error en caso de no todos los campos estén llenos self.label_er.setGeometry(20, 575, 800, 30) self.label_er.setAlignment(Qt.AlignHCenter) self.label_er.setFont(QFont('Times', 12)) self.label_er.setStyleSheet("color: red") #Este es el evento que se va a ejecutar si se da en aceptar def slot_aceptar(self): #Creamos una lista con los textos de los campos para verificiar si están vacíos o no self.campos = [] self.campos.extend([ self.input_e.text(), self.input_n_v.text(), self.input_f_v.text(), self.input_e_f.text(), self.input_a_v.text(), self.input_d_f.text(), self.input_a_t_m.text(), self.input_f_f.text() ]) #Recorremos la lista anteriormente creada for i in self.campos: ''' ya que cada valor de i es un texto podemos preguntar si ese texto esta vacío o no de tal forma que aquí preguntamos si el texto es falso, es decir no hay texto, entonces mande un mensaje de error ''' if not i: return self.label_er.setText( "Uno o más campos están vacíos, Vuelve a intentarlo") else: ''' Una vez verificado que los campos están llenos, validamos que el valor de la altura del terreno sobre el mar es mayor a la altura de la fotografía, si esto no es así mandamos un mensaje de error pidiendo que se ingresen valores validos ''' if int(self.campos[4]) >= int(self.campos[-2]): return self.label_er.setText( "La altura del vuelo no puede ser mayor o igual a la altura del terreno sobre el mar" ) else: #Creamos un objeto de tipo CalApp para posteriormente mostrarla self.w = CalApp( self.campos) #Mandamos la lista de campos como parámetro self.w.show() #mostramos la pantalla
class Windows_4(QWidget): def __init__(self, req_News, settings_panel=None): super().__init__() self.news = req_News self.settings_panel=settings_panel self.composition() def composition(self): self.setWindowTitle('Central Bank News') self.setGeometry(10, 10, 270, 650) self.setWindowIcon(QIcon(self.settings_panel)) self.news_input() self.show() """Фу-ия news_input является конструктором для основных элементов окна экземпляров класса Windows_4 """ def news_input(self): self.lab_all = QLabel('All news:', self) self.lab_search = QLabel('Search:', self) self.lab_by_date = QLabel('News by date:', self) self.txt_all = QLineEdit(self) self.txt_search = QLineEdit(self) self.exit_but = QPushButton('Exit') self.find_but = QPushButton('Find') self.find_but2 = QPushButton('Find') self.cal_but= QPushButton('Calendar') self.cal_but.clicked.connect(self.calendar) self.find_but.clicked.connect(self.find_news) self.find_but2.clicked.connect(self.find_by_words) self.exit_but.clicked.connect(self.close) self.date = QDateEdit(self) self.date.setDisplayFormat('dd/MM/yyyy') self.scroll_area=QScrollArea()#Создаем обект с горизонтальной и вертикальной полосой прокрутки self.scroll_area.setWidgetResizable(True) self.scroll_area.setVerticalScrollBarPolicy(2)#Вертикальная и горизонтальная полоса прокрутки будут вседа видны self.scroll_area.setHorizontalScrollBarPolicy(2) grid = QGridLayout() grid.setSpacing(1) grid.addWidget(self.lab_all, 1, 0, 1, 1) grid.addWidget(self.txt_all, 1, 1, 1, 1) grid.addWidget(self.date, 2, 1, 1, 1) grid.addWidget(self.cal_but, 2, 2, 1, 1) grid.addWidget(self.find_but, 2, 3, 1, 1) grid.addWidget(self.lab_by_date, 2, 0, 1, 1) grid.addWidget(self.lab_search, 3, 0, 1, 1) grid.addWidget(self.txt_search, 3, 1, 1, 2) grid.addWidget(self.find_but2, 3, 3, 1, 1) grid.addWidget(self.scroll_area, 4, 0, 1, 6) grid.addWidget(self.exit_but, 5, 5, 1, 1) self.setLayout(grid) self.txt_all.setText(str(len(self.news.keys()))) def calendar(self): self.cal=QCalendarWidget() self.cal.setGridVisible(True) self.cal.setGeometry(300,300,450,200) self.cal.setWindowIcon(QIcon(self.settings_panel)) self.cal.setWindowTitle('Calendar') self.cal.show() self.cal.clicked[QDate].connect(self.show_date) def show_date(self): self.date.setDate(self.cal.selectedDate()) """Фу-ия find_news динамически создает объекты: поля вывода текста и кнопки для переноса на сайт ЦБ для просмотра новости, на основании полученных данных с сервера ЦБ РФ """ def find_news(self): if datetime(int(self.date.text()[6:]), int(self.date.text()[3:5]), int(self.date.text()[0:2]), hour=0, minute=0, second=0, microsecond=0, tzinfo=None) > datetime.now(): self.error_no_data = QErrorMessage(self) self.error_no_data.setWindowTitle('No data available') self.error_no_data.showMessage('You entered a date that is greater than the current date') else: self.grid_scroll = QGridLayout()#Создаем сетку внутри области прокрутки self.scroll_content = QWidget() self.scroll_content.setLayout(self.grid_scroll) self.scroll_area.setWidget(self.scroll_content) self.but_and_url = dict() count = 2 for item in self.news.keys(): if self.date.text().replace('/', '.') == str(self.news[item]['Date']): self.vallue = QTextEdit((str(self.news[item]['Title']))) self.button = QPushButton('Send') self.url = str(self.news[item]['Url']) self.button.clicked.connect(self.open_url) self.grid_scroll.addWidget(self.vallue, count, 0, 1, 1) count += 1 self.grid_scroll.addWidget(self.button, count, 0, 1, 1) count += 1 self.but_and_url[self.button] = self.url """Фу-ия open_url при нажтии на кнопку под новостью, переносит на сайт ЦБ для просмотра """ def open_url(self): sendler=self.sender() webbrowser.open_new('http://www.cbr.ru'+self.but_and_url[sendler]) """Фу-ия find_by_words позволяет осуществить поиск по полученным новостям, отобрать и отобразить те (также динамически создавая виджеты), которые нас интересуют """ def find_by_words(self): if self.txt_search.text()=='': self.error_no_data = QErrorMessage(self) self.error_no_data.setWindowTitle('Unsuccessful search') self.error_no_data.showMessage('You must enter a word') else: self.grid_scroll = QGridLayout() self.scroll_content = QWidget() self.scroll_content.setLayout(self.grid_scroll) self.scroll_area.setWidget(self.scroll_content) self.but_and_url = dict() count = 2 for item in self.news.keys(): if self.txt_search.text() in self.news[item]['Title']: self.vallue = QTextEdit((str(self.news[item]['Title']))) self.button = QPushButton('Send') self.url = str(self.news[item]['Url']) self.button.clicked.connect(self.open_url) self.grid_scroll.addWidget(self.vallue, count, 0, 1, 1) count += 1 self.grid_scroll.addWidget(self.button, count, 0, 1, 1) count += 1 self.but_and_url[self.button] = self.url if len(self.but_and_url.keys())==0: self.error_no_data = QErrorMessage(self) self.error_no_data.setWindowTitle('Unsuccessful search') self.error_no_data.showMessage('Nothing found on your request')
class EgimDownloaderFrame(QFrame): """Frame to download data from EMSODEV servers""" # Signals msg2Statusbar = pyqtSignal(str) wf2plotSplitter = pyqtSignal(WaterFrame) class DownloadParameterThread(QThread): """ The process to download data from the API is very slow. We are going to use this thread to download data without block the app. """ def __init__(self, downloader): QThread.__init__(self) self.downloader = downloader def __del__(self): self.wait() def run(self): if self.downloader.instrumentList.currentItem().text() \ == "icListen-1636": date = datetime.datetime.strptime( self.downloader.dateList.currentItem().text(), "%Y-%m-%d").strftime("%d/%m/%Y") self.downloader.downloadAcoustic( date, self.downloader.hourMinuteList.currentItem().text()) else: parameters = [item.text() for item in self.downloader.parameterList.selectedItems()] for parameter in parameters: self.downloader.downloadParameter(parameter) def __init__(self): super().__init__() # Instance variables self.downloader = EGIM() self.wf = WaterFrame() self.metadata = dict() self.dates = [] self.myThread = None # Save the login of the EMSODEV API self.downloader.login = "******" self.downloader.password = "" self.initUI() def initUI(self): # Buttons downloadButton = QPushButton("Download", self) downloadButton.clicked.connect(self.downloadClick) downloadButton.setEnabled(False) closeButton = QPushButton("Close", self) closeButton.clicked.connect(self.hide) # Lists self.egimList = QListWidget(self) self.egimList.itemClicked.connect(self.loadInstruments) self.egimList.setMaximumWidth(200) self.instrumentList = QListWidget(self) self.instrumentList.itemClicked.connect(self.loadParameters) self.instrumentList.setMaximumWidth(290) self.metadataList = QListWidget(self) self.parameterList = QListWidget(self) self.parameterList.setSelectionMode( QAbstractItemView.ExtendedSelection) self.parameterList.itemClicked.connect( lambda: downloadButton.setEnabled(True)) self.dateList = QListWidget(self) self.dateList.itemClicked.connect(self.loadTimes) self.dateList.setMaximumWidth(150) self.hourMinuteList = QListWidget(self) self.hourMinuteList.itemClicked.connect( lambda: downloadButton.setEnabled(True)) self.hourMinuteList.setMaximumWidth(150) # Labels egimLabel = QLabel("EGIM", self) instrumentLabel = QLabel("Instrument", self) metadataLabel = QLabel("Metadata", self) parameterLabel = QLabel("Parameter", self) startDateLabel = QLabel("Start date", self) endDateLabel = QLabel("End date", self) limitLabel = QLabel("Get last X values", self) hourLabel = QLabel("Hour and minute (HHMM)", self) dateLabel = QLabel("Available dates", self) # Date edit self.startDateEdit = QDateEdit(self) self.startDateEdit.setCalendarPopup(True) self.startDateEdit.setDateTime(QDateTime(QDate(2017, 1, 27), QTime(0, 0, 0))) self.startDateEdit.setMinimumDateTime(QDateTime(QDate(2017, 1, 27), QTime(0, 0, 0))) self.endDateEdit = QDateEdit(self) self.endDateEdit.setCalendarPopup(True) self.endDateEdit.setDateTime(QDateTime(QDate(2017, 1, 27), QTime(0, 0, 0))) self.endDateEdit.setMinimumDateTime(QDateTime(QDate(2017, 1, 27), QTime(0, 0, 0))) # Spin box self.limitSpinBox = QSpinBox(self) self.limitSpinBox.setMinimum(0) self.limitSpinBox.setMaximum(9999999999) self.limitSpinBox.setSingleStep(100) self.limitSpinBox.valueChanged.connect(self.enableDate) # Custom Widgets # Widget for dates of the acoustic data self.acousticDateWidget = QWidget(self) # - Layout vAcousticDate = QVBoxLayout() vAcousticDate.addWidget(dateLabel) vAcousticDate.addWidget(self.dateList) vAcousticDate.addWidget(hourLabel) vAcousticDate.addWidget(self.hourMinuteList) self.acousticDateWidget.setLayout(vAcousticDate) self.acousticDateWidget.setMaximumWidth(175) self.acousticDateWidget.setEnabled(False) # Widget for dates of parameters self.parameterDateWidget = QWidget(self) # - Layout vparameterDate = QVBoxLayout() vparameterDate.addWidget(startDateLabel) vparameterDate.addWidget(self.startDateEdit) vparameterDate.addWidget(endDateLabel) vparameterDate.addWidget(self.endDateEdit) vparameterDate.addWidget(limitLabel) vparameterDate.addWidget(self.limitSpinBox) vparameterDate.addStretch() self.parameterDateWidget.setLayout(vparameterDate) self.parameterDateWidget.setEnabled(False) # Layout # - Vertical layout for EGIM -- vEgim = QVBoxLayout() vEgim.addWidget(egimLabel) vEgim.addWidget(self.egimList) # -- Vertical layout for instruments - vInstrument = QVBoxLayout() vInstrument.addWidget(instrumentLabel) vInstrument.addWidget(self.instrumentList) # - Vertical layout for parameters - vParameter = QVBoxLayout() vParameter.addWidget(metadataLabel) vParameter.addWidget(self.metadataList) vParameter.addWidget(parameterLabel) vParameter.addWidget(self.parameterList) # - Vertical layout for dates and buttons vButton = QVBoxLayout() vButton.addWidget(downloadButton) vButton.addWidget(closeButton) vButton.addStretch() # - Layout of the frame - hFrame = QHBoxLayout() hFrame.addLayout(vEgim) hFrame.addLayout(vInstrument) hFrame.addLayout(vParameter) hFrame.addWidget(self.parameterDateWidget) hFrame.addWidget(self.acousticDateWidget) hFrame.addLayout(vButton) self.setLayout(hFrame) def loadObservatories(self): """ It asks for the available EGIM observatories and write its names into self.egimList """ # Send a message for the statusbar self.msg2Statusbar.emit("Loading observatories") # Clear self.egimList self.egimList.clear() # Ask for the observatories code, observatoryList = self.downloader.observatories() if code: if code == 200: # It means that you are going good self.egimList.addItems(observatoryList) # Send a message for the statusbar self.msg2Statusbar.emit("Ready") elif code == 401: self.msg2Statusbar.emit( "Unauthorized to use the EMSODEV DMP API") self.downloader.password = None self.reload() elif code == 404: self.msg2Statusbar.emit("Not Found") elif code == 403: self.msg2Statusbar.emit("Forbidden") elif code == 500: self.msg2Statusbar.emit("EMSODEV API internal error") else: self.msg2Statusbar.emit("Unknown EMSODEV DMP API error") else: self.msg2Statusbar.emit( "Impossible to connect to the EMSODEV DMP API") def loadInstruments(self, observatory): """ It asks for the available instruments and write its names into self.instrumentList Parameters ---------- observatory: item item from self.observatoryList """ # Send a message for the statusbar self.msg2Statusbar.emit("Loading instruments") # Clear self.instrumentList self.instrumentList.clear() # Ask for instruments code, instrumentList_ = self.downloader.instruments(observatory.text()) if code: if code == 200: # It means that you are going good # Obtain all sensor names of instrumentList_ sensorType = [ instrument['name'] for instrument in instrumentList_] self.instrumentList.addItems(sensorType) # Add tooltip for i in range(self.instrumentList.count()): self.instrumentList.item(i).setToolTip( '<p><b>Sensor Type</b><br>' + '{}</p><p>'.format(instrumentList_[i]['sensorType']) + '<b>Long Name</b><br>' + '{}</p>'.format(instrumentList_[i]['sensorLongName']) + '<p></p><p><b>S/N</b><br>' + '{}</p>'.format(instrumentList_[i]['sn'])) # Send a message for the statusbar self.msg2Statusbar.emit("Ready") elif code == 401: self.msg2Statusbar.emit( "Unauthorized to use the EMSODEV DMP API") self.downloader.password = None self.reload() elif code == 404: self.msg2Statusbar.emit("Not Found") elif code == 403: self.msg2Statusbar.emit("Forbidden") elif code == 500: self.msg2Statusbar.emit("EMSODEV API internal error") else: self.msg2Statusbar.emit("Unknown EMSODEV DMP API error") else: self.msg2Statusbar.emit( "Impossible to connect to the EMSODEV DMP API") def loadParameters(self, instrument): """ It asks for the available parameters and metadata and write them into self.parameterList and self.metadataList """ # Send a message for the statusbar self.msg2Statusbar.emit("Loading parameters") # Clear self.parameterList and self.metadataList self.parameterList.clear() self.metadataList.clear() self.parameterDateWidget.setEnabled(False) self.acousticDateWidget.setEnabled(False) # If instrument is an icListener, check times if instrument.text() == "icListen-1636": self.acousticDateWidget.setEnabled(True) # Ask for dates code, self.dates = self.downloader.acoustic_date( self.egimList.currentItem().text(), instrument.text()) if code == 200: dateList = [ date['acousticObservationDate'] for date in self.dates] self.dateList.addItems(dateList) else: self.msg2Statusbar.emit( "Impossible to connect to the EMSODEV DMP API") return return self.parameterDateWidget.setEnabled(True) # Ask for metadata code, self.metadata = self.downloader.metadata( self.egimList.currentItem().text(), instrument.text()) if code == 200: items = [] for key, value in self.metadata.items(): items.append("{}: {}".format(key, value)) self.metadataList.addItems(items) else: self.msg2Statusbar.emit( "Impossible to connect to the EMSODEV DMP API") return # Ask for parameters code, parameterList_ = self.downloader.parameters( self.egimList.currentItem().text(), instrument.text()) if code: if code == 200: # It means that you are going good # Obtain all parameter names of parameterList_ names = [parameter['name'] for parameter in parameterList_] self.parameterList.addItems(names) self.parameterList.sortItems() # Add tooltip for i in range(self.parameterList.count()): self.parameterList.item(i).setToolTip( '<b>Units:</b> {}'.format(parameterList_[i]['uom'])) # Send a message for the statusbar self.msg2Statusbar.emit("Ready") elif code == 401: self.msg2Statusbar.emit( "Unauthorized to use the EMSODEV DMP API") self.downloader.password = None self.reload() elif code == 404: self.msg2Statusbar.emit("Not Found") elif code == 403: self.msg2Statusbar.emit("Forbidden") elif code == 500: self.msg2Statusbar.emit("EMSODEV API internal error") else: self.msg2Statusbar.emit("Unknown EMSODEV DMP API error") else: self.msg2Statusbar.emit( "Impossible to connect to the EMSODEV DMP API") def loadTimes(self, date_item): """ Write items into self.hourMinuteList QListWidget """ for date in self.dates: if date['acousticObservationDate'] == date_item.text(): timeList = [] for time in date['observationsHourMinuteList']: timeList.append(time['acousticObservationHourMinute']) self.hourMinuteList.addItems(timeList) def reload(self): """It clear all lists and load again the observatories.""" # Check the password of the API if self.downloader.password is None: self.msg2Statusbar.emit( "Password is required to download data from EMSODEV") text, ok = QInputDialog.getText(self, "Attention", "Password", QLineEdit.Password) if ok: self.downloader.password = text else: return self.loadObservatories() def downloadClick(self): """Function when user click download""" self.myThread = self.DownloadParameterThread(self) self.myThread.start() def downloadParameter(self, parameter): """It download data with the observation function of EGIM""" # Send a message for the statusbar self.msg2Statusbar.emit("Downloading {}".format(parameter)) code, df = self.downloader.observation( observatory=self.egimList.currentItem().text(), instrument=self.instrumentList.currentItem().text(), parameter=parameter, startDate=self.startDateEdit.text(), endDate=self.endDateEdit.text(), limit=self.limitSpinBox.text()) if code: if code == 200: self.msg2Statusbar.emit("Waterframe creation") # It means that you are going good wf = self.downloader.to_waterframe(data=df, metadata=self.metadata) # print(wf.data.head()) # Send a signal with the new WaterFrame self.wf2plotSplitter.emit(wf) self.msg2Statusbar.emit("Ready") elif code == 401: self.msg2Statusbar.emit( "Unauthorized to use the EMSODEV DMP API") self.downloader.password = None self.reload() elif code == 404: self.msg2Statusbar.emit("Not Found") elif code == 403: self.msg2Statusbar.emit("Forbidden") elif code == 500: self.msg2Statusbar.emit("EMSODEV API internal error") else: self.msg2Statusbar.emit("Unknown EMSODEV DMP API error") else: self.msg2Statusbar.emit( "Impossible to connect to the EMSODEV DMP API") def downloadAcoustic(self, date, time): # Send a message for the statusbar self.msg2Statusbar.emit( "Downloading acoustic file from {}, {}".format(date, time)) code, df, metadata = self.downloader.acoustic_observation( observatory=self.egimList.currentItem().text(), instrument=self.instrumentList.currentItem().text(), date=date, hour_minute=time) if code: if code == 200: self.msg2Statusbar.emit("Waterframe creation") # It means that you are going good wf = self.downloader.to_waterframe(data=df, metadata=metadata) # Send a signal with the new WaterFrame self.wf2plotSplitter.emit(wf) self.msg2Statusbar.emit("Ready") elif code == 401: self.msg2Statusbar.emit( "Unauthorized to use the EMSODEV DMP API") self.downloader.password = None self.reload() elif code == 404: self.msg2Statusbar.emit("Not Found") elif code == 403: self.msg2Statusbar.emit("Forbidden") elif code == 500: self.msg2Statusbar.emit("EMSODEV API internal error") else: self.msg2Statusbar.emit("Unknown EMSODEV DMP API error") else: self.msg2Statusbar.emit( "Impossible to connect to the EMSODEV DMP API") def enableDate(self): """Enable or disable date elements""" if int(self.limitSpinBox.text()) > 0: self.startDateEdit.setEnabled(False) self.endDateEdit.setEnabled(False) else: self.startDateEdit.setEnabled(True) self.endDateEdit.setEnabled(True)
class Windows_1(QWidget): def __init__(self, settings_way_db, settings_panel=None): super().__init__() self.settings_way_db=settings_way_db self.settings_panel=settings_panel self.composition() def composition(self): self.setWindowTitle('Central Bank currency rates') self.setGeometry(10,10,350,150) self.setWindowIcon(QIcon(self.settings_panel)) self.date_input()#Конструируем основные компоненты окна self.show() """Фу-ия date_input является конструктором для основных элементов окна экземпляров класса Windows_1 """ def date_input(self): self.lab1=QLabel('Date:',self) self.send_but=QPushButton('Send') self.cal_but=QPushButton('Calendar') self.save_but=QPushButton('Save data') self.exit_but=QPushButton('Exit') self.save_but.clicked.connect(self.save_date)#При нажатии на кнопки, будет идти сигнал для вызова заданной функции self.send_but.clicked.connect(self.req_curr_rate) self.cal_but.clicked.connect(self.calendar) self.exit_but.clicked.connect(self.close) self.data=QDateEdit(self)#Создаем экземпляр класса виджета QDateEdit для окна ввода даты self.data.setDisplayFormat('dd/MM/yyyy') self.combo_val=QComboBox(self)#Создаем виджет выпадающего списка valutes=['AUD','AZN','GBP','AMD','BYN','BGN','BRL','HUF','HKD','DKK','USD','EUR','INR', 'KZT','CAD','KGS','CNY','MDL','NOK','PLN','RON','XDR','SGD','TJS','TRY','TMT', 'UZS','UAH','CZK','SEK','CHF','ZAR','KRW','JPY'] for valute in sorted(valutes): self.combo_val.addItem(valute) self.combo_val.activated[str].connect(self.insert_combo_val)#Закрепляем за каждым элементом списка сигнал для активации заданной функции grid=QGridLayout()#Создаем сетку для точного размещения элементов grid.setSpacing(1)#Расстояние между элементами в сетке grid.addWidget(self.lab1,1,0,1,1)#Добавляем эелементы с позиционированием grid.addWidget(self.data,1,1,1,1) grid.addWidget(self.cal_but, 1,2,1,1) grid.addWidget(self.send_but,1,3,1,1) grid.addWidget(self.combo_val, 3,0) options=('CharCode','Name','Nominal','NumCode','Value') count=4 self.options=dict()#Создаем словарь для размещения в нем ссылок на объеты экземпляров класса QTextEdit for option in options: val_lab=QLabel(option) val_edit=QLineEdit(self) grid.addWidget(val_lab,count,0) grid.addWidget(val_edit,count,1,1,8) self.options[option]=val_edit count+=1 grid.addWidget(self.save_but,12,7) grid.addWidget(self.exit_but,12,8) self.setLayout(grid)#Прикрепляем нашу сетку к экземпляру класса Windows_1 """Фу-ия req_curr_rate отправляет запрос базе данных ЦБ, полученные данные отображает в экземплярах класса QTextEdit, ссылки на объекты берет из словаря self.options """ def req_curr_rate(self): from cb_requests import req_curr_rate from requests import ConnectionError if datetime(int(self.data.text()[6:]), int(self.data.text()[3:5]), int(self.data.text()[0:2]), hour=0, minute=0, second=0, microsecond=0, tzinfo=None) > datetime.now():#Перед отправкой запроса идет сравнение времени, если введенная дата больше текущей, то выскочит сообщение об ошибке self.error_no_data = QErrorMessage(self) self.error_no_data.setWindowTitle('No data available') self.error_no_data.showMessage('You entered a date that is greater than the current date') else: try: self.request=req_curr_rate(self.data.text())#Обработка исключения, если при отправке запроса, появется ConnectionError, то появится окно с ошибкой for key in self.request: if key=='ValCurs': continue elif self.request[key]['CharCode']==self.combo_val.currentText(): for values in self.request.values(): for value in values: if value=='Date' or value=='name':continue else: self.options[value].setText(str(self.request[key][value])) except ConnectionError: self.error_no_connect = QErrorMessage(self) self.error_no_connect.setWindowTitle('Сonnection Error') self.error_no_connect.showMessage('No internet connection') """Фу-ия insert_combo_val получает сигнал от каждого элемента выпадающего списка и заполняет объекты словаря self.options полученными данными от запроса в ЦБ РФ """ def insert_combo_val(self, combo_val): try: for key in self.request: #Обработка исключения, в случае если запрос не был отправлен if key =='ValCurs': continue elif self.request[key]['CharCode']==combo_val: for values in self.request.values(): for value in values: if value=='Date' or value=='name':continue else: self.options[value].setText(str(self.request[key][value])) except AttributeError: self.error_no_data = QErrorMessage(self) self.error_no_data.setWindowTitle('No data available') self.error_no_data.showMessage('You did not send the request') """Фу-ия calendar, создает экземпляр класса QCalendarWidget """ def calendar(self): self.cal=QCalendarWidget() self.cal.setGridVisible(True)#Видимая сетка на календаре self.cal.setGeometry(300,300,450,200) self.cal.setWindowIcon(QIcon(self.settings_panel)) self.cal.setWindowTitle('Calendar') self.cal.show() self.cal.clicked[QDate].connect(self.show_date)#При нажатии на дату передает сигнал заданной функции """Фу-ия show_date устанавливает выбранную дату в поле вывода даты """ def show_date(self): self.data.setDate(self.cal.selectedDate()) """Фу-ия save_date сохраняет полученные данные из базы данных ЦБ РФ, в собственную базу данных 'Valute', при отсутсвии базы данных создает новую """ def save_date(self): from db_manag import DBmanager from sqlite3 import OperationalError as sqlite3_OperationalError self.data_base=DBmanager(self.settings_way_db,'valute')#Подключаемся или создаем экземпляр класса DBManager, передаем путь к базе данных из settings.yaml в качестве аргумента try: self.data_base.insert_into(self.request)#Сохранеям данные в базу данных 'Valute' except sqlite3_OperationalError: self.data_base.create_table()#Обработка исключения, в случае отсутсвия бд 'Valute', создаем новую базу данных self.data_base.insert_into(self.request) self.message_save_data = QMessageBox.information(self, 'Save Data', 'Data saved', QMessageBox.Ok) except AttributeError: self.error_no_data=QErrorMessage(self) self.error_no_data.setWindowTitle('No data') self.error_no_data.showMessage('No data to save') else: self.message_save_data=QMessageBox.information(self, 'Save Data', 'Data saved', QMessageBox.Ok)
class SpotPricePopup(QDialog): def __init__(self, *args): super(SpotPricePopup, self).__init__(*args) self.setFixedSize(800, 500) self.setAttribute(Qt.WA_DeleteOnClose, True) self.setWindowTitle("现货报价") main_layout = QVBoxLayout() opt_layout = QHBoxLayout() self.date_edit = QDateEdit(self) self.date_edit.setDate(QDate.currentDate()) self.date_edit.setCalendarPopup(True) self.date_edit.setDisplayFormat("yyyy-MM-dd") opt_layout.addWidget(self.date_edit) self.query_button = QPushButton("查询", self) self.query_button.clicked.connect(self.get_sport_prices) opt_layout.addWidget(self.query_button) opt_layout.addStretch() main_layout.addLayout(opt_layout) self.spot_price_table = QTableWidget(self) self.spot_price_table.setFrameShape(QFrame.NoFrame) self.spot_price_table.verticalHeader().hide() self.spot_price_table.setColumnCount(5) self.spot_price_table.setHorizontalHeaderLabels( ["序号", "品种", "日期", "报价", "增减"]) self.spot_price_table.horizontalHeader().setSectionResizeMode( QHeaderView.Stretch) self.spot_price_table.horizontalHeader().setSectionResizeMode( 0, QHeaderView.ResizeToContents) main_layout.addWidget(self.spot_price_table) self.setLayout(main_layout) self.spot_price_table.horizontalScrollBar().setStyleSheet( "QScrollBar:horizontal{background:transparent;height:10px;margin:0px;}" "QScrollBar:horizontal:hover{background:rgba(0,0,0,30);border-radius:5px}" "QScrollBar::handle:horizontal{background:rgba(0,0,0,50);height:10px;border-radius:5px;border:none}" "QScrollBar::handle:horizontal:hover{background:rgba(0,0,0,100)}" "QScrollBar::add-page:horizontal{height:10px;background:transparent;}" "QScrollBar::sub-page:horizontal{height:10px;background:transparent;}" "QScrollBar::sub-line:horizontal{width:0px}" "QScrollBar::add-line:horizontal{width:0px}") self.spot_price_table.verticalScrollBar().setStyleSheet( "QScrollBar:vertical{background: transparent; width:10px;margin: 0px;}" "QScrollBar:vertical:hover{background:rgba(0,0,0,30);border-radius:5px}" "QScrollBar::handle:vertical{background: rgba(0,0,0,50);width:10px;border-radius:5px;border:none}" "QScrollBar::handle:vertical:hover{background:rgba(0,0,0,100)}" "QScrollBar::add-page:vertical{width:10px;background:transparent;}" "QScrollBar::sub-page:vertical{width:10px;background:transparent;}" "QScrollBar::sub-line:vertical{height:0px}" "QScrollBar::add-line:vertical{height:0px}") self.spot_price_table.horizontalHeader().setStyleSheet( "QHeaderView::section{background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1," "stop:0 #49aa54, stop: 0.48 #49cc54,stop: 0.52 #49cc54, stop:1 #49aa54);" "border:1px solid rgb(201,202,202);border-left:none;" "min-height:25px;min-width:40px;font-weight:bold;font-size:13px};") self.get_sport_prices() def get_sport_prices(self): """ 请求当前时间的现货报价 """ current_date = self.date_edit.text() current_date = datetime.strptime(current_date, "%Y-%m-%d").strftime("%Y%m%d") url = SERVER_API + "spot-price/?date={}".format(current_date) network_manager = getattr(qApp, "_network") reply = network_manager.get(QNetworkRequest(QUrl(url))) reply.finished.connect(self.spot_price_reply) def spot_price_reply(self): """ 指定日期现货报价数据返回 """ reply = self.sender() if reply.error(): pass else: data = json.loads(reply.readAll().data().decode("utf-8")) self.show_current_sport_prices(data["data"], value_keys=[ "id", "variety_zh", "date", "spot_price", "price_increase" ]) reply.deleteLater() def show_current_sport_prices(self, content_values, value_keys): """ 显示数据 """ self.spot_price_table.clearContents() self.spot_price_table.setRowCount(len(content_values)) for row, row_item in enumerate(content_values): for col, key in enumerate(value_keys): if col == 0: item = QTableWidgetItem(str(row + 1)) else: item = QTableWidgetItem(str(row_item[key])) if col == 4: # 设置颜色 if int(row_item[key]) > 0: color = QColor(203, 0, 0) elif int(row_item[key]) < 0: color = QColor(0, 124, 0) else: color = QColor(0, 0, 0) item.setForeground(QBrush(color)) item.setTextAlignment(Qt.AlignCenter) self.spot_price_table.setItem(row, col, item)
class BookLog(QWidget): NavigationMode, AddingMode, EditingMode = range(3) def __init__(self, parent=None): super(BookLog, self).__init__(parent) self.contacts = SortedDict() self.oldTitle = '' self.oldMemo = '' self.oldShoziflag = False self.oldIsbn = '' self.oldDokuryodate = QDate() self.currentMode = self.NavigationMode #ラベル titleLabel = QLabel("書名:") self.titleLine = QLineEdit() self.titleLine.setReadOnly(True) dokuryoLabel = QLabel("読了日:") self.dokuryodate = QDateEdit() self.dokuryodate.setReadOnly(True) memoLabel = QLabel("メモ:") self.memoText = QTextEdit() self.memoText.setReadOnly(True) isbnLabel = QLabel("ISBN:") self.isbnLine = QLineEdit() self.isbnLine.setReadOnly(True) shoziflag = QLabel("所持:") self.shoziflag = QCheckBox() self.addButton = QPushButton("&追加") self.addButton.show() self.editButton = QPushButton("&編集") self.editButton.setEnabled(False) self.removeButton = QPushButton("&削除") self.removeButton.setEnabled(False) self.findButton = QPushButton("&検索") self.findButton.setEnabled(False) self.submitButton = QPushButton("&挿入") self.submitButton.hide() self.cancelButton = QPushButton("&キャンセル") self.cancelButton.hide() self.nextButton = QPushButton("&次") self.nextButton.setEnabled(False) self.previousButton = QPushButton("&前") self.previousButton.setEnabled(False) self.loadButton = QPushButton("&Load...") self.loadButton.setToolTip("Load contacts from a file") self.saveButton = QPushButton("Sa&ve...") self.saveButton.setToolTip("Save contacts to a file") self.saveButton.setEnabled(False) self.exportButton = QPushButton("Ex&port") self.exportButton.setToolTip("Export as vCard") self.exportButton.setEnabled(False) self.dialog = FindDialog() self.addButton.clicked.connect(self.addContact) self.submitButton.clicked.connect(self.submitContact) self.editButton.clicked.connect(self.editContact) self.removeButton.clicked.connect(self.removeContact) #self.findButton.clicked.connect(self.findContact) self.cancelButton.clicked.connect(self.cancel) self.nextButton.clicked.connect(self.next) self.previousButton.clicked.connect(self.previous) self.loadButton.clicked.connect(self.loadFromFile) self.saveButton.clicked.connect(self.saveToFile) self.exportButton.clicked.connect(self.exportAsVCard) #self.createMenus() #topFiller = QWidget() #topFiller.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) buttonLayout1 = QVBoxLayout() buttonLayout1.addWidget(self.addButton) buttonLayout1.addWidget(self.editButton) buttonLayout1.addWidget(self.removeButton) buttonLayout1.addWidget(self.findButton) buttonLayout1.addWidget(self.submitButton) buttonLayout1.addWidget(self.cancelButton) buttonLayout1.addWidget(self.loadButton) buttonLayout1.addWidget(self.saveButton) buttonLayout1.addWidget(self.exportButton) buttonLayout1.addStretch() buttonLayout2 = QHBoxLayout() buttonLayout2.addWidget(self.previousButton) buttonLayout2.addWidget(self.nextButton) mainLayout = QGridLayout() mainLayout.addWidget(titleLabel, 0, 0) mainLayout.addWidget(self.titleLine, 0, 1) mainLayout.addWidget(memoLabel, 3, 0, Qt.AlignTop) mainLayout.addWidget(self.memoText, 3, 1) mainLayout.addWidget(dokuryoLabel, 2, 0) mainLayout.addWidget(self.dokuryodate, 2, 1) mainLayout.addWidget(isbnLabel, 1, 0) mainLayout.addWidget(self.isbnLine, 1, 1) mainLayout.addWidget(shoziflag, 4, 0) mainLayout.addWidget(self.shoziflag, 4, 1) mainLayout.addLayout(buttonLayout1, 6, 2) mainLayout.addLayout(buttonLayout2, 5, 1) #テーブル self.table = QTableWidget(100, 5,) self.table.setHorizontalHeaderLabels(["書名", "ISBN", "読了日", "メモ", "所持"]) self.table.verticalHeader().setVisible(False) #for i, (title, memo) in enumerate(tableData): i = 0 for title, obj in self.contacts.items(): titleItem = QTableWidgetItem(title) memoItem = QTableWidgetItem() memoItem.setData(Qt.DisplayRole, memo) if obj['shoziflag'] == True: maru = '○' else: maru = '' self.table.setItem(i, 0, titleItem) self.table.setItem(i, 1, QTableWidgetItem(obj['isbn'])) self.table.setItem(i, 2, QTableWidgetItem(obj['dokuryodate'])) self.table.setItem(i, 3, QTableWidgetItem(obj['memo'])) self.table.setItem(i, 4, QTableWidgetItem(maru)) i += 1 #table.resize(150, 50) #self.table.resizeColumnToContents(0) self.table.horizontalHeader().setStretchLastSection(True) self.table.doubleClicked.connect(self.tableclick) mainLayout.addWidget(self.table, 6, 1) #mainLayout.addWidget(topFiller) self.setLayout(mainLayout) self.setWindowTitle("Simple Book Log") #self.csvImport() self.loadFromFile('./a.bl') def createUI(self): self.setWindowTitle('Equipment Manager 0.3') #Menu Bar fileMenuBar = QMenuBar(self) menuFile = QMenu(fileMenuBar) actionChangePath = QAction(tr("Change Path"), self) fileMenuBar.addMenu(menuFile) menuFile.addAction(actionChangePath) def addContact(self): self.oldTitle = self.titleLine.text() self.oldMemo = self.memoText.toPlainText() self.oldIsbn = self.isbnLine.text() self.titleLine.clear() self.memoText.clear() self.isbnLine.clear() self.updateInterface(self.AddingMode) def editContact(self): self.oldTitle = self.titleLine.text() self.oldMemo = self.memoText.toPlainText() self.oldDokuryodate = self.dokuryodate.text() self.oldIsbn = self.isbnLine.text() self.oldShoziflag = self.shoziflag.isChecked() self.updateInterface(self.EditingMode) def submitContact(self): title = self.titleLine.text() memo = self.memoText.toPlainText() isbn = self.isbnLine.text() dokuryodate = self.dokuryodate.text() shoziflag = self.shoziflag.isChecked() if title == "" or memo == "": QMessageBox.information(self, "Empty Field", "Please enter a title and memo.") return if self.currentMode == self.AddingMode: if title not in self.contacts: self.contacts[title] = {'memo':memo, 'dokuryodate':dokuryodate, 'isbn':isbn, 'shoziflag':shoziflag} QMessageBox.information(self, "追加しました", "\"%s\" は追加されました。" % title) else: QMessageBox.information(self, "追加できませんでした", "\"%s\" はすでに存在しています。" % title) return elif self.currentMode == self.EditingMode: if self.oldTitle != title: if title not in self.contacts: QMessageBox.information(self, "編集しました", "\"%s\" は編集されました。" % self.oldTitle) del self.contacts[self.oldTitle] self.contacts[title] = memo else: QMessageBox.information(self, "編集できませんでした。", "\"%s\"はすでに存在しています。" % title) return elif self.oldMemo != memo: QMessageBox.information(self, "編集しました", "\"%s\"は編集されました。" % title) self.contacts[title] = {memo:memo, dokuryodate:dokuryodate, shoziflag:shoziflag, isbn:isbn } self.updateInterface(self.NavigationMode) # ボタンの処理 def cancel(self): self.titleLine.setText(self.oldTitle) self.memoText.setText(self.oldMemo) self.dokuryodate.setDate(self.oldDokuryodate) self.shoziflag.setChecked(self.oldShoziflag) self.isbnLine.setText(self.oldIsbn) self.updateInterface(self.NavigationMode) def removeContact(self): title = self.titleLine.text() memo = self.memoText.toPlainText() if title in self.contacts: button = QMessageBox.question(self, "Confirm Remove", "Are you sure you want to remove \"%s\"?" % title, QMessageBox.Yes | QMessageBox.No) if button == QMessageBox.Yes: self.previous() del self.contacts[title] QMessageBox.information(self, "Remove Successful", "\"%s\" has been removed from your memo book." % title) self.updateInterface(self.NavigationMode) def next(self): title = self.titleLine.text() it = iter(self.contacts) try: while True: this_title, _ = it.next() if this_title == title: next_title, next_memo, next_date = it.next() break except StopIteration: next_title, next_memo = iter(self.contacts).next() self.titleLine.setText(next_title) self.memoText.setText(next_memo) def previous(self): title = self.titleLine.text() prev_title = prev_memo = None for this_title, this_memo in self.contacts: if this_title == title: break prev_title = this_title prev_memo = this_memo else: self.titleLine.clear() self.memoText.clear() return if prev_title is None: for prev_title, prev_memo in self.contacts: pass self.titleLine.setText(prev_title) self.memoText.setText(prev_memo) def Contact(self): self.dialog.show() if self.dialog.exec_() == QDialog.Accepted: contactTitle = self.dialog.getFindText() found = False for this_title, this_memo in self.contacts: # if contactTitle in this_title: if re.search(contactTitle, this_title): found = True break if found: self.titleLine.setText(this_title) self.memoText.setText(self.contacts[this_title]) self.isbnLine.setText(self.contacts[this_title]) self.dokuryodate.setDate(self.contacts[this_title]) self.shoziflag.setChecked(self.contacts[this_title]) else: QMessageBox.information(self, "Contact Not Found", "Sorry, \"%s\" is not in your address book." % contactTitle) return self.updateInterface(self.NavigationMode) # ボタンを押せるか押せないかの処理 def updateInterface(self, mode): self.currentMode = mode if self.currentMode in (self.AddingMode, self.EditingMode): self.titleLine.setReadOnly(False) self.titleLine.setFocus(Qt.OtherFocusReason) self.isbnLine.setReadOnly(False) self.dokuryodate.setReadOnly(False) self.memoText.setReadOnly(False) self.addButton.setEnabled(False) self.editButton.setEnabled(False) self.removeButton.setEnabled(False) self.nextButton.setEnabled(False) self.previousButton.setEnabled(False) self.submitButton.show() self.cancelButton.show() self.loadButton.setEnabled(False) self.saveButton.setEnabled(False) self.exportButton.setEnabled(False) elif self.currentMode == self.NavigationMode: if not self.contacts: self.titleLine.clear() self.memoText.clear() self.dokuryodate.clear() self.isbnLine.clear() self.titleLine.setReadOnly(True) self.memoText.setReadOnly(True) self.dokuryodate.setReadOnly(True) self.shoziflag self.isbnLine.setReadOnly(True) self.addButton.setEnabled(True) number = len(self.contacts) self.editButton.setEnabled(number >= 1) self.removeButton.setEnabled(number >= 1) self.findButton.setEnabled(number > 2) self.nextButton.setEnabled(number > 1) self.previousButton.setEnabled(number >1 ) self.submitButton.hide() self.cancelButton.hide() self.exportButton.setEnabled(number >= 1) self.loadButton.setEnabled(True) self.saveButton.setEnabled(number >= 1) #テーブルの更新 i = 0 for title, obj in self.contacts.items(): titleItem = QTableWidgetItem(title) memoItem = QTableWidgetItem() memoItem.setData(Qt.DisplayRole, obj['memo']) if obj['shoziflag'] == True: maru = '○' else: maru = '' self.table.setItem(i, 0, titleItem) self.table.setItem(i, 1, QTableWidgetItem(obj['isbn'])) self.table.setItem(i, 2, QTableWidgetItem(obj['dokuryodate'])) self.table.setItem(i, 3, QTableWidgetItem(obj['memo'])) self.table.setItem(i, 4, QTableWidgetItem(maru)) i += 1 def saveToFile(self): fileTitle, _ = QFileDialog.getSaveFileName(self, "Save book log", '', "Book Log (*.bl);;All Files (*)") if not fileTitle: return try: out_file = open(str(fileTitle), 'wb') except IOError: QMessageBox.information(self, "Unable to open file", "There was an error opening \"%s\"" % fileTitle) return pickle.dump(self.contacts, out_file) out_file.close() def loadFromFile(self, fileName= None): if not fileName: fileName, _ = QFileDialog.getOpenFileName(self, "Open Address Book", '', "Address Book (*.bl);;All Files (*)") try: in_file = open(str(fileName), 'rb') except IOError: QMessageBox.information(self, "Unable to open file", "There was an error opening \"%s\"" % fileName) return self.contacts = pickle.load(in_file) in_file.close() if len(self.contacts) == 0: QMessageBox.information(self, "No contacts in file", "The file you are attempting to open contains no " "contacts.") else: for title, obj in self.contacts: date = QDate.fromString(obj['dokuryodate']) self.titleLine.setText(title) self.memoText.setText(obj['memo']) self.shoziflag.setChecked(obj['shoziflag']) self.isbnLine.setText(obj['isbn']) self.dokuryodate.setDate(date) self.updateInterface(self.NavigationMode) def exportAsVCard(self): title = str(self.titleLine.text()) memo = self.memoText.toPlainText() titleList = title.split() if len(titleList) > 1: firstName = nameList[0] lastName = nameList[-1] else: firstName = name lastName = '' fileName, _ = QFileDialog.getSaveFileName(self, "Export Contact", '', "vCard Files (*.vcf);;All Files (*)") if not fileName: return out_file = QFile(fileName) if not out_file.open(QIODevice.WriteOnly): QMessageBox.information(self, "Unable to open file", out_file.errorString()) return out_s = QTextStream(out_file) out_s << 'BEGIN:VCARD' << '\n' out_s << 'VERSION:2.1' << '\n' out_s << 'N:' << lastName << ';' << firstName << '\n' out_s << 'FN:' << ' '.join(nameList) << '\n' address.replace(';', '\\;') address.replace('\n', ';') address.replace(',', ' ') out_s << 'ADR;HOME:;' << address << '\n' out_s << 'END:VCARD' << '\n' QMessageBox.information(self, "Export Successful", "\"%s\" has been exported as a vCard." % name) def csvImport(self): with open('MediaMarkerExport.csv', newline='', encoding='utf-8') as f: reader = csv.reader(f) for r in reader: if r[2] == 1: flag = True else: flag = False self.contacts[r[0]] = {'isbn':r[1], 'dokuryodate':r[3].replace('-', '/'), 'shoziflag':flag, 'memo':''} aa = 0 def createMenus(self): self.fileMenu = self.menuBar().addMenu("&File") #self.fileMenu.addAction(self.newAct) #self.fileMenu.addAction(self.openAct) #self.fileMenu.addAction(self.saveAct) #self.fileMenu.addAction(self.printAct) #self.fileMenu.addSeparator() #self.fileMenu.addAction(self.exitAct) self.editMenu = self.menuBar().addMenu("&Edit") self.editMenu.addAction(self.undoAct) self.editMenu.addAction(self.redoAct) self.editMenu.addSeparator() self.editMenu.addAction(self.cutAct) self.editMenu.addAction(self.copyAct) self.editMenu.addAction(self.pasteAct) self.editMenu.addSeparator() self.helpMenu = self.menuBar().addMenu("&Help") self.helpMenu.addAction(self.aboutAct) self.helpMenu.addAction(self.aboutQtAct) self.formatMenu = self.editMenu.addMenu("&Format") self.formatMenu.addAction(self.boldAct) self.formatMenu.addAction(self.italicAct) self.formatMenu.addSeparator().setText("Alignment") self.formatMenu.addAction(self.leftAlignAct) self.formatMenu.addAction(self.rightAlignAct) self.formatMenu.addAction(self.justifyAct) self.formatMenu.addAction(self.centerAct) self.formatMenu.addSeparator() self.formatMenu.addAction(self.setLineSpacingAct) self.formatMenu.addAction(self.setParagraphSpacingAct) def tableclick(self, mi): row = mi.row() column = mi.column() #QMessageBox.information(self, "Export Successful", # "%d x %d" % (row, column)) title = self.titleLine.text() it = iter(self.contacts) try: n = 0 while True: next_title, next_obj = it.next() if row == n: break n += 1 except StopIteration: next_title, next_obj = iter(self.contacts).next() self.titleLine.setText(next_title) self.memoText.setText(next_obj['memo']) self.isbnLine.setText(next_obj['isbn']) self.dokuryodate.setDate(next_obj['dokuryodate']) self.shoziflag.setChecked(next_obj['shoziflag'])
class MACDBackTest(QDialog): def __init__(self): super(MACDBackTest, self).__init__() self.codepool = [ "000001", "000002", "000004", ] self.initUI() def initUI(self): self.resize(900, 600) self.setWindowTitle("QUANT XH 金融终端——MACD金叉死叉回测") self.setWindowIcon(QIcon("static/icon.png")) self.poollabel = QLabel() self.poollabel.setText("股票池") self.poollabel.setFont(QFont("仿宋", 15)) self.pooledit = QTextEdit() self.pooledit.setFont(QFont("仿宋", 12)) self.pooledit.setFixedSize(120, 30) self.pooladdbtn = QPushButton() self.pooladdbtn.setText("添加股票") self.pooladdbtn.setFont(QFont("仿宋", 12)) self.pooladdbtn.setFixedSize(100, 30) self.pooladdbtn.clicked.connect(self.addCode) self.poolclbtn = QPushButton() self.poolclbtn.setText("清空") self.poolclbtn.setFont(QFont("仿宋", 12)) self.poolclbtn.setFixedSize(80, 30) self.poolclbtn.clicked.connect(self.clearPool) self.pooltb = QTextBrowser() self.pooltb.setFixedSize(300, 300) self.pooltb.setFont(QFont("仿宋", 12)) self.shortlabel = QLabel() self.shortlabel.setText("SHORT") self.shortlabel.setFont(QFont("仿宋", 15)) self.shortedit = QTextEdit() self.shortedit.setText("12") self.shortedit.setFont(QFont("仿宋", 12)) self.shortedit.setFixedSize(50, 30) self.longlabel = QLabel() self.longlabel.setText("LONG") self.longlabel.setFont(QFont("仿宋", 15)) self.longedit = QTextEdit() self.longedit.setText("26") self.longedit.setFont(QFont("仿宋", 12)) self.longedit.setFixedSize(50, 30) self.mlabel = QLabel() self.mlabel.setText("M") self.mlabel.setFont(QFont("仿宋", 15)) self.medit = QTextEdit() self.medit.setText("9") self.medit.setFont(QFont("仿宋", 12)) self.medit.setFixedSize(50, 30) self.texttb = QTextBrowser() self.texttb.setFont(QFont("仿宋", 10)) self.texttb.setFixedSize(300, 150) self.texttb.setText( "当DIFF和DEA均为正值,DIFF线向上突破DEA线,在0轴上方形成金叉,表示市场上买盘非常踊跃,上涨行情仍将继续。\n\n" "当DIFF和DEA均为负值,DIFF线向上突破DEA线,在0轴下方形成金叉表示市场上的做空气氛有所缓解,股价可能止跌反弹。") self.ckfromtimelabel = QLabel() self.ckfromtimelabel.setText("窗口开始时间") self.ckfromtimelabel.setFont(QFont("仿宋", 15)) self.ckfromtimeedit = QDateEdit() datefrom = datetime.strptime("2018-09-01", "%Y-%m-%d").date() self.ckfromtimeedit.setDate(datefrom) self.ckfromtimeedit.setFont(QFont("仿宋", 12)) self.ckfromtimeedit.setFixedSize(200, 30) self.cktotimelabel = QLabel() self.cktotimelabel.setText("窗口结束时间") self.cktotimelabel.setFont(QFont("仿宋", 15)) self.cktotimeedit = QDateEdit() dateto = datetime.strptime("2019-05-20", "%Y-%m-%d").date() self.cktotimeedit.setDate(dateto) self.cktotimeedit.setFont(QFont("仿宋", 12)) self.cktotimeedit.setFixedSize(200, 30) self.ycfromtimelabel = QLabel() self.ycfromtimelabel.setText("预测开始时间") self.ycfromtimelabel.setFont(QFont("仿宋", 15)) self.ycfromtimeedit = QDateEdit() datefrom = datetime.strptime("2019-01-01", "%Y-%m-%d").date() self.ycfromtimeedit.setDate(datefrom) self.ycfromtimeedit.setFont(QFont("仿宋", 12)) self.ycfromtimeedit.setFixedSize(200, 30) self.yctotimelabel = QLabel() self.yctotimelabel.setText("预测结束时间") self.yctotimelabel.setFont(QFont("仿宋", 15)) self.yctotimeedit = QDateEdit() dateto = datetime.strptime("2019-05-01", "%Y-%m-%d").date() self.yctotimeedit.setDate(dateto) self.yctotimeedit.setFont(QFont("仿宋", 12)) self.yctotimeedit.setFixedSize(200, 30) self.cashlabel = QLabel() self.cashlabel.setText("初始资金") self.cashlabel.setFont(QFont("仿宋", 15)) self.cashedit = QTextEdit() self.cashedit.setText("1000000") self.cashedit.setFont(QFont("仿宋", 12)) self.cashedit.setFixedSize(200, 30) self.amountlabel = QLabel() self.amountlabel.setText("单笔交易股数") self.amountlabel.setFont(QFont("仿宋", 15)) self.amountedit = QTextEdit() self.amountedit.setText("3000") self.amountedit.setFont(QFont("仿宋", 12)) self.amountedit.setFixedSize(200, 30) self.selectbtn = QPushButton() self.selectbtn.setText("开始回测") self.selectbtn.setFixedSize(120, 40) self.selectbtn.setFont(QFont("仿宋", 12)) self.selectbtn.clicked.connect(self.backTest) # self.resultbtn = QPushButton() # self.resultbtn.setText("回测结果") # self.resultbtn.setFixedSize(120,40) # self.resultbtn.setFont(QFont("仿宋", 12)) # self.resultbtn.setEnabled(False) self.h11box = QHBoxLayout() self.h11box.addWidget(self.pooledit) self.h11box.addWidget(self.pooladdbtn) self.h11box.addWidget(self.poolclbtn) self.h12box = QHBoxLayout() self.h12box.addWidget(self.pooltb) self.h13box = QHBoxLayout() self.h13box.addStretch(1) self.h13box.addWidget(self.shortlabel) self.h13box.addWidget(self.shortedit) self.h13box.addStretch(1) self.h13box.addWidget(self.longlabel) self.h13box.addWidget(self.longedit) self.h13box.addStretch(1) self.h13box.addWidget(self.mlabel) self.h13box.addWidget(self.medit) self.h13box.addStretch(1) self.h14box = QHBoxLayout() self.h14box.addStretch(1) self.h14box.addWidget(self.texttb) self.h14box.addStretch(1) self.v1box = QVBoxLayout() self.v1box.addStretch(1) self.v1box.addWidget(self.poollabel) self.v1box.addLayout(self.h11box) self.v1box.addLayout(self.h12box) self.v1box.addStretch(1) self.v1box.addLayout(self.h13box) self.v1box.addStretch(1) self.v1box.addLayout(self.h14box) self.v1box.addStretch(1) self.h21box = QHBoxLayout() self.h21box.addWidget(self.selectbtn) # self.h21box.addWidget(self.resultbtn) self.v2box = QVBoxLayout() self.v2box.addStretch(1) self.v2box.addWidget(self.ckfromtimelabel) self.v2box.addWidget(self.ckfromtimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.cktotimelabel) self.v2box.addWidget(self.cktotimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.ycfromtimelabel) self.v2box.addWidget(self.ycfromtimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.yctotimelabel) self.v2box.addWidget(self.yctotimeedit) self.v2box.addStretch(1) self.v2box.addWidget(self.cashlabel) self.v2box.addWidget(self.cashedit) self.v2box.addStretch(1) self.v2box.addWidget(self.amountlabel) self.v2box.addWidget(self.amountedit) self.v2box.addStretch(1) self.v2box.addLayout(self.h21box) self.v2box.addStretch(1) self.hbox = QHBoxLayout() self.hbox.addStretch(1) self.hbox.addLayout(self.v1box) self.hbox.addStretch(1) self.hbox.addLayout(self.v2box) self.hbox.addStretch(1) self.setLayout(self.hbox) self.pooltb.setPlainText(' '.join(self.codepool)) def addCode(self): f = FETCH() code = self.pooledit.toPlainText() if code in self.codepool: print( QMessageBox.information(self, "提示", "该股票已经存在于股票池中!", QMessageBox.Yes, QMessageBox.Yes)) elif code not in list(f.fetch_stock_list()['code']): print( QMessageBox.information(self, "提示", "该股票代码不存在!", QMessageBox.Yes, QMessageBox.Yes)) else: self.codepool.append(code) self.pooledit.clear() self.pooltb.setPlainText(' '.join(self.codepool)) def clearPool(self): self.codepool = [] self.pooltb.setPlainText(' '.join(self.codepool)) def backTest(self): def change_name(s): l = s.split('/') if len(l[1]) == 1: l[1] = "0" + l[1] if len(l[2]) == 1: l[2] = "0" + l[2] return ("-".join(l)) r = MACDTest(cash=int(self.cashedit.toPlainText())) r.MACD_backtest(code=self.codepool, ckstart=change_name(self.ckfromtimeedit.text()), ckend=change_name(self.cktotimeedit.text()), ycstart=change_name(self.ycfromtimeedit.text()), ycend=change_name(self.yctotimeedit.text()), amount=int(self.amountedit.toPlainText()), SHORT=int(self.shortedit.toPlainText()), LONG=int(self.longedit.toPlainText()), M=int(self.medit.toPlainText())) r.save_to_mongo() # self.resultbtn.clicked.connect(self.btResult(r.ACstr)) # self.resultbtn.setEnabled(True) self.btResult(r.ACstr) def btResult(self, AC_id): dialog = BackTestResult(ACid=AC_id) dialog.setWindowFlags(Qt.WindowStaysOnTopHint) dialog.show() dialog.exec_()
class App(QMainWindow): def __init__(self): super().__init__() self.title = 'PyQt5 textbox - pythonspot.com' self.left = 20 self.top = 40 self.width = 4000 self.height = 3400 self.initUI() data1r = 0 data2r = 0 def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) # Create textbox self.label = QLabel('Nome Azione', self) self.label.move(100, 160) self.label.show() self.nome = QLineEdit(self) self.nome.move(300, 160) self.nome.show() self.dat1 = QDateEdit(self) self.dat1.move(500, 160) self.dat1.show() self.dat2 = QDateEdit(self) self.dat2.move(800, 160) self.dat2.show() # Create a button in the window self.button = QPushButton('Show text', self) self.button.move(400, 260) # connect button to function on_click self.button.clicked.connect(self.on_click) self.show() @pyqtSlot() def on_click(self): textboxValue = self.nome.text() data1g = self.dat1.text() data1r = datetime.datetime.strptime(data1g, "%d/%m/%Y").strftime("%Y-%m-%d") data2g = self.dat2.text() data2r = datetime.datetime.strptime(data2g, "%d/%m/%Y").strftime("%Y-%m-%d") print(data1r) print(data2r) if (textboxValue == ""): QMessageBox.question(self, 'Message - pythonspot.com', "You typed Blank: " + textboxValue, QMessageBox.Ok, QMessageBox.Ok) self.textbox.setText("") else: QMessageBox.question(self, 'Message - pythonspot.com', "You typed: " + textboxValue, QMessageBox.Ok, QMessageBox.Ok) grafica(textboxValue, data1r, data2r)