コード例 #1
1
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())
コード例 #2
0
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())
コード例 #3
0
    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()
コード例 #4
0
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()
コード例 #5
0
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'])
コード例 #6
0
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()
コード例 #7
0
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_()
コード例 #8
0
ファイル: date.py プロジェクト: sinsy/pythonLearn
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())
コード例 #9
0
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()
コード例 #10
0
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
コード例 #11
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()
コード例 #12
0
ファイル: siacle.py プロジェクト: YaroslavS1/Hotel_DBMS
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)
コード例 #13
0
ファイル: patient.py プロジェクト: tikuma-lsuhsc/openhsv
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())
コード例 #14
0
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()
コード例 #15
0
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_()
コード例 #16
0
ファイル: booklog2.py プロジェクト: yozon/booklog
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'])
コード例 #17
0
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
コード例 #18
0
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()
コード例 #19
0
ファイル: home.py プロジェクト: zizle/mkdecision-client
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()
コード例 #20
0
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)
コード例 #21
0
ファイル: siacle.py プロジェクト: YaroslavS1/Hotel_DBMS
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()
コード例 #22
0
ファイル: db.py プロジェクト: tikuma-lsuhsc/openhsv
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
コード例 #23
0
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_()
コード例 #24
0
ファイル: Base.py プロジェクト: eduardoangelin/GitTest
 def text(self, *args, **kwargs):
     vDate = QDateEdit.text(self, *args, **kwargs)
     [day, month, year] = vDate.split('/')
     vDate = "{}-{}-{}".format(year, month, day)
     return vDate
コード例 #25
0
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)
コード例 #26
0
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
コード例 #27
0
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')
コード例 #28
0
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)
コード例 #29
0
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)
コード例 #30
0
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)
コード例 #31
0
ファイル: booklog2.py プロジェクト: yozon/booklog
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'])
コード例 #32
0
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_()
コード例 #33
0
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)