예제 #1
0
    def __init__(self, iris, chans, start, stop, parent=None):
        QWidget.__init__(self, parent)
        layout = QHBoxLayout(self)
        self._iris = iris
        self._chans = chans
        self._start = start
        self._stop = stop

        self._editWidgets = dict()
        for ch in chans:

            if len(chans) == 1: title = ""
            elif start == 0x011C: title = 'SX' + "RT"[ch]
            else: title = "Ch" + "AB"[ch]
            groupBox = QGroupBox(title, self)
            layout.addWidget(groupBox)
            hbox = QHBoxLayout(groupBox)
            formLayout = QFormLayout()
            hbox.addLayout(formLayout)

            for i, addr in enumerate(range(start, stop + 1)):
                for key, param_addr, bit_start, bit_stop, default, name, desc in PARAMS:
                    if addr != param_addr: continue
                    edit = LowLevelEditWidget(param_addr, bit_start, bit_stop,
                                              default, name, desc, self)
                    edit.setToolTip(desc)
                    if formLayout.count() == 40:
                        formLayout = QFormLayout()
                        hbox.addLayout(formLayout)
                    formLayout.addRow(name, edit)
                    self._editWidgets[(key, ch)] = edit
                    edit.valueChanged.connect(
                        functools.partial(LowLevelControlTab.rmwSetting, iris,
                                          ch, addr, bit_start, bit_stop))
예제 #2
0
class PhasePatternSet(QWidget):
    value_changed = pyqtSignal()

    def __init__(self):
        super().__init__()
        self.layout = QFormLayout()
        self.setLayout(self.layout)

    @pyqtSlot()
    def add_new_phase_pattern(self):
        controller = PhasePatternController()
        controller.value_changed.connect(self.value_changed.emit)
        new_phase_pattern = CloseWrapper(controller)
        new_phase_pattern.close.connect(
            lambda: self.remove_pattern(new_phase_pattern))
        self.layout.addRow(new_phase_pattern)
        self.value_changed.emit()

    def get_values(self):
        return [
            self.layout.itemAt(i).widget().wrapped_widget.get_values()
            for i in range(self.layout.count())
        ]

    def remove_pattern(self, pattern):
        self.layout.removeRow(pattern)
        self.value_changed.emit()
예제 #3
0
class ModelDialog(QDialog):
    """ModelDialog is the basic structure behind model dialogs in CATScore.
    # Arguments
        param_path: String, path to default parameters .json file.
    """
    def __init__(self, param_path={}, parent=None):
        super(ModelDialog, self).__init__(parent)
        self.default_params = self._getParams(param_path)
        print("Default params:")
        print(json.dumps(self.default_params, indent=2))
        self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
        self.buttonBox.setObjectName("model_buttonbox")
        self.buttonBox.accepted.connect(self.accept)
        self.buttonBox.rejected.connect(self.reject)

        self.model_groupbox = QGroupBox()
        self.model_groupbox.setTitle("Model hyperparameters")
        self.tfidf_groupbox = QGroupBox()
        self.tfidf_groupbox.setTitle('TF-IDF hyperparameters')

        self.main_layout = QVBoxLayout()
        self.form_layout = QFormLayout()

        
    def saveParams(self):
        """Saves the parameters entered by the user.  
        """
        print("Default params after save:")
        print(json.dumps(self.default_params, indent=2))
        if (self.exec_() == QDialog.Accepted):
            input_widgets = (self.form_layout.itemAt(i).widget() for i in range(self.form_layout.count()))
            for widget in input_widgets:
                if isinstance(widget, QDoubleSpinBox):
                    print('"' + widget.objectName() + '": {},'.format(widget.value()))
                if isinstance(widget, QComboBox):
                    print('"' + widget.objectName() + '": {},'.format(widget.currentData()))

        else:
            print("Denied!")

    def _getParams(self, path):
        print("Path: {}".format(path))
        svc_params = {
                        "clf__C": 1,
                        "clf__class_weight": None,
                        "clf__kernel": "linear",
                        "clf__tol": 0.001,
                        "clf__cache_size": 200,
                        "tfidf__max_df": 0.5,
                        "tfidf__min_df": 2,
                        "tfidf__ngram_range": [
                            1,
                            2
                        ],
                        "tfidf__stop_words": None,
                        "tfidf__strip_accents": "unicode",
                        "tfidf__use_idf": False
                    }
        return svc_params
예제 #4
0
class ViewportObjectsPane(QWidget):
    def __init__(self, parent):
        super(ViewportObjectsPane, self).__init__(parent)

        self.screen_capture = ScreenCapture()
        self.screen_capture.fire_once(self.on_first_screen_capture)
        self.viewport_objects = ViewportObjects()
        self.viewport_objects.bind(self.on_viewport_object_update)
        self.form_layout = None
        self.dragging_slider = False
        self.object_widgets = {}

        self.init_ui()

    def init_ui(self):
        self.form_layout = QFormLayout()
        self.refresh_objects()
        self.setLayout(self.form_layout)

    def on_first_screen_capture(self, _):
        for _, vp_object in self.object_widgets.items():
            vp_object.update_states()

    def on_viewport_object_update(self, _):
        if not self.dragging_slider:
            self.refresh_objects()

    def refresh_objects(self):
        for i in range(self.form_layout.count()):
            self.form_layout.itemAt(i).widget().deleteLater()
        self.object_widgets = {}

        index = 0
        for vp_object in self.viewport_objects.get():
            name = vp_object.name
            self.object_widgets[name] = ViewportObject(self, vp_object, index, self.on_slider_drag)
            self.form_layout.addRow(self.object_widgets[name])
            index += 1

    def on_slider_drag(self, value):
        self.dragging_slider = value
class Approval(QMainWindow):
    def __init__(self):
        super(Approval, self).__init__()

        self.setWindowTitle("Expedited Approval Tool")
        self.setWindowIcon(QIcon('icon/PS_Icon.png'))

        self.frmMain = QFormLayout()
        #test
        mainLayout = QWidget()
        mainLayout.setLayout(self.frmMain)

        self.setCentralWidget(mainLayout)

        self.formMain()

    def formMain(self):

        leProbSheet = QLineEdit()
        leProbSheet.setMaximumWidth(50)
        self.frmMain.addRow(QLabel("Enter Problem Sheet ID:"), leProbSheet)

        hbShip = self.createRadioGroup("Ship")
        rbtnShipYes = self.rb.get("ShipYes")
        rbtnShipNo = self.rb.get("ShipNo")
        rbtnShipNo.setChecked(True)
        self.frmMain.addRow(
            QLabel(
                "Did you confirm the correct shipping was \n selected and the correct pricing was quoted?"
            ), hbShip)

        hbYY = self.createRadioGroup("YY")
        rbtnYYYes = self.rb.get("YYYes")
        rbtnYYNo = self.rb.get("YYNo")
        rbtnYYNo.setChecked(True)
        self.frmMain.addRow(
            QLabel("Is the order a YY or a non-suspicious NY/YN?"), hbYY)

        hbOver = self.createRadioGroup("Over")
        rbtnOverYes = self.rb.get("OverYes")
        rbtnOverNo = self.rb.get("OverNo")
        rbtnOverNo.setChecked(True)
        self.frmMain.addRow(
            QLabel(
                "Did you override and upgrade the shipping \n in Stone Edge?"),
            hbOver)

        teNotes = QTextEdit()
        teNotes.setMaximumHeight(125)
        self.frmMain.addRow(QLabel("Additional Notes:"))
        self.frmMain.addRow(teNotes)

        btnApprove = QPushButton("Approved")
        btnApprove.clicked.connect(lambda: self.btnApprove_Click(
            leProbSheet.text(), rbtnShipYes.isChecked(), rbtnYYYes.isChecked(),
            rbtnOverYes.isChecked(), teNotes.toPlainText()))

        btnDeny = QPushButton("Not Approved")
        btnDeny.clicked.connect(lambda: self.btnDeny_Click(
            leProbSheet.text(), rbtnShipYes.isChecked(), rbtnYYYes.isChecked(),
            rbtnOverYes.isChecked(), teNotes.toPlainText()))

        btnQuit = QPushButton("Quit")
        btnQuit.clicked.connect(self.btnCancel_Click)

        hbBtnBox = QHBoxLayout()
        hbBtnBox.addWidget(btnApprove)
        hbBtnBox.addWidget(btnDeny)
        hbBtnBox.addWidget(btnQuit)

        self.frmMain.addRow(hbBtnBox)

    def btnApprove_Click(self, probSheetID, correctShip, YYorder, Override,
                         notes):
        ad = ApprovalData()
        eid = ad.checkProbSheet(probSheetID)
        if eid:
            cnt = ad.checkApproved(eid)
        else:
            cnt = 0

        if eid > 0 and cnt == 0:
            try:
                ad.insApproval(probSheetID, eid, 1, correctShip, YYorder,
                               Override, notes)
                ad.updExpedited(eid, 1)
                self.removeWidgets()
                self.formMain()
            except BaseException as e:
                QMessageBox.warning(
                    self, "Database",
                    "There was an issue inserting into the database. \n" +
                    str(e), QMessageBox.Ok)
        else:
            if cnt:
                QMessageBox.warning(
                    self, "Approved",
                    "This problem sheet has already been approved.",
                    QMessageBox.Ok)
            else:
                QMessageBox.warning(
                    self, "Missing",
                    "This problem sheet has not been entered into the system as expedited.",
                    QMessageBox.Ok)

    def btnDeny_Click(self, probSheetID, correctShip, YYorder, Override,
                      notes):
        ad = ApprovalData()
        eid = ad.checkProbSheet(probSheetID)
        if eid:
            cnt = ad.checkApproved(eid)
        else:
            cnt = 0

        if eid > 0 and cnt == 0:
            try:
                ad.insApproval(probSheetID, eid, 0, correctShip, YYorder,
                               Override, notes)
                ad.updExpedited(eid, 0)
                self.removeWidgets()
                self.formMain()
            except BaseException as e:
                QMessageBox.warning(
                    self, "Database",
                    "There was an issue inserting into the database. \n" +
                    str(e), QMessageBox.Ok)
        else:
            if cnt:
                QMessageBox.warning(
                    self, "Approved",
                    "This problem sheet has already been approved.",
                    QMessageBox.Ok)
            else:
                QMessageBox.warning(
                    self, "Missing",
                    "This problem sheet has not been entered into the system as expedited.",
                    QMessageBox.Ok)

    def btnCancel_Click(self):
        sys.exit()

    def createRadioGroup(self, name):
        #create dict items for all of the widgets, and to pull from after creation.
        bg = {}
        self.rb = {}
        hb = {}

        #create the group to hold the button.
        bg[(name)] = QButtonGroup(self)

        #create yes no buttons.
        self.rb[name + "Yes"] = QRadioButton("Yes")
        self.rb[name + "No"] = QRadioButton("No")

        #add buttons to group
        bg[(name)].addButton(self.rb[name + "Yes"])
        bg[(name)].addButton(self.rb[name + "No"])

        #add the whole thing to a Horz. Box layout.
        hb[(name)] = QHBoxLayout()
        hb[(name)].addWidget(self.rb[name + "Yes"])
        hb[(name)].addWidget(self.rb[name + "No"])
        hb[(name)].addStretch()

        #print(self.rb[name+"Yes"].isChecked())

        return hb[(name)]

    def removeWidgets(self):
        for cnt in reversed(range(self.frmMain.count())):
            # takeAt does both the jobs of itemAt and removeWidget
            # namely it removes an item and returns it
            widget = self.frmMain.takeAt(cnt).widget()

            if widget is not None:
                # widget will be None if the item is a layout
                widget.deleteLater()
예제 #6
0
class IntegrateEditor(BaseEditor):
    """
    Editor to integrate defined regions.
    """

    Integrators_classes = Integrate.INTEGRALS
    Integrators = [a.name for a in Integrators_classes]

    def __init__(self, parent=None, **kwargs):
        super().__init__(parent, **kwargs)

        self._limits = []

        self.setLayout(QVBoxLayout())
        self.form_set = QFormLayout()
        self.form_lim = QFormLayout()
        self.layout().addLayout(self.form_set)
        self.layout().addLayout(self.form_lim)

        self.methodcb = QComboBox()
        self.methodcb.addItems(self.Integrators)

        self.form_set.addRow("Integration method:", self.methodcb)
        self.methodcb.currentIndexChanged.connect(self.changed)
        self.methodcb.activated.connect(self.edited)

        self.focusIn = self.activateOptions

        self.add_limit()

        button = QPushButton("Add Region")
        self.layout().addWidget(button)
        button.clicked.connect(self.add_limit)

        self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred)

        self.user_changed = False

    def activateOptions(self):
        self.parent_widget.curveplot.clear_markings()
        for row in range(self.form_lim.count()):
            limitbox = self.form_lim.itemAt(row, 1)
            if limitbox:
                self.parent_widget.curveplot.add_marking(limitbox.line1)
                self.parent_widget.curveplot.add_marking(limitbox.line2)

    def add_limit(self, *args, row=None):
        if row is None:
            row = len(self._limits)
            try:
                self._limits.append(self._limits[-1])
            except IndexError:
                self._limits.append([0., 1.])
        label = "Region {0}".format(row + 1)
        limitbox = LimitsBox(limits=self._limits[row], label=label)
        if self.form_lim.rowCount() < row + 1:
            # new row
            self.form_lim.addRow(limitbox)
        else:
            # row already exists
            self.form_lim.setLayout(row, 2, limitbox)
        limitbox.focusIn = self.activateOptions
        limitbox.valueChanged.connect(self.set_limits)
        limitbox.editingFinished.connect(self.edited)
        limitbox.deleted.connect(self.remove_limit)
        self.edited.emit()
        return limitbox

    def remove_limit(self, limitbox):
        row, role = self.form_lim.getLayoutPosition(limitbox)
        for r in range(row, len(self._limits)):
            limitbox = self.form_lim.itemAt(r, 1)
            limitbox.removeLayout()
        self._limits.pop(row)
        self.set_all_limits(self._limits)

    def set_limits(self, limits, limitbox, user=True):
        if user:
            self.user_changed = True
        row, role = self.form_lim.getLayoutPosition(limitbox)
        if self._limits[row] != limits:
            self._limits[row] = limits
            with blocked(self.form_lim):
                limitbox.lowlime.setValue(limits[0])
                limitbox.highlime.setValue(limits[1])
            self.changed.emit()

    def set_all_limits(self, limits, user=True):
        if user:
            self.user_changed = True
        self._limits = limits
        for row in range(len(limits)):
            limitbox = self.form_lim.itemAt(row, 1)
            if limitbox is None:
                limitbox = self.add_limit(row=row)
            with blocked(limitbox):
                limitbox.lowlime.setValue(limits[row][0])
                limitbox.highlime.setValue(limits[row][1])
        self.changed.emit()

    def setParameters(self, params):
        if params:  # parameters were manually set somewhere else
            self.user_changed = True
        self.methodcb.setCurrentIndex(
            params.get("method",
                       self.Integrators_classes.index(Integrate.Baseline)))
        self.set_all_limits(params.get("limits", [[0., 1.]]), user=False)

    def parameters(self):
        return {"method": self.methodcb.currentIndex(), "limits": self._limits}

    @staticmethod
    def createinstance(params):
        methodindex = params.get(
            "method",
            IntegrateEditor.Integrators_classes.index(Integrate.Baseline))
        method = IntegrateEditor.Integrators_classes[methodindex]
        limits = params.get("limits", None)
        return Integrate(methods=method, limits=limits)

    def set_preview_data(self, data):
        if not self.user_changed:
            x = getx(data)
            if len(x):
                self.set_all_limits([[min(x), max(x)]])
                self.edited.emit()
예제 #7
0
class First(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(First, self).__init__(parent)
        self.title = 'Comic to Text Illustration'
        self.left = 10
        self.top = 10
        self.width = 500
        self.height = 500

        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        # Create textbox
        self.textbox = QLineEdit(self)
        self.textbox.move(20, 20)
        self.textbox.resize(200, 40)

        # add button
        self.addButton = QPushButton('Analyze')
        self.addButton.clicked.connect(self.on_click)
        self.addButton.move(20, 80)

        # del button
        self.delButton = QPushButton('Delete')
        self.delButton.clicked.connect(self.on_click_del)
        self.delButton.move(20, 100)

        # scroll area widget contents - layout
        self.scrollLayout = QFormLayout()

        # scroll area widget contents
        self.scrollWidget = QWidget()
        self.scrollWidget.setLayout(self.scrollLayout)

        # scroll area
        self.scrollArea = QScrollArea()
        self.scrollArea.setWidgetResizable(True)
        self.scrollArea.setWidget(self.scrollWidget)

        # main layout
        self.mainLayout = QVBoxLayout()

        # add all main to the main vLayout
        self.mainLayout.addWidget(self.textbox)
        self.mainLayout.addWidget(self.addButton)
        self.mainLayout.addWidget(self.scrollArea)
        self.mainLayout.addWidget(self.delButton)

        # central widget
        self.centralWidget = QWidget()
        self.centralWidget.setLayout(self.mainLayout)

        # set central widget
        self.setCentralWidget(self.centralWidget)
        
    def on_click(self):
        textObtained = self.textbox.text()
        extraction(textObtained)
        i = 0
        while i < len(fin_list):
        			self.button = QPushButton(str(fin_list[i]))
        			self.scrollLayout.addRow(self.button)
        			i = i + 1

        for j in reversed(range(self.scrollLayout.count())):
                    self.scrollLayout.itemAt(j).widget().clicked.connect(lambda: request())

    def on_click_del(self):
        global k
    	self.textbox.setText("")
    	for i in reversed(range(self.scrollLayout.count())): 
    				self.scrollLayout.itemAt(i).widget().deleteLater()
        fin_list[:] = []
        k = 0
class IPWaveformSelectorWidget(QWidget):

    sig_checkbox_clicked = pyqtSignal(list)

    checkbox_list = []
    name_list = []
    value_list = []

    def __init__(self, parent):
        super().__init__(parent)
        self.parent = parent

        self.buildUI()

    def buildUI(self):

        self.button_group = QButtonGroup()
        self.button_group.setExclusive(False)
        self.button_group.buttonClicked.connect(self.update_what_is_displayed)

        self.title_label = QLabel("Show/Hide")

        self.form_layout = QFormLayout()

        self.tooltip_label = QLabel()
        tooltip_text = 'Note: This is for displaying/hiding plots only.  When you run the beamformer, all traces loaded will be used in the calculation. If you need to delete a trace, do it using the tabs in the trace viewer.'
        self.tooltip_label.setText(tooltip_text)
        self.tooltip_label.setWordWrap(True)

        self.main_layout = QVBoxLayout()
        self.main_layout.addWidget(self.title_label)
        self.main_layout.addLayout(self.form_layout)
        self.main_layout.addStretch()
        self.main_layout.addWidget(self.tooltip_label)

        self.setLayout(self.main_layout)

    def update_selections(self, new_stream):
        # This is called when waveforms are added or removed
        # It updates the items in the checkbox list

        # before we clear everything, lets first record the current elements in the name dictionary
        # so we can keep track of what is currently visible/not visible.  That way we can preserve
        # their settings

        if new_stream is None:
            return  # nothing to do

        previous_name_list = self.name_list.copy()
        previous_value_list = self.value_list.copy()

        # now clear everything
        self.name_list.clear()
        self.value_list.clear()
        self.clear_form()

        for trace in new_stream:
            # All new traces are automatically set to display
            val = True  # default value for a checkbox is True
            if trace.id in previous_name_list:
                # if entry was previously loaded, keep that setting
                idx = previous_name_list.index(trace.id)
                val = previous_value_list[idx]

            # append new info to the name and value lists
            self.name_list.append(trace.id)
            self.value_list.append(val)

            # make a new checkbox and add it to the list
            new_checkbox = QCheckBox()
            self.button_group.addButton(new_checkbox)
            new_checkbox.setChecked(val)
            self.checkbox_list.append(new_checkbox)
            self.form_layout.addRow(trace.id, new_checkbox)

    def clear_form(self):
        self.checkbox_list.clear()
        for row in reversed(range(self.form_layout.count())):
            item = self.form_layout.takeAt(row)
            item.widget().deleteLater()

    @pyqtSlot(QAbstractButton)
    def update_what_is_displayed(self, button):
        # the value list is used by pl_widget to keep track of what is clicked
        for idx, checkbox in enumerate(self.checkbox_list):
            if checkbox is button:
                self.value_list[idx] = checkbox.isChecked()

        # This tells the plotviewer to update which plots to show
        self.parent.pl_widget.draw_plots()

    def get_checkbox_list(self):
        return self.checkbox_list

    def get_value_list(self):
        return self.value_list
예제 #9
0
class EjournalApp(QWidget):
    """
        This app facilitates the markup of journal articles.
        There are two options: Generate the markdown file and Push to Jekyll.
        The first takes user input and formats a markdown file for the user to
        then add additional markup to.
        The second takes a directory and pushes that directory to Jekyll for
        HTML generation.
    """

    '''
     =========Variables for journals==========
     Title of Journal: 			journal_title
     Title of Article: 			art_title
     Journal Volume: 			j_vol
     Journal Issue: 			j_issue
     Season:					j_ssn
     Year:						j_year
     Filename:					j_filename
     Dictionary of Authors:		author_dict
     Article Content:			content
     Article References:		references
    '''

    def __init__(self):
        """
            General layout is established and the create_ui method is invoked
            to initialize the app's UI
        """
        super().__init__()
        self.container = QVBoxLayout(self)

        self.form_widget = QWidget(self)
        self.form_layout = QFormLayout()

        self.layout = QVBoxLayout(self.form_widget)
        self.init_gui = 0
        self.setWindowTitle("Ejournal Editor")
        self.create_ui()

    def clear_layout_except(self, opt_removal=""):
        """
            Clears the UI of every object except for the object passed in as
             a param.
            If no object is passed in, it clears everything.
        """
        # clear the widgets that may be on the form_layout and btn_container
        if opt_removal == '':
            for i in reversed(range(self.form_layout.count())):
                self.form_layout.itemAt(i).widget().deleteLater()
            for i in reversed(range(self.btn_container.count())):
                if self.btn_container.itemAt(i).widget() is None:
                    continue
                else:
                    self.btn_container.itemAt(i).widget().deleteLater()
        else:
            for i in reversed(range(self.form_layout.count())):
                if self.form_layout.itemAt(i).widget().whatsThis() == \
                opt_removal:
                    continue
                else:
                    self.form_layout.itemAt(i).widget().deleteLater()

    def generate_md(self):
        """
            This method is invoked after the user has entered the references.
            It creates a MDGenerator Class object and invokes its
            generate_md_file method, which creates the Markdown
            file.
        """
        self.references = self.ref_tb.toPlainText()
        j_file_generator = MdGenerator(self.journal_title, self.art_title,
         self.j_vol, self.j_issue, self.j_ssn, self.j_year, self.j_filename,
         self.author_dict, self.content, self.references)
        j_file_generator.generate_md_file()

        notice = QMessageBox.information(self,
         'Notice', "{}.md was created".format(self.j_filename.lower()),
                                         QMessageBox.Ok)

    def add_ref(self):
        """
            This method generates a text area in which the user will input the
            article's references
        """
        # Sets the content to a global variable
        self.content = self.content_tb.toPlainText()
        self.clear_layout_except("back_btn")
        # instructions for the user on signifiers for the MDGenerator class
        ref_lb = QLabel("""Copy and paste references below.\n\n
            Formatting Key:\n\n
            Reference:\t\tr[*]]
            """)
        self.ref_tb = QTextEdit()
        self.ref_tb.setAcceptRichText(True)

        self.ref_tb.setMinimumSize(400, 400)
        submit_btn = QPushButton("Submit and Generate MD File")
        submit_btn.clicked.connect(self.generate_md)

        self.form_layout.addRow(ref_lb)
        self.form_layout.addRow(self.ref_tb)
        self.form_layout.addRow(submit_btn)

    def add_content(self):
        """
            This method generates a text area in which the user will input
            the article content
        """
        self.clear_layout_except("back_btn")
        # instructions for the user on signifiers for the MDGenerator class
        content_lb = QLabel()
        if self.j_filename == "clip":
            content_lb.setText("""Copy and paste content below.\n\n
            Formatting Key:\n\n
            Book title:\t\t=\n
            By-line:\t\t==\n
            Genres:\t\t-=\n
            Publisher:\t\t===\n
            ISBN:\t\t-==\n
            Entire body:\t>>*<<\n\n
            If the body contains multiple paragraphs, each paragraph after the
first gets this put before it:\n
            \t\tp[\n\n
            * Represents the content\n\n
            Signature:\n
            Name:\t\t;=\n
            Location:\t\t;==
            """)
        else:
            content_lb.setText("""Copy and paste content below.\n\n
            Formatting Key:\n\n
            Paragraph:\t\tp[\n
            Paragraph with bigFirst:\tpb[\n
            Section header:\t\th[*]\n
            Blockquote:\t\tq[*]\n\n

            * Represents the content
            """)
        self.content_tb = QTextEdit()
        self.content_tb.setAcceptRichText(True)

        self.content_tb.setMinimumSize(400, 400)
        submit_btn = QPushButton("Submit")
        submit_btn.clicked.connect(self.add_ref)

        self.form_layout.addRow(content_lb)
        self.form_layout.addRow(self.content_tb)
        self.form_layout.addRow(submit_btn)

    def author_validation(self):
        """
            Validation check for author input.
            Displays an appropriate error to the error_lb if not valid.
        """
        valid = False
        for i in range(int(self.author_cb.currentText())):
            if eval('self.firstname_le{}.text().strip() == ""'.format(i)) \
                    or \
                    eval('self.lastname_le{}.text().strip() == ""'.format(i)):
                self.error_lb.setText("First and last names cannot be blank")
                break
            elif self.journal_title == \
            "JCTE" and eval('self.affil_le{}.text().strip() == ""'.format(i)):
                self.error_lb.setText("Affiliation cannot be blank")
                break
            else:
                if i == int(self.author_cb.currentText()) - 1:
                    valid = True
        # when the form passes validation, the author's names and their
        # affiliation, if JCTE, are added to dictionaries
        if valid:
            self.author_dict = dict()
            if "Clip" in self.art_title:
            # currently, ALAN's Clip&File
            # has an author, but the filename is clip
                self.j_filename = "clip"
            else:
                self.j_filename = self.lastname_le0.text().strip()
            for i in range(int(self.author_cb.currentText())):
                auth_name = eval('" ".join((self.prefix_le{}.text(), \
                 self.firstname_le{}.text(),'.format(i, i)
                + 'self.middle_le{}.text())).strip()'.format(i))
                auth_name = eval('" ".join((auth_name, \
                 self.suffix_cb{}.currentText())).strip()'.format(i))
                auth_name = eval('", ".join((self.lastname_le{}.text(),\
                 auth_name))'.format(i))
                if self.journal_title == "JCTE":
                    self.author_dict[i] = \
                    (eval('self.affil_le{}.text().strip()'.format(i)),\
                     auth_name)
                else:
                    self.author_dict[i] = auth_name
            self.add_content()

    def update_authors(self):
        """
            This method does the heavy-lifting for the author building.
            It's called every time the value in the author_cb changes.
        """
        # sets tuple to hold acceptable suffixes
        self.suffixes = (" ", "CPA", "D.C.", "D.D.", "D.D.S.", "D.M.D.",
        "D.O.", "D.V.M.", "Ed.D.", "Esq.", "II", "III", "IV", "J.D.", "Jr.",
        "LL.D.", "M.D.", "O.D.", "Ph.D.", "R.N.", "R.N.C.", "Sr.")

        self.clear_layout_except("author_cb")
        # iterates through based on the value of author_cb,
        # creating i number of author input sections
        for i in range(int(self.author_cb.currentText())):
            self.prefix_lb = QLabel("Prefix: ")
            # exec and eval functions are called to insert string
            # formatting into variables b/c of iteration
            exec('self.prefix_le{} = QLineEdit()'.format(i))
            exec('self.prefix_le{}.setMinimumSize(300, 10)'.format(i))

            self.firstname_lb = QLabel("First name: ")
            exec('self.firstname_le{} = QLineEdit()'.format(i))
            exec('self.firstname_le{}.setMinimumSize(300, 10)'.format(i))

            self.middle_lb = QLabel("Middle name: ")
            exec('self.middle_le{} = QLineEdit()'.format(i))
            exec('self.middle_le{}.setMinimumSize(300, 10)'.format(i))

            self.lastname_lb = QLabel("Last name: ")
            exec('self.lastname_le{} = QLineEdit()'.format(i))
            exec('self.lastname_le{}.setMinimumSize(300, 10)'.format(i))

            self.suffix_lb = QLabel("Suffix: ")
            exec('self.suffix_cb{} = QComboBox()'.format(i))
            exec('self.suffix_cb{}.setMinimumSize(300, 10)'.format(i))
            for suffix in self.suffixes:
                eval('self.suffix_cb{}'.format(i)).addItem(suffix)

            self.spacer_lb = QLabel("--------------------------")
            # Creates Afiliations section if the journal is JCTE
            if self.journal_title == "JCTE":
                self.affil_lb = QLabel("Affiliations:")
                exec('self.affil_le{} = QLineEdit()'.format(i))
                exec('self.affil_le{}.setMinimumSize(300, 10)'.format(i))

            self.spacer_lb.setMinimumSize(300, 10)

            exec('self.form_layout.addRow(self.prefix_lb,\
             self.prefix_le{})'.format(i))
            exec('self.form_layout.addRow(self.firstname_lb,\
             self.firstname_le{})'.format(i))
            exec('self.form_layout.addRow(self.middle_lb,\
             self.middle_le{})'.format(i))
            exec('self.form_layout.addRow(self.lastname_lb,\
             self.lastname_le{})'.format(i))
            exec('self.form_layout.addRow(self.suffix_lb,\
             self.suffix_cb{})'.format(i))
            self.form_layout.addRow(self.spacer_lb)
            # JCTE has special affiliations field for its authors
            if self.journal_title == "JCTE":
                exec('self.form_layout.addRow(self.affil_lb,\
                 self.affil_le{})'.format(i))
                self.form_layout.addRow(self.spacer_lb)

        content_btn = QPushButton("Add content")
        content_btn.clicked.connect(self.author_validation)

        self.error_lb = QLabel("")
        self.error_lb.setMinimumSize(300, 10)
        self.form_layout.addRow(self.error_lb)
        self.form_layout.addRow(content_btn)

    def add_authors(self):
        """
            Method that builds the screen and dropdown combobox for the authors
        """
        self.clear_layout_except("back_btn")

        self.author_cb = QComboBox()
        for i in range(1, 11):
            i = str(i)
            self.author_cb.addItem(i)

        self.author_cb.setWhatsThis("author_cb")

        self.form_layout.addRow(self.author_cb)
        # initial call to update_authors sets the screen up for one author
        self.update_authors()
        # this line watches for the value to change in the dropdown combobox
        # if it does change, update_authors is called again to
        # build screen based on new number of authors
        self.author_cb.activated[str].connect(self.update_authors)

    def metadata_validate(self, has_authors=True):
        """
            Method to validate article metadata
        """
        valid = False
        # Place variables in tuple for validation
        data = (
            self.title_le.text().strip(),
            self.vol_cb.currentText(),
            self.issue_cb.currentText(),
            self.ssn_cb.currentText(),
            self.year_cb.currentText()
        )

        for d in data:
            if d == "":  # Checks for blanks
                self.error_lb.setText("No field can be left blank.")
                break
            # Each of the following checks for inputs that are not an option
            elif data.index(d) == 1 and self.vol_cb.findText(d) == -1:
                self.error_lb.setText("Please select a volume from the list.")
                break
            elif data.index(d) == 2 and self.issue_cb.findText(d) == -1:
                self.error_lb.setText("Please select an issue from the list.")
                break
            elif data.index(d) == 3 and self.ssn_cb.findText(d) == -1:
                self.error_lb.setText("Please select a season from the list.")
                break
            elif data.index(d) == 4 and self.year_cb.findText(d) == -1:
                self.error_lb.setText("Please select a year from the list.")
                break
            else:
                if data.index(d) == 4:  # if all checks pass and it's the last
                # item in the list, validate the data
                    valid = True

        if valid:  # if the data are valid
            self.art_title = data[0]
            self.j_vol = data[1]
            self.j_issue = data[2]
            self.j_ssn = data[3]
            self.j_year = data[4]
            if has_authors:
                self.add_authors()
            else:
                self.author_dict = dict()  # set the author var to empty
                if "Clip" in self.art_title:
                    self.j_filename = "clip"
                elif "Editor" in self.art_title:
                    self.j_filename = "editors"
                elif "Manuscript" in self.art_title:
                    self.j_filename = "manuscript"
                elif "Misc" in self.art_title:
                    self.j_filename = "miscellany"
                elif "Instruction" in self.art_title:
                    self.j_filename = "authors"
                elif "Guideline" in self.art_title:
                    self.j_filename = "guidelines"
                elif "Stories" in self.art_title:
                    self.j_filename = "stories"
                self.add_content()

    def show_journal_metadata(self, journal_title):
        """
            Second screen user is presented.
            It takes the title of the Journal as a param to set it globally
            after the corresponding btn was chosen on the previous
            screen--in the show_journal_chooser method.
        """
        self.clear_layout_except("back_btn")
        self.journal_title = journal_title
        issue_range = ("1", "2", "3", "4")
        seasons = ("Fall", "Winter", "Spring", "Summer")

        header_lb = QLabel(self.journal_title + " Issue Metadata")
        title_lb = QLabel("Title: ")
        self.title_le = QLineEdit()
        self.title_le.setMinimumSize(300, 10)

        vol_lb = QLabel("Volume: ")
        self.vol_cb = QComboBox()
        self.vol_cb.setEditable(True)
        # set autocompleters
        self.vol_cb.completer().setCompletionMode(QCompleter.PopupCompletion)
        self.vol_cb.setMinimumSize(300, 10)
        for i in range(1, 201):
            i = str(i)
            self.vol_cb.addItem(i)

        issue_lb = QLabel("Issue: ")
        self.issue_cb = QComboBox()
        self.issue_cb.setEditable(True)
        self.issue_cb.completer().setCompletionMode(QCompleter.PopupCompletion)
        self.issue_cb.setMinimumSize(300, 10)
        for i in issue_range:
            self.issue_cb.addItem(i)

        ssn_lb = QLabel("Season: ")
        self.ssn_cb = QComboBox()
        self.ssn_cb.setEditable(True)
        self.ssn_cb.completer().setCompletionMode(QCompleter.PopupCompletion)
        self.ssn_cb.setMinimumSize(300, 10)
        for ssn in seasons:
            self.ssn_cb.addItem(ssn)

        year_lb = QLabel("Year: ")
        self.year_cb = QComboBox()
        self.year_cb.setEditable(True)
        self.year_cb.completer().setCompletionMode(QCompleter.PopupCompletion)
        self.year_cb.setMinimumSize(300, 10)
        for i in range(1900, 2101):
            i = str(i)
            self.year_cb.addItem(i)

        authors_btn = QPushButton("Add Authors", self)
        no_authors_btn = QPushButton("No Authors", self)

        self.error_lb = QLabel("")  # error label

        authors_btn.clicked.connect(partial(self.metadata_validate, True))
        no_authors_btn.clicked.connect(partial(self.metadata_validate, False))

        self.form_layout.addRow(header_lb)
        self.form_layout.addRow(title_lb, self.title_le)
        self.form_layout.addRow(vol_lb, self.vol_cb)
        self.form_layout.addRow(issue_lb, self.issue_cb)
        self.form_layout.addRow(ssn_lb, self.ssn_cb)
        self.form_layout.addRow(year_lb, self.year_cb)
        self.form_layout.addRow(authors_btn)
        self.form_layout.addRow(no_authors_btn)
        self.form_layout.addRow(self.error_lb)

    def show_journal_chooser(self):
        """
            First metadata option for user when generation MD file
        """
        self.clear_layout_except("back_btn")
        self.journalList = ('ALAN', 'JCTE', 'JOTS', 'JTE', 'VALib')

        for journal in self.journalList:
            btn = QPushButton(journal, self)
            btn.setMinimumSize(300, 40)
            btn.setMaximumSize(300, 40)
            btn.setWhatsThis(journal)
            btn.clicked.connect(partial(self.show_journal_metadata, journal))
            self.form_layout.addRow(btn)

        self.btn_container = QHBoxLayout()
        self.btn_container.addStretch(1)
        self.back_btn = QPushButton("Back to options", self)
        self.back_btn.setWhatsThis("back_btn")
        self.back_btn.setMinimumSize(150, 40)
        self.back_btn.setMaximumSize(150, 40)

        self.back_btn.clicked.connect(self.create_ui)

        self.btn_container.addWidget(self.back_btn)
        # Back button is added to the container
        # it remains unless a complete reset of the UI is called
        self.layout.addLayout(self.btn_container)

    def show_directory_chooser(self):
        """
            Opens a directory browser for the user to choose the dir containing
            the MD files.
            Once a directory is chosen, it is passed on to a Jekyll Class
            Object, which generates the HTMl via the Ruby Jekyll Generator
            (not to be confused with the Jekyll Class Object created by
            this program).
        """
        user = os.getlogin()
        md_directory = QFileDialog.getExistingDirectory(None, 'Select folder:',
         '/Users/' + user + '/Desktop', QFileDialog.ShowDirsOnly)

        # Creates a Jekyll object and generates the HTML files
        if md_directory:
            jekyll = Jekyll(md_directory)
            jekyll.serve_html_files()

            notice = QMessageBox.information(self, 'Notice',
             "HTML files were generated", QMessageBox.Ok)
            del jekyll

    def create_ui(self):
        """
            Sets up the main UI screen for the App.
        """
        # If first time, added everything to the layout
        if self.init_gui == 0:
            self.md_btn = QPushButton('Generate the Markdown file', self)
            self.jekyll_btn = QPushButton('Push to Jekyll', self)

            self.md_btn.setMinimumSize(300, 40)
            self.md_btn.setMaximumSize(300, 40)

            self.jekyll_btn.setMinimumSize(300, 40)
            self.jekyll_btn.setMaximumSize(300, 40)

            self.md_btn.clicked.connect(self.show_journal_chooser)
            self.jekyll_btn.clicked.connect(self.show_directory_chooser)
            self.form_layout.addRow(self.md_btn)
            self.form_layout.addRow(self.jekyll_btn)

            self.setMinimumSize(800, 700)

            self.scroll_area = QScrollArea()
            self.scroll_area.setWidgetResizable(True)

            self.container.addWidget(self.scroll_area)

            self.layout.addLayout(self.form_layout)

            self.scroll_area.setWidget(self.form_widget)

            self.init_gui = 1
        # i.e., Back to Options button has been pressed, re-init the UI
        else:
            self.clear_layout_except()
            self.md_btn = QPushButton('Generate the Markdown file', self)
            self.jekyll_btn = QPushButton('Push to Jekyll', self)

            self.md_btn.setMinimumSize(300, 40)
            self.md_btn.setMaximumSize(300, 40)

            self.jekyll_btn.setMinimumSize(300, 40)
            self.jekyll_btn.setMaximumSize(300, 40)

            self.md_btn.clicked.connect(self.show_journal_chooser)
            self.jekyll_btn.clicked.connect(self.show_directory_chooser)
            self.form_layout.addRow(self.md_btn)
            self.form_layout.addRow(self.jekyll_btn)

            self.setMinimumSize(800, 700)

        self.show()
예제 #10
0
class MainLayout:
    def __init__(self):

        self.parameters = {}
        self.main = QVBoxLayout()
        container = QHBoxLayout()
        self.opf = QFormLayout()

        title = QLabel("Set Operational Parameters")
        title.setFont(QFont('Helvetica', 14))
        title.setAlignment(Qt.AlignCenter)
        self.opf.addRow(title)
        self.opf.setVerticalSpacing(20)
        ops = [('Nm', "Speed of Motor", '1450'), ('Nd', "Speed of Digester Shaft", '109'),
               ('Nc', "Speed of Cake Breaker Shaft", '109'), ('Na', "Speed of Auger Shaft", '218'),
               ('Nsp', "Speed of Screw Press Shaft", '60')]
        self.defaults = QPushButton('Clear')
        self.defaults.setToolTip('Toggle this button to use optimized values for Operational Parameters')
        self.defaults.setCheckable(1)
        self.defaults.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum)
        self.defaults.toggled.connect(self._defaults)
        dl = QLabel('Reset')
        dl.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum)
        for op in ops:
            opp = QLineEdit()
            opp.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum)
            opp.setText(op[2])
            lb = QLabel(op[1])
            lb.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum)
            opp.setPlaceholderText(op[1])
            opp.setObjectName(op[1])
            opp.setAccessibleName(op[0])
            opp.setInputMask('>0000;_')
            self.opf.addRow(lb, opp)
        self.opf.addRow(dl, self.defaults)

        frame = QFrame()
        frame.setLayout(self.opf)
        frame.setObjectName('opf')

        # Layout for Throughput input
        tpf = QVBoxLayout()
        self.capacity = QLineEdit()
        self.capacity.setAlignment(Qt.AlignLeft | Qt.AlignCenter)
        self.capacity.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum)
        dv = DV(280, 5650, 3, self.capacity)
        dv.setNotation(DV.StandardNotation)
        self.capacity.setValidator(dv)
        self.capacity.setPlaceholderText('Enter value between 280 and 5650')
        title = QLabel("Set Throughput Capacity")
        title.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum)
        title.setFont(QFont('Helvetica', 14))
        title.setAlignment(Qt.AlignLeft | Qt.AlignCenter)
        tpf.addWidget(title)
        tpf.addSpacing(15)
        tpf.addWidget(self.capacity)
        tpf.setAlignment(Qt.AlignLeft | Qt.AlignCenter)
        frame1 = QFrame()
        frame1.setLayout(tpf)
        frame1.setObjectName('tpf')

        container.addWidget(frame1)
        container.addSpacing(50)
        container.addWidget(frame)

        self.bs = QHBoxLayout()
        self.compute = QPushButton('Compute')
        self.compute.setCheckable(True)
        self.compute.clicked.connect(self.run)

        self.reset = QPushButton('Reset')
        self.reset.setCheckable(True)
        self.reset.clicked.connect(self._reset)
        self.reset.setEnabled(False)

        self.report = QPushButton('Generate Report')
        self.report.setCheckable(True)
        self.report.clicked.connect(self._generate)
        self.report.setEnabled(False)

        self.bs.addWidget(self.compute)
        self.bs.setSpacing(15)
        self.bs.addWidget(self.report)
        self.bs.addWidget(self.reset)
        self.bs.setAlignment(Qt.AlignCenter | Qt.AlignBottom)

        self.main.addLayout(container)
        self.main.addSpacing(20)
        self.main.addLayout(self.bs)

        mframe = QFrame()
        mframe.setLayout(self.main)
        mframe.setObjectName('main')
        mframe.setFrameShape(QFrame.StyledPanel)
        mframe.setFrameStyle(QFrame.Raised | QFrame.Panel)
        mframe.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum)

        ml = QVBoxLayout()
        ml.addWidget(mframe)
        ml.setAlignment(Qt.AlignCenter | Qt.AlignTop)

        self.tabs = QTabWidget()
        self.tabs.setTabPosition(QTabWidget.North)
        self.tabs.setMovable(True)

        self.widget = QWidget()
        self.widget.setObjectName('mainf')
        self.widget.setContentsMargins(0, 50, 0, 0)
        self.widget.setLayout(ml)
        self.tabs.insertTab(0, self.widget, 'Results')

    def _defaults(self, s):
        dp = {'Nm': '1450', 'Nd': '109', 'Nc': '109', 'Na': '218', 'Nsp': '60'}
        num = self.opf.count()
        if s:
            self.defaults.setText('Defaults')
        else:
            self.defaults.setText('Clear')
        for i in range(num):
            child = self.opf.itemAt(i).widget()
            if isinstance(child, QLineEdit):
                if s:
                    child.setText('')
                else:
                    child.setText(dp[child.accessibleName()])

    def _generate(self):
        path = homedir('m')
        path = str(path / self.parameters['filename'])
        file, _ = QFileDialog.getSaveFileName(self.report, 'Save Manual', path, "PDF Format (*.pdf)")

        if file:
            BuildDoc(self.parameters, file)

    def run(self, s):
        res = self.validate()
        if res['status']:
            tpd, op = res['results'][0], res['results'][1:]
            output = model(tpd, op)
            self.parameters = format_results(output, tpd)
            self.buiildTables()
            self.showImages()
            self.compute.setDisabled(True)
            self.reset.setEnabled(True)
            self.report.setEnabled(True)
        else:
            self.msgBox(res['err'])

    def _reset(self, r):
        self.compute.setDisabled(False)
        while self.tabs.count() > 1:
            self.tabs.removeTab(1)
        self.reset.setEnabled(False)
        self.report.setEnabled(False)

    def validate(self):
        err = ''
        inputs = []
        try:
            if (i := self.capacity.text()) and (280 <= int(i) <= 5650):
                inputs.append(int(i))
            else:
예제 #11
0
class ChoicesDialog(QDialog):
    """
    Choices dialog allows the user to customize editable fields before generating the SW robot.
    """
    def __init__(self, df: pandas.DataFrame):
        """

        :param df: low level dataframe of decided trace or most frequent routine
        """
        
        # flags = Qt.Window | Qt.WindowTitleHint | Qt.CustomizeWindowHint
        super(ChoicesDialog, self).__init__()
        self.setWindowTitle("Choices")

        # self.setMaximumWidth(1000)
        # self.setMaximumHeight(600)
        if WINDOWS:
            self.setFixedWidth(1000)
        else:
            self.setFixedWidth(750)

        self.df = df

        # remove empty clipboard items
        for row_index, row in self.df.iterrows():
            e = row['concept:name']
            if (e in ['cut', 'copy', 'paste']) and utils.removeWhitespaces(row['clipboard_content']) == '':
                self.df = self.df.drop(row_index)

        # take selected event names
        mask1 = self.df['concept:name'].isin(
            ['changeField',
             'editCell', 'editCellSheet', 'editRange',
             'created', 'moved', 'Unmount', 'hotkey', 'copy']
        )
        # exclude paste in browser, take only paste in OS, do not consider cut or copy
        mask2 = ((self.df['concept:name'] == 'paste') & (self.df['category'] != 'Browser'))
        self.filtered_df = self.df[mask1 | mask2]

        if not self.filtered_df.empty:

            buttonBox = QDialogButtonBox(QDialogButtonBox.Ok)
            buttonBox.accepted.connect(self.handleReturn)
            if darkdetect.isDark():
                buttonBox.setStyleSheet('QPushButton {background-color: #656565;}')

            formGroupBox = QGroupBox()
            self.layout = QFormLayout()
            self.addRows()
            formGroupBox.setLayout(self.layout)

            scroll = QScrollArea()
            scroll.setWidget(formGroupBox)
            scroll.setMaximumHeight(600)
            scroll.setMaximumWidth(1000)

            mainLayout = QVBoxLayout()
            mainLayout.addWidget(QLabel("Change input variables before generating RPA script"))
            mainLayout.addWidget(scroll)
            mainLayout.addWidget(buttonBox)

            self.setLayout(mainLayout)

        else:
            buttonBox = QDialogButtonBox(QDialogButtonBox.Ok)
            buttonBox.accepted.connect(self.accept)
            layout = QVBoxLayout(self)
            layout.addWidget(QLabel("Most frequent trace does not contain editable fields.\n"
                                    "Press OK to generate RPA script."))
            layout.addWidget(buttonBox)
            self.setLayout(layout)

    def addRows(self):
        """
        Add editable rows to custom dialog, such as typing in a web page, renaming a file or pasting a text.

        For each row there is a label, the description of the field, and a value, the element to be edited
        """
        for row_index, row in self.filtered_df.iterrows():
            e = row["concept:name"]
            url = utils.getHostname(row['browser_url'])
            app = row['application']
            label = ""
            value = ""

            if e == "changeField":
                tags = list({row['tag_type'], row['tag_category'].lower(), row['tag_name']})
                label = f"[{app}] Write in {' '.join(tags)} on {url}:"
                value = row['tag_value'].replace('\n', ', ')
            elif e in ["editCell", "editCellSheet", "editRange"]:
                label = f"[Excel] Edit cell {row['cell_range']} on {row['current_worksheet']} with value:"
                value = row['cell_content']
            elif e in ["moved", "Unmount", "created"]:
                path = row['event_dest_path'] if e == "moved" else row['event_src_path']
                _, extension = ntpath.splitext(path)
                if extension:
                    if e == 'created':
                        label = f"[OS] Create new file:"
                    else:
                        label = f"[OS] Rename file as:"
                else:
                    if e == 'created':
                        label = f"[OS] Create new folder:"
                    else:
                        label = f"[OS] Rename folder as:"
                value = path
            elif e in ["copy", "cut", "paste"]:
                cb = utils.removeWhitespaces(row['clipboard_content'])
                label = f"[{app}] Copy and Paste:"
                value = cb
            elif e == 'hotkey':
                if 'hotkey' in self.df.columns:
                    hotkey = row['hotkey']
                else:
                    hotkey = row['id']
                label = f"[{app if app else 'Operating System'}] Hotkey:"
                value = hotkey

            if label != "" and value != "":
                lineEdit = QLineEdit(value)
                lineEdit.setMinimumWidth(270)
                self.layout.addRow(QLabel(label), lineEdit)
            else:
                # remove rows with empty fields from filtered dataframe so it's equal to the dialog shown
                self.filtered_df = self.filtered_df.drop(row_index)

    def handleReturn(self):
        """
        Called when choices dialog is closed (OK button is pressed)

        Each row of the dataframe in input is updated with the values inserted by the user.
        """

        # close dialog
        self.accept()

        # edit original dataframe with new values

        # get list of values inserted in QLineEdit, like ['aspirapolvere', 'tavolo', 'sedie']
        widgets = (self.layout.itemAt(i).widget() for i in range(self.layout.count()))
        new_values = [widget.text() for widget in widgets if isinstance(widget, QLineEdit)]
        # To know which lines I need to change in the dataframe, I loop in a subset of the current dataframe
        # I take only the rows that may have been modified above, like the ones where changeField is, into filtered_df
        # Then I iterate through these rows, taking note also of the current iteration
        # 'i' is the current iteration (like 0,1,2) while row_index is the index of the row that I need to modify
        # (like 0,3,6)
        for i, (row_index, row) in enumerate(self.filtered_df.iterrows()):
            try:
                e = row["concept:name"]
                if e == "changeField":
                    self.df.loc[row_index, 'tag_value'] = new_values[i]
                elif e in ["editCell", "editCellSheet", "editRange"]:
                    self.df.loc[row_index, 'cell_content'] = new_values[i]
                elif e in ["moved", "Unmount", "created"]:
                    path = 'event_dest_path' if e == "moved" else 'event_src_path'
                    self.df.loc[row_index, path] = new_values[i]
                elif e in ["copy", "cut", "paste"]:
                    self.df.loc[row_index, 'clipboard_content'] = new_values[i]
                elif e == "hotkey":
                    col = 'hotkey' if 'hotkey' in self.df.columns else 'id'
                    self.df.loc[row_index, col] = new_values[i]
            except Exception:
                pass

        # self.df.to_csv('/Users/marco/Desktop/temp2.csv', encoding='utf-8-sig', index=False)

    def getDF(self):
        """
        Get edited dataframe

        :return: dataframe of trace with user edits
        """
        # self.df.to_csv('/Users/marco/Desktop/temp.csv', encoding='utf-8-sig', index=False)
        return self.df
예제 #12
0
class AppWindows(QWidget):
    def __init__(self):
        super().__init__()
        # 设置窗口标题及图标
        self.setWindowTitle('Amazon商品信息分析')
        self.setWindowIcon(QIcon('icon.ico'))

        self.current_page = 1
        self.results = None
        self.len = None

        self.Q = Manager().Queue()
        self.p = None
        self.log_thread = LogThread(self)

        # 设置窗口居中显示
        fg = self.frameGeometry()
        fg.moveCenter(QDesktopWidget().availableGeometry().center())
        self.move(fg.topLeft())
        # 固定窗口大小
        self.setFixedSize(1200, 675)
        # self.setBaseSize(1200, 675)
        # 添加水平主布局
        self.main_layout = QHBoxLayout(self)
        # 设置四周margin
        self.main_layout.setContentsMargins(0, 0, 0, 0)
        # 设置控件间间距
        self.main_layout.setSpacing(0)
        # 初始化控制窗口
        self.__init_control_widget()
        # 初始化显示窗口
        self.__init_show_widget()
        self.show()

    # 控制窗口控件
    def __init_control_widget(self):
        self.control_widget = QWidget()
        control_layout = QFormLayout(self.control_widget)
        control_layout.setFormAlignment(Qt.AlignCenter)
        control_layout.setSpacing(30)
        self.control_widget.setFixedWidth(400)
        # self.control_widget.setStyleSheet('QWidget{background-color:blue}')
        self.main_layout.addWidget(self.control_widget, alignment=Qt.AlignLeft)

        search_widget = QWidget()
        search_layout = QHBoxLayout(search_widget)
        search_label = QLabel()
        search_label.setText('搜索关键字')
        self.search_editer = QLineEdit()
        self.search_editer.setPlaceholderText('亚马逊搜索关键字')
        # self.search_editer.setFixedHeight(0)
        search_layout.addWidget(search_label)
        search_layout.addWidget(self.search_editer)

        keywords_widget = QWidget()
        keywords_layout = QHBoxLayout(keywords_widget)
        keywords_label = QLabel()
        keywords_label.setText('筛选关键字')
        self.keywords_editer = QLineEdit()
        self.keywords_editer.setPlaceholderText('请用;分隔搜索关键字')
        keywords_layout.addWidget(keywords_label)
        keywords_layout.addWidget(self.keywords_editer)

        select_widget = QWidget()
        select_layout = QHBoxLayout(select_widget)
        self.jp_amazon = QRadioButton('日本亚马逊')
        self.us_amazon = QRadioButton('美国亚马逊')
        self.jp_amazon.setChecked(True)
        select_layout.addWidget(self.jp_amazon)
        select_layout.addWidget(self.us_amazon)

        button_widget = QWidget()
        button_layout = QHBoxLayout(button_widget)
        self.clean_btn = QPushButton('清除')
        self.clean_btn.clicked.connect(self.__clean)
        self.search_btn = QPushButton('搜索')
        self.search_btn.clicked.connect(self.__search)
        button_layout.addWidget(self.clean_btn)
        button_layout.addWidget(self.search_btn)

        control_layout.addWidget(search_widget)
        control_layout.addWidget(keywords_widget)
        control_layout.addWidget(select_widget)
        control_layout.addWidget(button_widget)

    # 显示窗口控件

    def __init_show_widget(self):
        self.show_widget = QTabWidget()
        self.show_widget.setFixedWidth(800)
        # self.show_widget.setStyleSheet('QWidget{background-color:red}')
        self.main_layout.addWidget(self.show_widget, alignment=Qt.AlignLeft)
        self.__init_log_widget()
        self.__init_result_widget()

    # 日志窗口控件

    def __init_log_widget(self):
        self.log_widget = QWidget()
        self.log_text = QTextBrowser(self.log_widget)
        self.log_text.resize(793, 650)
        self.show_widget.addTab(self.log_widget, "日志")

    # 结果窗口控件
    def __init_result_widget(self):
        self.tab = QWidget()
        self.tab_layout = QVBoxLayout(self.tab)
        self.result_widget = QWidget()
        self.page_widget = QWidget()
        self.page_layout = QHBoxLayout(self.page_widget)

        self.pre_btn = QPushButton('上一页')
        self.pre_btn.clicked.connect(lambda: self.__change_page('pre'))
        self.current_page_label = QLabel('1')
        self.next_btn = QPushButton('下一页')
        self.next_btn.clicked.connect(lambda: self.__change_page('next'))

        self.result_layout = QFormLayout(self.result_widget)
        self.result_layout.setFormAlignment(Qt.AlignTop)
        self.tab_layout.addWidget(self.result_widget, alignment=Qt.AlignTop)
        self.tab_layout.addWidget(self.page_widget, alignment=Qt.AlignBottom)
        # self.result_text = QTextBrowser(self.result_widget)
        # self.result_text.resize(793, 650)
        # setStyleSheet("QTextBrowser{border-width:0;border-style:outset}");
        self.show_widget.addTab(self.tab, "结果")

        self.page_layout.addWidget(self.pre_btn, alignment=Qt.AlignCenter)
        self.page_layout.addWidget(self.current_page_label,
                                   alignment=Qt.AlignCenter)
        self.page_layout.addWidget(self.next_btn, alignment=Qt.AlignCenter)

        # self.results = filter_results(iPhone SE;Qi充電;第2世代;米軍MIL規格取得
        #     ['iPhone SE', 'Qi充電', '第2世代', '米軍MIL規格取得'])

    def closeEvent(self, event):
        if self.p:
            self.p.terminate()
        if self.log_thread:
            self.log_thread.terminate()

    def show_result(self, show, count):
        self.len = count
        self.current_page_label.setText('{}/{}'.format(
            str(self.current_page), str(ceil(self.len / 10))))
        for item in show:
            commodity = Commodity(item['name'], item['page_index'],
                                  item['page_link'], item['commodity_link'])
            self.result_layout.addWidget(commodity)

    @pyqtSlot()
    def __search(self):
        # 获取所要搜索的商品名称
        self.current_page = 1
        self.current_page_label.setText('')
        self.log_text.setText('')
        for i in range(self.result_layout.count()):
            self.result_layout.itemAt(i).widget().deleteLater()

        search = self.search_editer.text()
        self.keywords = self.keywords_editer.text().split(';')
        # 判断选择的网址
        website = 'jp' if self.jp_amazon.isChecked() == True else 'us'
        self.Q.put('开始爬取:{}'.format(search))
        self.p = Process(target=start_crawl, args=(search, website, self.Q))
        self.p.start()
        # https://blog.csdn.net/La_vie_est_belle/article/details/102539029
        self.log_thread.signal.connect(self.show_result)
        self.log_thread.log_text_signal.connect(
            lambda text: self.log_text.append(text))
        self.log_thread.start()

    @pyqtSlot()
    def __clean(self):
        self.search_editer.setText('')
        self.keywords_editer.setText('')
        self.log_text.setText('')
        if os.path.exists('crawl.items'):
            os.remove('crawl.items')
        self.current_page = 1
        for i in range(self.result_layout.count()):
            self.result_layout.itemAt(i).widget().deleteLater()
        pass

    @pyqtSlot()
    def __change_page(self, action):
        if action == 'pre' and self.current_page > 1:
            self.current_page = self.current_page - 1
        elif action == 'pre' and self.current_page <= 1:
            return
        elif action == 'next' and self.current_page < ceil(self.len / 10):
            self.current_page = self.current_page + 1
        else:
            return
        # self.current_page_label.setText(
        #     '{}/{}'.format(str(self.current_page), str(ceil(self.len/10))))
        self.current_page_label.setText('{}/{}'.format(
            str(self.current_page), str(ceil(self.len / 10))))
        for i in range(self.result_layout.count()):
            self.result_layout.itemAt(i).widget().deleteLater()
        start = (self.current_page - 1) * 10
        end = self.current_page * 10
        show = filter_results(self.keywords, start, end)
        for item in show:
            commodity = Commodity(item['name'], item['page_index'],
                                  item['page_link'], item['commodity_link'])
            self.result_layout.addWidget(commodity)
예제 #13
0
파일: frontend.py 프로젝트: tinval/easylit2
class Window2(QDialog):
    def __init__(self, model, parent=None):
        super(Window2, self).__init__(parent)

        self.model = model
        self.mainLayout = QGridLayout()
        self.mainLayout.setColumnStretch(0, 1)
        self.mainLayout.setColumnStretch(1, 3)
        self.mainLayout.setColumnStretch(2, 3)

        self.flayout = QFormLayout()
        self.flayout.addRow('title', QLineEdit())
        self.flayout.addRow('author', QLineEdit())
        self.flayout.addRow('abstract', QLineEdit())
        self.comboBox = QComboBox()
        self.comboBox.addItems(Scraper.scrapers)
        self.flayout.addRow('source', self.comboBox)

        self.table = TableWidget()
        self.table.doubleClicked.connect(self.openDocument)

        self.setFixedSize(1000, 600)

        button1 = QPushButton()
        button1.setText("Search")
        button1.clicked.connect(self.search)

        button2 = QPushButton()
        button2.setText("Save")
        button2.clicked.connect(self.save)

        self.button3 = QPushButton()
        self.button3.setText("Next")
        self.button3.clicked.connect(self.next_results)
        self.button3.setVisible(False)

        self.button4 = QPushButton()
        self.button4.setText("Previous")
        self.button4.clicked.connect(self.previous_results)
        self.button4.setVisible(False)

        self.label = QLabel()
        self.label.setVisible(False)

        self.setWindowTitle('Search')
        self.mainLayout.addLayout(self.flayout, 0, 0)
        self.mainLayout.addWidget(self.table, 0, 1, 1, 2)
        self.mainLayout.addWidget(self.label, 1, 0)
        self.mainLayout.addWidget(self.button4, 1, 1)
        self.mainLayout.addWidget(self.button3, 1, 2)
        self.mainLayout.addWidget(button1, 2, 0)
        self.mainLayout.addWidget(button2, 2, 1, 1, 2)

        self.setLayout(self.mainLayout)

    def getInputData(self):
        inputData = {
            self.flayout.itemAt(2 * i).widget().text():
            self.flayout.itemAt(2 * i + 1).widget().text()
            for i in range(int(self.flayout.count() / 2) - 1)
        }
        inputData['source'] = self.comboBox.currentText()
        return inputData

    def search(self):
        inputData = self.getInputData()
        source = inputData.pop('source')
        self.scraper = Scraper(inputData, source)
        logging.info('Scraper search' + str(inputData))
        results = self.scraper.search()
        self.table.fillTable(results)
        if self.scraper.total > 10:
            self.button3.setVisible(True)
        self.update_label()

    def update_label(self):
        self.label.setText('Page {} of {}'.format(
            self.scraper.page,
            int(self.scraper.total / 10) + 1))
        self.label.setVisible(True)

    def next_results(self):
        self.scraper.page += 1
        results = self.scraper.search()
        self.table.fillTable(results)
        self.button4.setVisible(True)
        if self.scraper.total <= 10 * self.scraper.page:
            self.button3.setVisible(False)
        self.update_label()

    def previous_results(self):
        self.scraper.page -= 1
        results = self.scraper.search()
        self.table.fillTable(results)
        self.button3.setVisible(True)
        if self.scraper.page <= 1:
            self.button4.setVisible(False)
        self.update_label()

    def openDocument(self, y):
        if 'http' in y.data():
            webbrowser.open(y.data(), new=2)

    def save(self):
        index = self.table.selectionModel().selectedRows()
        if len(index) > 0:
            new_data = {
                self.table.horizontalHeaderItem(i).text():
                str(self.table.model().index(index[0].row(), i).data())
                for i in range(self.table.columnCount())
            }
            if 'document' in new_data and 'pdf' in new_data['document']:
                new_data = self.save_file(new_data)
            row_index = self.model.rowCount(QModelIndex())
            record = self.model.record()
            record.setGenerated('id', False)
            record.setValue('created', QDateTime.currentDateTime())
            for column in new_data:
                record.setValue(column, new_data[column])
            self.model.insertRecord(-1, record)

    def save_file(self, new_data):
        if 'document' in new_data and len(new_data['document']) > 0:
            author = ', '.join(
                re.findall(r'(\w*)(?:$|,)', new_data.get('author'))[:-1])
            title = re.sub(r"[^a-zA-Z0-9]+", ' ', new_data.get('title'))
            date = new_data.get('date') if new_data.get('date') else ''
            filename = date + ' ' + title + ' - ' + author + '.pdf'
            path = os.path.join(cfg['temp'], filename)
            logging.info('Trying to save file ' + filename)
            if not os.path.exists(path):
                response = requests.get(new_data['document'], headers=_HEADERS)
                if response.ok:
                    try:
                        with open(path, 'wb') as f:
                            f.write(response.content)
                        try:
                            new_data['length'] = PdfFileReader(open(
                                path, 'rb')).getNumPages()
                        except:
                            display_text = 'Corrupted document ' + filename
                        new_data['document'] = filename
                        display_text = 'Saved document ' + filename
                    except:
                        display_text = 'Dowload document successful, but not possible to save.'
                        new_data['document'] = ''
                else:
                    display_text = 'Dowload document not successful.'
                    new_data['document'] = ''
            else:
                display_text = 'File ' + filename + 'already exists.'
        else:
            display_text = 'There is no document to save.'
        msgBox = QMessageBox()
        msgBox.setText(display_text)
        msgBox.exec_()
        logging.info(display_text)
        return new_data
예제 #14
0
class Approval(QMainWindow):
    def __init__(self):
        super(Approval, self).__init__()
        
        self.setWindowTitle("Expedited Approval Tool")
        self.setWindowIcon(QIcon('icon/PS_Icon.png'))
        
        self.frmMain = QFormLayout()
        #test
        mainLayout = QWidget()
        mainLayout.setLayout(self.frmMain)

        self.setCentralWidget(mainLayout)
        
        self.formMain()
        
    def formMain(self):
        
        leProbSheet = QLineEdit()
        leProbSheet.setMaximumWidth(50)
        self.frmMain.addRow(QLabel("Enter Problem Sheet ID:"), leProbSheet)
        
        hbShip = self.createRadioGroup("Ship")
        rbtnShipYes = self.rb.get("ShipYes")
        rbtnShipNo = self.rb.get("ShipNo")
        rbtnShipNo.setChecked(True)
        self.frmMain.addRow(QLabel("Did you confirm the correct shipping was \n selected and the correct pricing was quoted?"), hbShip)

        hbYY = self.createRadioGroup("YY")
        rbtnYYYes = self.rb.get("YYYes")
        rbtnYYNo = self.rb.get("YYNo")
        rbtnYYNo.setChecked(True)
        self.frmMain.addRow(QLabel("Is the order a YY or a non-suspicious NY/YN?"), hbYY)
        
        hbOver = self.createRadioGroup("Over")
        rbtnOverYes = self.rb.get("OverYes")
        rbtnOverNo = self.rb.get("OverNo")
        rbtnOverNo.setChecked(True)
        self.frmMain.addRow(QLabel("Did you override and upgrade the shipping \n in Stone Edge?"), hbOver)
        
        teNotes = QTextEdit()
        teNotes.setMaximumHeight(125)
        self.frmMain.addRow(QLabel("Additional Notes:"))
        self.frmMain.addRow(teNotes)
        
        btnApprove = QPushButton("Approved")
        btnApprove.clicked.connect(lambda: self.btnApprove_Click(leProbSheet.text(), rbtnShipYes.isChecked(), rbtnYYYes.isChecked(), rbtnOverYes.isChecked(), teNotes.toPlainText()))
        
        btnDeny = QPushButton("Not Approved")
        btnDeny.clicked.connect(lambda: self.btnDeny_Click(leProbSheet.text(), rbtnShipYes.isChecked(), rbtnYYYes.isChecked(), rbtnOverYes.isChecked(), teNotes.toPlainText()))
        
        btnQuit = QPushButton("Quit")
        btnQuit.clicked.connect(self.btnCancel_Click)
        
        hbBtnBox = QHBoxLayout()
        hbBtnBox.addWidget(btnApprove)
        hbBtnBox.addWidget(btnDeny)
        hbBtnBox.addWidget(btnQuit)
        
        self.frmMain.addRow(hbBtnBox)
        
    def btnApprove_Click(self, probSheetID, correctShip, YYorder, Override, notes):
        ad = ApprovalData()
        eid = ad.checkProbSheet(probSheetID)
        if eid:
            cnt = ad.checkApproved(eid)
        else: cnt = 0
        
        if eid > 0 and cnt == 0:
            try:
                ad.insApproval(probSheetID, eid, 1, correctShip, YYorder, Override, notes)
                ad.updExpedited(eid, 1)
                self.removeWidgets()
                self.formMain()
            except BaseException as e:
                QMessageBox.warning(self, "Database", "There was an issue inserting into the database. \n" + str(e), QMessageBox.Ok)
        else:
            if cnt:
                QMessageBox.warning(self, "Approved", "This problem sheet has already been approved.", QMessageBox.Ok)
            else:
                QMessageBox.warning(self, "Missing", "This problem sheet has not been entered into the system as expedited.", QMessageBox.Ok)
        
    def btnDeny_Click(self, probSheetID, correctShip, YYorder, Override, notes):
        ad = ApprovalData()
        eid = ad.checkProbSheet(probSheetID)
        if eid:
            cnt = ad.checkApproved(eid)
        else: cnt = 0
        
        if eid > 0 and cnt == 0:
            try:
                ad.insApproval(probSheetID, eid, 0, correctShip, YYorder, Override, notes)
                ad.updExpedited(eid, 0)
                self.removeWidgets()
                self.formMain()
            except BaseException as e:
                QMessageBox.warning(self, "Database", "There was an issue inserting into the database. \n" + str(e), QMessageBox.Ok)
        else:
            if cnt:
                QMessageBox.warning(self, "Approved", "This problem sheet has already been approved.", QMessageBox.Ok)
            else:
                QMessageBox.warning(self, "Missing", "This problem sheet has not been entered into the system as expedited.", QMessageBox.Ok)
       
    def btnCancel_Click(self):
        sys.exit()
        
    def createRadioGroup(self, name):
        #create dict items for all of the widgets, and to pull from after creation.
        bg = {}
        self.rb = {}
        hb = {}
        
        #create the group to hold the button.
        bg[(name)] = QButtonGroup(self)
        
        
        #create yes no buttons.
        self.rb[name+"Yes"] = QRadioButton("Yes")
        self.rb[name+"No"] = QRadioButton("No")
        
        #add buttons to group
        bg[(name)].addButton(self.rb[name+"Yes"])
        bg[(name)].addButton(self.rb[name+"No"])
    
        #add the whole thing to a Horz. Box layout.
        hb[(name)] = QHBoxLayout()
        hb[(name)].addWidget(self.rb[name+"Yes"])
        hb[(name)].addWidget(self.rb[name+"No"])
        hb[(name)].addStretch()      
        
        #print(self.rb[name+"Yes"].isChecked())

        return hb[(name)]  
    
    def removeWidgets(self):
        for cnt in reversed(range(self.frmMain.count())):
            # takeAt does both the jobs of itemAt and removeWidget
            # namely it removes an item and returns it
            widget = self.frmMain.takeAt(cnt).widget()
    
            if widget is not None: 
                # widget will be None if the item is a layout
                widget.deleteLater()
예제 #15
0
class PropertiesWidget(QWidget):
    """
    A widget for displaying & editing properties of objects etc.

    Also see the properties this likes to display:
    also see: supertux/property.py
    """

    def __init__(self, parent):
        super().__init__(parent)
        self.items = []

        self.vbox = QVBoxLayout()
        self.layout = QFormLayout()
        self.vbox.addLayout(self.layout)

        self.setLayout(self.vbox)
        self.setMinimumWidth(300)

        # Called in many cases. This should have functions connected
        # which cause the changes in the widget to be applied
        # Called by hitting "Apply", "Ok" or "Finish"
        self.call_signal = Signal()

        self.call_signal.connect(self.call_callbacks)

    def clear_properties(self):
        # Clear Items
        self.items = []
        # Remove all widgets
        for i in range(self.layout.count()):
            self.layout.layout().takeAt(0).widget().setParent(None)

    def set_properties(self, props):
        # Clear previous properties
        self.clear_properties()

        # Add all properties
        for prop in props:
            prop.property_dialog(self)

    def add_label(self, text):
        label = QLabel(text)
        self.layout.addRow(label)
        self.items.append(Item(Item.KIND_LABEL, label, None, None))

    def add_bool(self, name, value, callback):
        label = QLabel(name)
        checkbox = QCheckBox()
        self.layout.addRow(label, checkbox)

        if value:
            checkbox.setCheckState(Qt.Checked)

        self.items.append(Item(Item.KIND_BOOL, label, checkbox, callback=callback))

    def add_int(self, name, value, callback=None):
        label = QLabel(name)
        inputbox = QSpinBox()
        self.layout.addRow(label, inputbox)

        inputbox.setValue(value)

        self.items.append(Item(Item.KIND_INT, label, inputbox, callback=callback))

    def add_float(self, name, value, callback=None):
        label = QLabel(name)
        inputbox = QLineEdit()
        self.layout.addRow(label, inputbox)
        inputbox.setText(str(value))

        self.items.append(Item(Item.KIND_FLOAT, label, inputbox, callback=callback))

    def add_string(self, name, value, callback=None, placeholder=None):
        label = QLabel(name)
        inputbox = QLineEdit()
        self.layout.addRow(label, inputbox)

        inputbox.setText(value)
        if placeholder is not None:
            inputbox.setPlaceholderText(placeholder)

        self.items.append(Item(Item.KIND_STRING, label, inputbox, callback=callback))

    def add_file(self, label, default, ret_rel_to=None, show_rel_to=None, open_in=None, filters=("All Files (*)",),
                 callback=None):
        """Open a FileDialog for the user to select a file

        :param ret_rel_to: Path to which the param. of callback(value)
         will be relative to
        :param show_rel_to: Path to which the displayed text (in input box)
         will be relative to
        :param open_in: Where the open file dialog will begin
        :param callback: Method/function to call upon file being chosen.
        :param filters: A tuple containing filters for filenames. They should appear like this:
                        Name of Filter (*.txt)
                        ^ Only show .txt files
                        All Files (*)
                        C++ Files (*.cpp *.h *.hpp *.cxx)
        """
        label = QLabel(label)
        inputbox = QLineEdit(default)
        browse = QPushButton("Browse...")

        def file_selected(path):
            """Called whenever file is selected"""
            # actual_path = path
            if show_rel_to and path[:len(show_rel_to)] == show_rel_to:
                inputbox.setText(path[len(show_rel_to):])
            else:
                inputbox.setText(path)

        def browse_files():
            """Called when Browse... button clicked"""
            dialog = OpenFileDialog("Open File")
            dialog.set_directory(open_in if open_in else Config.current.datadir)
            dialog.run(file_selected)

        browse.clicked.connect(browse_files)  # Connect the above to click signal

        self.layout.addRow(label, inputbox)
        self.layout.addRow(browse)

        self.items.append(Item(Item.KIND_STRING, label, inputbox, callback=callback))

    def add_enum(self, name, values, current_value=0, callback=None):
        label = QLabel(name)
        drop_down = QComboBox()
        for value in values:
            drop_down.addItem(value)
        drop_down.setCurrentIndex(current_value)
        self.layout.addRow(label, drop_down)

        self.items.append(Item(Item.KIND_ENUM, label, drop_down, callback=callback, group=None))

    def add_radio(self, name, values, current_value=0, callback=None):
        label = QLabel(name)
        group = QButtonGroup()
        for i, value in enumerate(values):
            radio = QRadioButton(value)
            radio.setChecked(current_value == i)
            if i == 0:
                self.layout.addRow(label, radio)
            else:
                self.layout.addRow(None, radio)
            group.addButton(radio)

        self.items.append(Item(Item.KIND_ENUM, label, None, callback=callback, group=group))

    def add_color(self, name, color, callback=None):
        """Not fully implemented according to Item class at the top."""
        label = QLabel(name)
        pixmap = QPixmap(32, 32)
        pixmap.fill(color.to_qt())
        icon = QIcon(pixmap)
        colorbutton = QPushButton(icon, color.to_hex())

        def on_color(qcolor):
            pixmap.fill(qcolor)
            icon.addPixmap(pixmap)
            colorbutton.setIcon(icon)
            colorbutton.setText(qcolor.name())

        self.layout.addRow(label, colorbutton)

        self.items.append(Item(Item.KIND_COLOR, label, colorbutton, callback=callback))

    def call_callbacks(self, *args):
        for item in self.items:
            if item.callback is not None:
                item.callback(item.get_value())

    def get_values(self):
        result = []

        for item in self.items:
            value = item.get_value()
            if value is not None:
                result.append(value)

        return result

    def add_callback(self, callback):
        """Adds a callback to the callback signal"""
        self.call_signal.connect(callback)

    def call(self):
        self.call_signal(*self.get_values())
예제 #16
0
class MainWindow(QDialog):
    def __init__(self):
        super().__init__()
        self.title = "Main window"
        self.top = 55
        self.left = 7
        w = data.scale[0]
        h = data.scale[1]

        data.reso[0] = App.primaryScreen().size().width()
        data.reso[1] = App.primaryScreen().size().height()
        self.width = App.primaryScreen().size().width() / w
        self.height = App.primaryScreen().size().height() / h
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        data.graphResolution = [
            self.width / data.scale[2], self.height / data.scale[3]
        ]
        self.setWindowIcon(QtGui.QIcon('icon1.ico'))
        self.formLayout0 = QFormLayout()
        self.groupBox0 = QGroupBox("Available Asks")

        self.groupBox0.setLayout(self.formLayout0)
        scroll0 = QScrollArea()
        scroll0.setWidget(self.groupBox0)
        scroll0.setWidgetResizable(True)

        self.formLayout = QFormLayout()
        self.groupBox = QGroupBox("Available Bids")

        customTheme()

        data.pref_prd = list(client.get_stars(data.username,
                                              data.password))  # TODO UNCOMMENT
        #print(client.get_stars(data.username, data.password))

        self.groupBox.setLayout(self.formLayout)
        scroll = QScrollArea()
        scroll.setWidget(self.groupBox)
        scroll.setWidgetResizable(True)

        self.formLayout3 = QFormLayout()
        self.groupBox3 = QGroupBox("Your orders")

        self.groupBox3.setLayout(self.formLayout3)
        scroll3 = QScrollArea()
        scroll3.setWidget(self.groupBox3)
        scroll3.setWidgetResizable(True)

        self.formLayout1 = QFormLayout()
        self.groupBox1 = QGroupBox("Orders' History")

        history = client.get_history(data.username, data.password)
        print("HERE WE GO AGAIN")
        for r in history:
            #print(r)
            if len(r):
                Order = QtWidgets.QPushButton()
                if r[-1] == "sell":
                    sign = func.sellOrder(
                        r[0], r[1], r[2],
                        r[3])  # ordertype, product, amount, price
                    Order.setStyleSheet(styles.sellbutton)
                else:
                    sign = func.buyOrder(r[0], r[1], r[2], r[3])
                    Order.setStyleSheet(styles.buybutton)
                Order.setText(sign)
                Order.setDisabled(True)
                # formLayout1.addWidget(Order)
                self.formLayout1.insertRow(0, Order)

        self.groupBox1.setLayout(self.formLayout1)
        scroll2 = QScrollArea()
        scroll2.setWidget(self.groupBox1)
        scroll2.setWidgetResizable(True)

        rightArea = QVBoxLayout()

        threeScrolls = QHBoxLayout()
        threeScrolls.addWidget(scroll)
        threeScrolls.addWidget(scroll0)
        Column = QVBoxLayout()
        Column.addWidget(scroll3)
        Column.addWidget(scroll2)
        threeScrolls.addLayout(Column)
        rightArea.addLayout(threeScrolls)

        leftArea = QVBoxLayout()

        BuySell = QHBoxLayout()
        buyButton = QtWidgets.QPushButton("BUY")
        buyButton.setStyleSheet(
            styles.buybuttonFus.replace("text-align: left;", ""))

        BuySell.addWidget(buyButton)
        sellButton = QtWidgets.QPushButton("SELL")
        sellButton.setStyleSheet(
            styles.sellbuttonFus.replace("text-align: left;", ""))

        BuySell.addWidget(sellButton)

        settingsButton = QtWidgets.QPushButton("configuring".upper())
        BuySell.addWidget(settingsButton)
        self.MainProduct = QComboBox()
        self.MainProduct.currentIndexChanged.connect(
            self.prdChanged, self.MainProduct.currentIndex())

        self.MainProduct.addItem("No filter")
        for prd in data.pref_prd:
            self.MainProduct.addItem(prd)
        BuySell.addWidget(self.MainProduct)

        buy_shortcut = QShortcut(QtGui.QKeySequence("B"), self)
        buy_shortcut.activated.connect(lambda: callOrderWindow("Buy"))

        sell_shortcut = QShortcut(QtGui.QKeySequence("S"), self)
        sell_shortcut.activated.connect(lambda: callOrderWindow("Sell"))

        conf_shortcut = QShortcut(QtGui.QKeySequence("C"), self)
        conf_shortcut.activated.connect(lambda: callConfigWindow())

        my_assets = QShortcut(QtGui.QKeySequence("A"), self)
        my_assets.activated.connect(lambda: call_my_assets())

        buyButton.clicked.connect(lambda: callOrderWindow("Buy"))
        sellButton.clicked.connect(lambda: callOrderWindow("Sell"))
        settingsButton.clicked.connect(lambda: callConfigWindow())

        shortcut1 = QShortcut(QtGui.QKeySequence("1"), self)
        shortcut1.activated.connect(lambda: change_prd_keyboard(1))
        shortcut2 = QShortcut(QtGui.QKeySequence("2"), self)
        shortcut2.activated.connect(lambda: change_prd_keyboard(2))
        shortcut3 = QShortcut(QtGui.QKeySequence("3"), self)
        shortcut3.activated.connect(lambda: change_prd_keyboard(3))
        shortcut4 = QShortcut(QtGui.QKeySequence("4"), self)
        shortcut4.activated.connect(lambda: change_prd_keyboard(4))
        shortcut5 = QShortcut(QtGui.QKeySequence("5"), self)
        shortcut5.activated.connect(lambda: change_prd_keyboard(5))
        shortcut6 = QShortcut(QtGui.QKeySequence("6"), self)
        shortcut6.activated.connect(lambda: change_prd_keyboard(6))
        shortcut7 = QShortcut(QtGui.QKeySequence("7"), self)
        shortcut7.activated.connect(lambda: change_prd_keyboard(7))
        shortcut8 = QShortcut(QtGui.QKeySequence("8"), self)
        shortcut8.activated.connect(lambda: change_prd_keyboard(8))
        shortcut9 = QShortcut(QtGui.QKeySequence("9"), self)
        shortcut9.activated.connect(lambda: change_prd_keyboard(9))
        shortcut0 = QShortcut(QtGui.QKeySequence("0"), self)
        shortcut0.activated.connect(lambda: change_prd_keyboard(0))

        shortcutR = QShortcut(QtGui.QKeySequence("F5"), self)
        shortcutR.activated.connect(lambda: self.F5_EVENT())

        leftArea.addLayout(BuySell)

        graphsArea = QVBoxLayout()

        self.graph1 = CanvasUp()

        self.graph2 = CanvasLow()

        self.sliderUP = QSlider(Qt.Horizontal)

        self.sliderUP.setTickInterval(10)
        self.sliderUP.setSingleStep(30)

        self.sliderUP.valueChanged.connect(lambda: self.sliderChanged1())

        self.sliderDOWN = QSlider(Qt.Horizontal)

        self.sliderDOWN.setTickInterval(10)
        self.sliderDOWN.setSingleStep(30)
        self.sliderDOWN.valueChanged.connect(lambda: self.sliderChanged2())

        self.load = QtWidgets.QLabel()
        self.load1 = QtWidgets.QLabel()

        self.tabs = QTabWidget()
        self.graphUP = QWidget()
        self.graphUP.layout = QVBoxLayout(self.graphUP)
        self.graphUP.layout.addWidget(self.graph1)
        self.graphUP.layout.addWidget(self.sliderUP)
        self.tabs.setFixedHeight(data.graphResolution[0])
        self.tabs.setFixedWidth(data.graphResolution[1])
        self.tabs.addTab(self.graphUP, "Graph1")

        graphsArea.addWidget(self.tabs)

        self.tabs1 = QTabWidget()
        self.graphLOW = QWidget()
        self.graphLOW.layout = QVBoxLayout(self.graphLOW)
        self.graphLOW.layout.addWidget(self.graph2)
        self.graphLOW.layout.addWidget(self.sliderDOWN)
        self.tabs1.setFixedHeight(data.graphResolution[0])
        self.tabs1.setFixedWidth(data.graphResolution[1])

        self.tabs1.addTab(self.graphLOW, "Graph2")

        graphsArea.addWidget(self.tabs1)

        leftArea.addLayout(graphsArea)

        global bar
        bar = QPushButton(func.barInfo())
        bar.setStyleSheet(styles.barstyle1)
        bar.clicked.connect(lambda: call_my_assets())

        lowBar = QPushButton("NEWS:  " +
                             data.news[randrange(0, len(data.news))])
        lowBar.setStyleSheet(styles.news)
        lowBar.setDisabled(True)

        Mainlayout = QVBoxLayout(self)
        ContentArea = QHBoxLayout()
        ContentArea.addLayout(leftArea)
        ContentArea.addLayout(rightArea)
        Mainlayout.addWidget(bar)
        Mainlayout.addLayout(ContentArea)
        Mainlayout.addWidget(lowBar)

        self.show()

        self.thread = MyThread()  #time
        self.thread.timeToSleep = 0.3
        self.thread.change_value.connect(lambda: setProgressVal())
        self.thread.start()

        self.thread1 = MyThread()  # add possible orders
        self.thread1.timeToSleep = 2.5
        self.thread1.change_value.connect(lambda: self.getUpdate())
        self.thread1.start()

        self.thread2 = MyThread()  # update graphs
        self.thread2.timeToSleep = 4
        self.thread2.change_value.connect(lambda: self.updateGraphs())
        self.thread2.start()

        self.thread3 = MyThread()  # update news
        self.thread3.timeToSleep = 7
        self.thread3.change_value.connect(lambda: printNews())
        self.thread3.start()

        def setProgressVal():
            bar.setText(func.barInfo())

        def change_prd_keyboard(i):
            try:
                if i == 0:
                    self.MainProduct.setCurrentIndex(0)
                elif len(data.pref_prd) > i - 1:
                    self.MainProduct.setCurrentIndex(i)
                else:
                    self.MainProduct.setCurrentIndex(0)
            except:
                print("error in change_prd_keyboard")

        def callConfigWindow():

            data.orderResolution[0], data.orderResolution[
                1] = self.width / 2.3, self.height / 1.7
            Dialog = QtWidgets.QDialog()
            ui = cfg.Ui_DialogConfig()
            ui.setupUi(Dialog)
            Dialog.exec_()
            if data.mode == "Dark":
                switchDark()
                bar.setStyleSheet(styles.barstyle2)
            else:
                QtWidgets.QApplication.instance().setPalette(
                    self.style().standardPalette())
                switchLight()
                bar.setStyleSheet(styles.barstyle1)
            if data.clearHis == True:
                try:
                    for i in reversed(range(self.formLayout1.count())):
                        self.formLayout1.itemAt(i).widget().deleteLater()
                except:
                    pass
            data.clearHis = False

            if data.addToBox[0]:
                self.MainProduct.clear()
                self.MainProduct.addItem("No filter")
                for prd in data.pref_prd:
                    self.MainProduct.addItem(prd)
            data.addToBox = [False, []]

            if data.joinG[0] == True and data.joinG[1] == True:
                self.updateGraphs()

            self.graph1.upd()
            self.graph2.upd()

            if self.MainProduct.currentText() == "No filter":
                self.graph1.clear()
                self.graph1.no_data()
                self.graph2.clear()
                self.graph2.no_data()

            if data.joinG[0] == True and data.joinG[1] == True:
                data.zoom1 = data.zoom
                tm = time.time()
                step = 3600
                tm_ = tm - 60 * 60 * 24
                inp = [[x, x + step]
                       for x in range(int(tm_), int(tm), int(step))]
                prd = self.MainProduct.currentText()
                data.bx = client.box_graph(prd, inp)
                #data.bx1 = client.box_graph(prd, inp)
                data.bx_lab = inp
                #print("Box", inp)

            data.box_reload = 0

        def call_my_assets():
            data.orderResolution[0], data.orderResolution[
                1] = self.width / data.scale_[0], self.height / data.scale_[1]
            Dialog = QtWidgets.QDialog()
            ui = assets.Ui_DialogAssets()
            ui.setupUi(Dialog)
            Dialog.exec_()

        def callOrderWindow(type):
            data.orderWinIsON = True
            data.orderResolution[0], data.orderResolution[
                1] = self.width / data.scale_[2], self.height / data.scale_[3]
            data.orderType = str(type)
            if self.MainProduct.currentText() != "No filter":
                try:
                    amtN = 0  # для средневзвешенного
                    wcc = 0
                    # computing autocomplete prices
                    if str(type) == "Buy":

                        for i in reversed(range(self.formLayout0.count())):
                            try:
                                #print("=>",func.getPrice(self.formLayout0.itemAt(i).widget().text()))
                                amtN += float(
                                    func.getAmt(
                                        self.formLayout0.itemAt(
                                            i).widget().text()))

                                wcc += float(
                                    func.getAmt(
                                        self.formLayout0.itemAt(
                                            i).widget().text())) * float(
                                                func.getPrice(
                                                    self.formLayout0.itemAt(
                                                        i).widget().text()))
                            except:
                                pass

                        data.acPrice = func.getPrice(
                            self.formLayout0.itemAt(0).widget().text())
                        #print("wcc1",wcc, amtN)
                        data.acPriceFOK = (wcc / (amtN))

                    else:
                        for i in reversed(range(self.formLayout.count())):
                            try:
                                amtN += float(
                                    func.getAmt(
                                        self.formLayout.itemAt(
                                            i).widget().text()))
                                wcc += float(
                                    func.getAmt(
                                        self.formLayout.itemAt(
                                            i).widget().text())) * float(
                                                func.getPrice(
                                                    self.formLayout.itemAt(
                                                        i).widget().text()))
                            except:
                                pass
                        #print("wcc2", wcc, amtN)
                        data.acPrice = func.getPrice(
                            self.formLayout.itemAt(self.formLayout.count() -
                                                   1).widget().text())
                        data.acPriceFOK = wcc / (amtN)
                except:
                    pass

            data.autocomplete = self.MainProduct.currentText()
            Dialog = QtWidgets.QDialog()
            ui = ord.Ui_DialogOrder()
            ui.setupUi(Dialog)
            Dialog.exec_()

            if data.addToHis[0]:  ### ALSO CHECKS FOR SUCCESS
                sign = func.Order(data.addToHis[1][0], data.addToHis[1][1],
                                  data.addToHis[1][2], data.addToHis[1][3],
                                  data.addToHis[1][4])
                newOrder = QtWidgets.QPushButton()
                newOrder.setStyleSheet(styles.buybutton)
                if data.addToHis[1][0].lower() == "sell":
                    newOrder.setStyleSheet(styles.sellbutton)
                newOrder.setDisabled(True)
                newOrder.setText(sign)
                self.formLayout1.insertRow(0, newOrder)

                bar.setText(func.barInfo())  #CHEANGE BALANCE
                #RELOADING AVALIABLE ORDERS

                self.reloadData()

            elif data.addToOrd[0]:
                self.reloadData()

            if len(data.system_ord) != 0:
                self.reloadSystemOrders("")

            data.addToHis = (False, [])
            data.addToOrd = (False, "Buy", "")
            data.acPrice = ""
            bal = client.get_balance(data.username)
            data.balance = (bal, "$")
            func.putPersonalData()
            bar.setText(func.barInfo())
            data.orderWinIsON = False

        def printNews():
            i = randrange(0, len(data.news))
            lowBar.setText("NEWS:  " + data.news[i])

    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_B:
            print("b pressed")

    def sliderChanged1(self):
        if self.MainProduct.currentText() != "No filter":
            data.zoom = self.sliderUP.value()
            self.graph1.clear()
            self.graph1.reloading()
            self.reloading()
            if len(data.graphsData) == 0:
                self.graph1.clear()
                self.graph1.no_data()

    def sliderChanged2(self):
        if self.MainProduct.currentText() != "No filter":
            data.zoom1 = self.sliderDOWN.value()
            self.graph2.clear()
            self.graph2.reloading()
            self.reloading()
            if len(data.graphsData_1) == 0:
                self.graph2.clear()
                self.graph2.no_data()

    def F5_EVENT(self):
        data.box_reload = 0
        self.reloading()
        self.updateGraphs()

    def reloading(self):
        print("__reloading__")
        try:
            if data.joinG[0] == True and data.joinG[1] == True:
                data.zoom1 = data.zoom
                tm = time.time()
                step = 3600
                tm_ = tm - 60 * 60 * 24
                inp = [[x, x + step]
                       for x in range(int(tm_), int(tm), int(step))]
                prd = self.MainProduct.currentText()
                data.bx = client.box_graph(prd, inp)
                # data.bx1 = client.box_graph(prd, inp)
                data.bx_lab = inp
                # print("Box", inp)
            data.sleep += 1
            if data.sleep == 60:
                data.sleep = 0
            if data.zoom != 0:
                data.graphsData = client.stats(
                    self.MainProduct.currentText(),
                    time.time() - (1100 - data.zoom * 10),
                    time.time() + 15, "buy")

            else:
                data.graphsData = client.stats(self.MainProduct.currentText(),
                                               0,
                                               time.time() + 15, "buy")
            if data.zoom1 != 0:
                data.graphsData_1 = client.stats(
                    self.MainProduct.currentText(),
                    time.time() - (1100 - data.zoom1 * 10),
                    time.time() + 15, "sell")

            else:
                data.graphsData_1 = client.stats(
                    self.MainProduct.currentText(), 0,
                    time.time() + 15, "sell")
        except:
            print("Error in reloading")

    def updateGraphs(self):
        print("TIME: ", time.time() - data.working_time)
        try:
            if self.MainProduct.currentText() != "No filter":

                self.graph1.clear()
                if data.joinG[0] == True and data.joinG[1] == True:
                    self.sliderUP.setHidden(True)
                    self.graph1.plot_joint()
                else:
                    self.sliderUP.setHidden(False)
                    self.reloading()
                    self.graph1.plot()

                if data.joinG[0] == True and data.joinG[1] == True:

                    if data.box_reload < 1:
                        self.sliderDOWN.setHidden(True)
                        self.graph2.clear()
                        self.graph2.candels()
                        data.box_reload += 1
                else:
                    self.graph2.clear()
                    self.graph2.plot()
                    self.sliderDOWN.setHidden(False)

            else:
                data.graphsData = []
                data.graphsData_1 = []
        except:
            print("Error in update graphs")

    def prdChanged(self):
        data.chosen_prd = self.MainProduct.currentText()
        data.box_reload = 0
        self.sliderChanged1()
        self.sliderChanged2()
        if self.MainProduct.currentText() == "No filter":
            if not data.FIRSTSTART:
                self.graph1.clear()
                self.graph1.no_data()
                self.graph2.clear()
                self.graph2.no_data()
            data.FIRSTSTART = False

        self.reloadData()

    def reloadData(self):
        if data.joinG[0] == True and data.joinG[1] == True:
            data.sleep = 0

        try:
            text = self.MainProduct.currentText()
            data.prd = text
            res1 = []
            res2 = []
            if text == "No filter":
                try:
                    if data.goLocal:
                        raise Exception

                except:
                    print(
                        "EXCEPTION OCCURRED: Local database is used instead ")

            else:
                try:
                    if data.goLocal:
                        raise Exception
                    res1 = client.exe(
                        "SELECT * FROM orders WHERE product='{}' AND request='{}'ORDER BY price LIMIT 20"
                        .format(text, "sell"))
                    res2 = client.exe(
                        "SELECT * FROM orders WHERE product='{}' AND request='{}'ORDER BY price LIMIT 20"
                        .format(text, "buy"))
                except:
                    print(
                        "EXCEPTION OCCURRED: Local database is used instead ")
                    res = func.findOrder(text)

            res = client.exe(
                f"SELECT * FROM orders WHERE uid={float(data.userid)}")

            data.yourOrd = data.system_ord

            data.system_ord = []

            try:
                for i in reversed(range(self.formLayout.count())):
                    self.formLayout.itemAt(i).widget().deleteLater()
            except:
                pass
            j2 = 0
            for order in res:
                j2 += 1
                if order[3] == "sell":
                    if order[-1] == float(data.userid):
                        sys_ord = [
                            order[2], order[3], order[4],
                            str(order[5]),
                            str(order[6]),
                            str(order[0])
                        ]
                        if sys_ord not in data.system_ord:
                            data.system_ord.append(sys_ord)
                            data.ORDDIC[order[0]] = order
                    else:
                        if order not in data.Orders:
                            data.ORDDIC[order[0]] = order

            try:
                for i in reversed(range(self.formLayout0.count())):
                    self.formLayout0.itemAt(i).widget().deleteLater()
            except:
                pass
            j3 = 0
            for order in res:
                j3 += 1
                if order[3] == "buy":
                    if order[-1] == float(data.userid):
                        sys_ord = [
                            order[2], order[3], order[4],
                            str(order[5]),
                            str(order[6]),
                            str(order[0])
                        ]
                        if sys_ord not in data.system_ord:

                            data.system_ord.append(sys_ord)
                            data.ORDDIC[order[0]] = order
                    else:
                        if order not in data.Orders:
                            data.ORDDIC[order[0]] = order

                    # add to history
            try:
                for el in data.yourOrd:

                    if el not in data.system_ord and not data.orderWinIsON:
                        msg = QMessageBox()
                        msg.setWindowTitle("An order's been executed")
                        msg.setIconPixmap(QPixmap("arrow.png").scaled(80, 80))
                        msg_text = "This order\n"

                        thisorder = QPushButton()
                        if el[1] == "buy":
                            thisorder.setStyleSheet(styles.buybutton)
                            thisorder.setText(
                                func.buyOrder("Limit", el[2], el[3], el[4]))
                            data.balance = (data.balance[0] -
                                            float(el[3]) * float(el[4]),
                                            data.balance[1])
                            #msg_text += func.buyOrder("Limit", el[2], el[3], el[4])
                            msg_text += "Limit Buy" + el[2]
                        else:
                            thisorder.setStyleSheet(styles.sellbutton)
                            thisorder.setText(
                                func.sellOrder("Limit", el[2], el[3], el[4]))
                            data.balance = (data.balance[0] +
                                            float(el[3]) * float(el[4]),
                                            data.balance[1])
                            #msg_text += func.sellOrder("Limit", el[2], el[3], el[4])
                            msg_text += "Limit Sell" + el[2]
                        thisorder.setDisabled(True)
                        self.formLayout1.insertRow(0, thisorder)
                        msg.setText(msg_text + "\nhas been executed.")
                        msg.setWindowIcon(QtGui.QIcon('bgicon.ico'))
                        msg.exec_()
            except:
                print("line 676")

            res = res1 + res2
            if self.MainProduct.currentText() != "No filter":
                prices = func.merger(res)
                for el in prices:
                    if prices[el][1][3] == "sell":
                        thisorder = QPushButton()
                        thisorder.setStyleSheet(styles.sellbutton)
                        sign = func.sellOrder(prices[el][1][2],
                                              prices[el][1][4],
                                              str(prices[el][0]),
                                              prices[el][1][6])
                        thisorder.setText(sign)
                        self.formLayout0.addRow(thisorder)
                    else:
                        thisorder = QPushButton()
                        thisorder.setStyleSheet(styles.buybutton)
                        sign = func.buyOrder(prices[el][1][2],
                                             prices[el][1][4],
                                             str(prices[el][0]),
                                             prices[el][1][6])
                        thisorder.setText(sign)
                        self.formLayout.insertRow(0, thisorder)

            self.reloadSystemOrders("")

        except:
            print("Error in def reloadData")
            if data.error == False:
                data.error = True
                connect()

    def removeOrder(self, n):

        oldstyle = self.formLayout3.itemAt(n - 1).widget().styleSheet()
        self.formLayout3.itemAt(n - 1).widget().setStyleSheet(styles.buttonY)
        data.orderResolution[0], data.orderResolution[
            1] = self.width / 2.5, self.height / 1.3
        Dialog = QtWidgets.QDialog()
        ui = confirmwin.Ui_DialogCONFIRM()
        ui.setupUi(Dialog)
        Dialog.exec_()
        try:
            if data.toDelete:
                client.delete(data.username, data.system_ord[n - 1][-1])
                for i in reversed(range(self.formLayout3.count())):
                    self.formLayout3.itemAt(i).widget().deleteLater()
                del data.system_ord[n - 1]
                self.reloadSystemOrders("")
                bal = client.get_balance(data.username)
                data.balance = (bal, "$")
                func.putPersonalData()
                bar.setText(func.barInfo())
            else:
                self.formLayout3.itemAt(n - 1).widget().setStyleSheet(oldstyle)
            data.toDelete = False
        except:
            print("Error in remove order")

    def reloadSystemOrders(self, temp):
        try:
            for i in reversed(range(self.formLayout3.count())):
                self.formLayout3.itemAt(i).widget().deleteLater()
            j1 = 0
            for el in data.system_ord:
                j1 += 1
                thisorder = QPushButton(
                    "", clicked=lambda _, n=j1: self.removeOrder(n))
                if el[1] == "buy":

                    thisorder.setStyleSheet(styles.buybutton)
                    thisorder.setText(
                        func.buyOrder("Limit", el[2], el[3],
                                      el[4] + "\n id: " + el[-1]))
                else:

                    thisorder.setStyleSheet(styles.sellbutton)
                    thisorder.setText(
                        func.sellOrder("Limit", el[2], el[3],
                                       el[4] + "\n id: " + el[-1]))
                self.formLayout3.insertRow(0, thisorder)
        except:
            print("Error reloadSystemOrders")

    def getUpdate(self):
        self.reloadData()

    def closeEvent(self, event):

        print("Goodbye")
        # TODO приложение работает в фоновом режиме даже после закрытия
        self.thread.terminate()
        self.thread1.terminate()
        self.thread2.terminate()
        self.thread3.terminate()

        pid = os.getpid()
        os.kill(pid, signal.SIGINT)
        print(pid)
        print("BYE")
예제 #17
0
class GUI(QMainWindow):
    # Set global variables here
    story = ''
    new_story = ''

    # Set up attributes of GUI instances
    def __init__(self):
        super().__init__()
        self.w_sel = QWidget()  # Create a QWidget called w
        self.sel_story_label = QLabel(
            self.w_sel)  # Create a QLabel called label1 in QWidget w
        self.sel_story_text = QLineEdit(
            self.w_sel)  # Create a QLineEdit called edit1 in QWidget w
        self.sel_enter_b = QPushButton(
            self.w_sel)  # Create a QPushButton called button in QWidget w
        self.vbox_sel = QVBoxLayout()  # Create a QVBoxLayout called vbox
        self.window_sel()  # Call function window()

        self.w_matches = QWidget()  # Create a QWidget called w
        self.form_layout_matches = QFormLayout()
        self.submit_b_matches = QPushButton()

    # Set up the GUI window
    def window_sel(self):
        self.setCentralWidget(
            self.w_sel
        )  # Set w to central widget (nothing will show without this step)

        self.sel_story_label.setText(
            'Enter a MadLib .txt file name')  # Set label1 text to 'testing'
        self.sel_story_text.setText(
            'vacation_short.txt')  # Set edit1 text to 'test'
        self.sel_enter_b.setText('Enter')  # Set button text to 'Enter'

        self.vbox_sel.addWidget(
            self.sel_story_label
        )  # Add label1 to the vbox layout (order of this matters)
        self.vbox_sel.addWidget(
            self.sel_story_text)  # Add edit1 to the vbox layout
        self.vbox_sel.addWidget(
            self.sel_enter_b)  # Add button to the vbox layout

        self.w_sel.setLayout(self.vbox_sel)  # Set the window layout to vbox

        self.sel_enter_b.clicked.connect(
            self.button_click
        )  # When the button is clicked, call function button_click

        self.setWindowTitle('MatLibs')  # Set window title

        self.show()  # Show the window

    def window_matches(self, matches):
        self.setCentralWidget(
            self.w_matches
        )  # Set w to central widget (nothing will show without this step)

        self.submit_b_matches.setText('Submit')
        self.w_matches.setLayout(self.form_layout_matches)
        for match in matches:
            match_label = QLabel(match)
            word_enter = QLineEdit(self.w_matches)
            self.word(match_label, word_enter)
        self.form_layout_matches.addWidget(self.submit_b_matches)
        self.w_matches.setLayout(self.form_layout_matches)

        self.submit_b_matches.clicked.connect(lambda: self.matches_click())

        self.show()

    def matches_click(self):
        items = (self.form_layout_matches.itemAt(i).widget()
                 for i in range(self.form_layout_matches.count()))
        labels = []
        values = []
        for i, item in enumerate(items):
            if i % 2 == 0:
                labels.append(item.text())
            else:
                values.append(item.text())
        labels.pop()  # remove submit button from list
        self.new_story = sub_matches(labels, values, self.story)
        print(self.new_story)

        w_story = QWidget()
        story_label = QLabel(w_story)
        story_button = QPushButton(w_story)

        story_label.setText(self.new_story)
        story_button.setText('Close')

        story_vbox = QVBoxLayout()

        self.setCentralWidget(w_story)

        story_vbox.addWidget(story_label)
        story_vbox.addWidget(story_button)
        w_story.setLayout(story_vbox)

        story_button.clicked.connect(lambda: self.close())

        self.show()

    def word(self, label, line_edit):
        self.form_layout_matches.addRow(label, line_edit)
        return

    # This function is run when the button is clicked
    # In this example, the text from edit1 is printed in the terminal window and the window closes.
    # Other options on a button click...
    # When the button is clicked, the global variables are updated and printed,
    # the gui interface is closed,
    # and a function is called passing the updated global variables as the parameters.
    def button_click(self):
        print(self.sel_story_text.text())
        # self.read_file(self.sel_story_text.text())
        self.story = get_story(self.sel_story_text.text())
        self.window_matches(get_matches(self.story))
예제 #18
0
class IntegrateEditor(BaseEditor):
    """
    Editor to integrate defined regions.
    """

    Integrators_classes = Integrate.INTEGRALS
    Integrators = [a.name for a in Integrators_classes]

    def __init__(self, parent=None, **kwargs):
        super().__init__(parent, **kwargs)

        self._limits = []

        self.setLayout(QVBoxLayout())
        self.form_set = QFormLayout()
        self.form_lim = QFormLayout()
        self.layout().addLayout(self.form_set)
        self.layout().addLayout(self.form_lim)

        self.methodcb = QComboBox()
        self.methodcb.addItems(self.Integrators)

        self.form_set.addRow("Integration method:", self.methodcb)
        self.methodcb.currentIndexChanged.connect(self.changed)
        self.methodcb.activated.connect(self.edited)

        self.focusIn = self.activateOptions

        self.add_limit()

        button = QPushButton("Add Region")
        self.layout().addWidget(button)
        button.clicked.connect(self.add_limit)

        self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred)

        self.user_changed = False

    def activateOptions(self):
        self.parent_widget.curveplot.clear_markings()
        for row in range(self.form_lim.count()):
            limitbox = self.form_lim.itemAt(row, 1)
            if limitbox:
                self.parent_widget.curveplot.add_marking(limitbox.line1)
                self.parent_widget.curveplot.add_marking(limitbox.line2)

    def add_limit(self, *args, row=None):
        if row is None:
            row = len(self._limits)
            try:
                self._limits.append(self._limits[-1])
            except IndexError:
                self._limits.append([0., 1.])
        label = "Region {0}".format(row+1)
        limitbox = LimitsBox(limits=self._limits[row], label=label)
        if self.form_lim.rowCount() < row+1:
            # new row
            self.form_lim.addRow(limitbox)
        else:
            # row already exists
            self.form_lim.setLayout(row, 2, limitbox)
        limitbox.focusIn = self.activateOptions
        limitbox.valueChanged.connect(self.set_limits)
        limitbox.editingFinished.connect(self.edited)
        limitbox.deleted.connect(self.remove_limit)
        self.edited.emit()
        return limitbox

    def remove_limit(self, limitbox):
        row, role = self.form_lim.getLayoutPosition(limitbox)
        for r in range(row, len(self._limits)):
            limitbox = self.form_lim.itemAt(r, 1)
            limitbox.removeLayout()
        self._limits.pop(row)
        self.set_all_limits(self._limits)

    def set_limits(self, limits, limitbox, user=True):
        if user:
            self.user_changed = True
        row, role = self.form_lim.getLayoutPosition(limitbox)
        if self._limits[row] != limits:
            self._limits[row] = limits
            with blocked(self.form_lim):
                limitbox.lowlime.setValue(limits[0])
                limitbox.highlime.setValue(limits[1])
            self.changed.emit()

    def set_all_limits(self, limits, user=True):
        if user:
            self.user_changed = True
        self._limits = limits
        for row in range(len(limits)):
            limitbox = self.form_lim.itemAt(row, 1)
            if limitbox is None:
                limitbox = self.add_limit(row=row)
            with blocked(limitbox):
                limitbox.lowlime.setValue(limits[row][0])
                limitbox.highlime.setValue(limits[row][1])
        self.changed.emit()

    def setParameters(self, params):
        if params:  # parameters were manually set somewhere else
            self.user_changed = True
        self.methodcb.setCurrentIndex(
            params.get("method", self.Integrators_classes.index(Integrate.Baseline)))
        self.set_all_limits(params.get("limits", [[0., 1.]]), user=False)

    def parameters(self):
        return {"method": self.methodcb.currentIndex(),
                "limits": self._limits}

    @staticmethod
    def createinstance(params):
        methodindex = params.get("method",
                                 IntegrateEditor.Integrators_classes.index(Integrate.Baseline))
        method = IntegrateEditor.Integrators_classes[methodindex]
        limits = params.get("limits", None)
        return Integrate(methods=method, limits=limits)

    def set_preview_data(self, data):
        if not self.user_changed:
            x = getx(data)
            if len(x):
                self.set_all_limits([[min(x), max(x)]])
                self.edited.emit()
예제 #19
0
class SwipableListWidget(QWidget):
    onElementClicked = pyqtSignal(str)

    def __init__(
        self,
        controller: TouchManagerController,
        model: TouchManagerModel,
    ):
        super(QWidget, self).__init__()
        self.model = model
        self.controller = controller
        self.main_layout = QGridLayout()
        self.scroller = QScrollArea()
        self.widget = QWidget()
        self.verticalLayout = QFormLayout()
        self.elementsDict = {}
        self.lastElementSelected = ""
        self.setupUI()
        self.setMinimumWidth(300)

    def setupUI(self):
        self.setContentsMargins(0, 0, 0, 0)
        self.setLayout(self.main_layout)
        self.main_layout.setContentsMargins(0, 0, 0, 0)
        self.widget.setLayout(self.verticalLayout)
        self.widget.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setSpacing(0)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.scroller.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        self.scroller.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.scroller.setWidgetResizable(True)
        self.scroller.setWidget(self.widget)
        self.scroller.setContentsMargins(0, 0, 0, 0)
        self.main_layout.addWidget(self.scroller)

    def addElement(self, button_name):
        button = QtWidgets.QPushButton(button_name)
        button.clicked.connect(partial(self._element_clicked, button_name))

        self.elementsDict[button_name] = button
        self.verticalLayout.addRow(self.elementsDict[button_name])

    def _element_clicked(self, name):
        self.onElementClicked.emit(name)

    def onSelectionChanged(self, btn_name):
        if self.lastElementSelected != "":
            self.elementsDict[self.lastElementSelected].setStyleSheet(
                "QPushButton { background-color : (225,225,225); }")
        self.elementsDict[btn_name].setStyleSheet(
            "background-color: rgb({}, {}, {})".format(self.model.ui_color[0],
                                                       self.model.ui_color[1],
                                                       self.model.ui_color[2]))
        self.lastElementSelected = btn_name

    def onDictChanged(self, new_source: dict):
        self.clearLayout()
        self.lastElementSelected = ""
        for button_pos in new_source.items():
            # button = QtWidgets.QPushButton("%s, %dx%d" %(button_pos[0], button_pos[1][0],button_pos[1][1]))
            self.addElement(button_pos[0])

    def clearLayout(self):
        self.elementsDict.clear()
        self.elementsDict = {}
        for i in reversed(range(self.verticalLayout.count())):
            self.verticalLayout.itemAt(i).widget().setParent(None)
예제 #20
0
class EventEditor (QDialog):
    applied = pyqtSignal(object)  # will send an Event instance

    def __init__(self, event, parent):
        super().__init__(parent)
        self.setWindowTitle('Event Editor')
        self.vbox = QVBoxLayout(self)
#        vbox.addWidget(QLabel(event.name))
        event_type_dropdown = QComboBox(self)
        custom_event_entries = []
        for code, evtype_base in script.fighter_event_types.items():
            if code in ['length', 'default']:
                continue
            for custom_code, evtype in evtype_base.items():
                text = f'{evtype["name"]} ({hex(custom_code)})'
                data = [code, custom_code]
                if custom_code != code:
                    custom_event_entries.append((text, data))
                else:
                    event_type_dropdown.addItem(text, data)
        for text, data in custom_event_entries:
            event_type_dropdown.addItem(text, data)
        event_type_dropdown.setCurrentIndex(event_type_dropdown.findData(event.code))
        event_type_dropdown.currentIndexChanged.connect(
                lambda: self.change_type(*event_type_dropdown.currentData())
                )
        self.vbox.addWidget(event_type_dropdown)

        form_widget = QWidget(self)
        self.vbox.addWidget(form_widget)
        self.form = QFormLayout(form_widget)
        self.event = event.copy()
        self.populate_form()

        buttons_widget = QWidget(self)
        buttons_hbox = QHBoxLayout(buttons_widget)
        ok_button = QPushButton('OK')
        ok_button.pressed.connect(lambda: self.apply(close=True))
        buttons_hbox.addWidget(ok_button)
        cancel_button = QPushButton('Cancel')
        cancel_button.pressed.connect(self.close)
        buttons_hbox.addWidget(cancel_button)
        apply_button = QPushButton('Apply')
        apply_button.pressed.connect(self.apply)
        buttons_hbox.addWidget(apply_button)
        self.vbox.addWidget(buttons_widget)

    def populate_form(self):
        self.field_entry = []
        for i, fd in enumerate(self.event.fields):
            entry = self.field_editor(fd['bits'], fd['type'])
            entry.set_value(self.event[i])
            entry.editingFinished.connect(
                    lambda i=i, entry=entry: self.field_edited(i, entry.value())
                    )
            self.field_entry.append(entry)
            self.form.addRow(fd['name'], entry)

        self.raw_edit = self.field_editor([0, self.event.length*8 - 1], 'h')
        self.raw_edit.set_value(int(self.event))
        self.raw_edit.editingFinished.connect(self.raw_changed)
        self.form.addRow('Raw', self.raw_edit)

    def change_type(self, code, custom_code):
        self.event = script.FighterEvent.blank(code, custom_code)
        while self.form.count():
            self.form.removeRow(0)
        app.processEvents(QEventLoop.ExcludeUserInputEvents)
        self.resize(self.sizeHint());
        app.processEvents(QEventLoop.ExcludeUserInputEvents)
        self.resize(self.sizeHint());
        self.populate_form()
        app.processEvents(QEventLoop.ExcludeUserInputEvents)

    def raw_changed(self):
        self.event._data = self.raw_edit.value()
        self.update_fields()

    def field_edited(self, field, value):
        self.event[field] = value
        self.raw_edit.set_value(int(self.event))

    def update_fields(self):
        for i, entry in enumerate(self.field_entry):
            entry.set_value(self.event[i])

    def apply(self, close=False):
        if close:
            self.close()
        self.applied.emit(self.event)

    def field_editor(self, bit_range, type_str):
        if type_str == 'u':
            return self.IntFieldEntry(bit_range[1]-bit_range[0]+1, False, self)
        elif type_str == 's':
            return self.IntFieldEntry(bit_range[1]-bit_range[0]+1, True, self)
        elif type_str == 'h':
            byte_length = (bit_range[1] - bit_range[0] + 1)/8
            if not byte_length.is_integer():
                raise ValueError('Hex field length is not a multiple of 8 bits')
            return self.HexFieldEntry(byte_length, self)
        elif type_str == 'f':
            byte_length = (bit_range[1] - bit_range[0] + 1)/8
            if not byte_length == 4:
                raise ValueError('Float field length is not 32 bits')
            return self.FloatFieldEntry(False, self)
        elif type_str == 'f-upper':
            byte_length = (bit_range[1] - bit_range[0] + 1)/8
            if not byte_length == 2:
                raise ValueError('Upper-Half Float field length is not 16 bits')
            return self.FloatFieldEntry(True, self)

    class HexFieldEntry (QLineEdit):
        # Always an even number of bytes
        # should change to using a spinbox that displays hex instead of decimal
        value_changed = pyqtSignal(int)

        def __init__(self, byte_length, parent=None):
            super().__init__(parent)
            self.length = int(byte_length)
            case_char = '>' if hex_caps else '<'
            self.setInputMask(case_char + ' '.join(['HH']*self.length) + '')
            font = QFont('Hexedit-monospace')
            font.setStyleHint(QFont.Monospace)
            self.setFont(font)
            self.sizeHint = lambda: QSize(
                    self.fontMetrics().width(self.text() + '   '),
                    self.fontMetrics().height()*1.2,
                    )
            self.minimumSizeHint = self.sizeHint
            self.sizePolicy().setVerticalPolicy(QSizePolicy.Fixed)
            self.sizePolicy().setHorizontalPolicy(QSizePolicy.Minimum)
            self.updateGeometry()

            self.textChanged.connect(
                    lambda: self.value_changed.emit(self.value())
                    )

        def keyPressEvent(self, ev):
            if ev.key() in [Qt.Key_Shift, Qt.Key_Control, Qt.Key_Left,
                            Qt.Key_Right, Qt.Key_Up, Qt.Key_Down]:
                return super().keyPressEvent(ev)
            if self.selectedText():
                self.setCursorPosition(self.selectionStart())
                self.deselect()
            if ev.key() not in [Qt.Key_Backspace, Qt.Key_Delete]:
                super().keyPressEvent(ev)

        def value(self):
            return int(super().text().replace(' ', ''), base=16)

        def set_value(self, int_value):
            self.setText(format(int_value, '0' + str(2*self.length) + 'x'))

    class IntFieldEntry (QSpinBox):
        # May be any number of bits wide
        def __init__(self, bit_width, signed, parent=None):
            super().__init__(parent)
            if signed:
                self.setMaximum(2**(bit_width-1) - 1)
                self.setMinimum(-2**(bit_width-1))
            else:
                self.setMaximum(2**bit_width - 1)
                self.setMinimum(0)

        def set_value(self, val):
            super().setValue(val)  # to match naming of other entry boxes

    class FloatFieldEntry (QDoubleSpinBox):
        # Always 32 bits
        Float = struct.Struct('>f')
        Int = struct.Struct('>I')

        def __init__(self, upper_only=False, parent=None):
            super().__init__(parent)
            self.setSingleStep(0.1)
            self.setDecimals(2)
            if upper_only:
                self.shift = 16
                self.setMaximum(self.from_raw(0x7F7F))
                self.setMinimum(self.from_raw(0xFF7F))
            else:
                self.shift = 0
                self.setMaximum(self.from_raw(0x7F7FFFFF))
                self.setMinimum(self.from_raw(0xFF7FFFFF))

        def to_raw(self, float_val):
            return self.Int.unpack(self.Float.pack(float_val))[0] >> self.shift

        def from_raw(self, raw_val):
            return self.Float.unpack(self.Int.pack(raw_val << self.shift))[0]

        def set_value(self, val):
            super().setValue(val)
예제 #21
0
class RemoteWidgetEdit(QDialog):
    """
    Creates a dialog to add and edit remote widgets of different types
    """
    def __init__(self, editWidget=False, **kwargs):
        parent = kwargs.get('parent', None)
        super(RemoteWidgetEdit, self).__init__(parent)
        self.widgetType = kwargs.get('widgetType', 'PushButton')
        self.name = kwargs.get('name', 'New')
        self.valueOn = str(kwargs.get('valueOn', 0.0))
        self.valueOff = str(kwargs.get('valueOff', 0.0))
        self.minSlider = str(kwargs.get('minSlider', 0))
        self.maxSlider = str(kwargs.get('maxSlider', 1))
        self.stepSlider = str(kwargs.get('stepSlider', 1))
        self.shortcut = str(kwargs.get('shortcut', ""))
        self.shortcutPlus = str(kwargs.get('shortcutPlus', ""))
        self.shortcutMinus = str(kwargs.get('shortcutMinus', ""))

        self.curModule = kwargs.get('module', None)
        self.curParameter = kwargs.get('parameter', None)

        self.editWidget = editWidget

        self.minSliderText = None
        self.maxSliderText = None
        self.stepSliderText = None
        self.valueOffText = None
        self.valueOnText = None
        self.valueText = None
        self.shortcutField = None
        self.shortcutFieldPlus = None
        self.shortcutFieldMinus = None

        mainLayout = QFormLayout()

        self.nameText = QLineEdit(self.name)
        mainLayout.addRow(QLabel("Name"), self.nameText)
        self.nameText.mousePressEvent = lambda event: self.nameText.selectAll()

        self.typeList = QComboBox()
        self.typeList.addItems(["PushButton", "Switch", "Slider"])
        self.typeList.setCurrentText(self.widgetType)
        self.typeList.currentIndexChanged.connect(self.typeListChanged)
        self.typeList.setEnabled(not self.editWidget)
        mainLayout.addRow(QLabel("Widget type"), self.typeList)

        self.moduleList = QComboBox()
        self.paramList = QComboBox()
        self.modules = dict()
        exp = kwargs.get('exp', None)
        for key, value in exp.items():
            self.modules[key] = [k for k, v in value.items()]

            self.moduleList.addItem(key)

        self.moduleList.currentIndexChanged.connect(self.moduleChanged)
        if self.curModule is None:
            self.moduleList.setCurrentIndex(0)
            self.moduleChanged()
        else:
            self.moduleList.setCurrentText(self.curModule)
            self.moduleChanged()

        if self.curParameter is not None:
            self.paramList.setCurrentText(self.curParameter)

        mainLayout.addRow(QLabel("Modules:"), self.moduleList)
        mainLayout.addRow(QLabel("Parameter:"), self.paramList)

        self.settingsWidget = QWidget()
        self.settingsWidgetLayout = QFormLayout()
        self.settingsWidget.setLayout(self.settingsWidgetLayout)
        mainLayout.addRow(self.settingsWidget)

        self.typeListChanged()

        self.setLayout(mainLayout)

        # OK and Cancel buttons
        buttons = QDialogButtonBox(
            QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self)
        buttons.accepted.connect(self.accept)
        buttons.rejected.connect(self.reject)
        mainLayout.addWidget(buttons)

        self.setWindowTitle("Add Remote Widget ...")
        resPath = getResource("icon.svg")
        self.icon = QIcon(resPath)
        self.setWindowIcon(self.icon)
        self.setFixedSize(self.sizeHint())

    def typeListChanged(self):
        for i in reversed(range(self.settingsWidgetLayout.count())):
            self.settingsWidgetLayout.itemAt(i).widget().deleteLater()

        height = QLineEdit().sizeHint().height()

        if self.typeList.currentText() == "PushButton":
            self.valueText = QLineEdit(self.valueOn)
            self.settingsWidgetLayout.addRow(QLabel("Value"), self.valueText)
            self.valueText.setValidator(QDoubleValidator())
            self.valueText.mousePressEvent = lambda event: self.valueText.selectAll(
            )
            self.shortcutField = ShortcutCreator()
            self.shortcutField.setText(self.shortcut)
            self.settingsWidgetLayout.addRow(QLabel("Shortcut:"),
                                             self.shortcutField)
            dummy = QLabel("")
            dummy.setFixedHeight(height)
            self.settingsWidgetLayout.addRow(None, dummy)
            dummy2 = QLabel("")
            dummy2.setFixedHeight(height)
            self.settingsWidgetLayout.addRow(None, dummy2)
            dummy3 = QLabel("")
            dummy3.setFixedHeight(height)
            self.settingsWidgetLayout.addRow(None, dummy3)
        elif self.typeList.currentText() == "Switch":
            self.valueOnText = QLineEdit(self.valueOn)
            self.settingsWidgetLayout.addRow(QLabel("Value On"),
                                             self.valueOnText)
            self.valueOnText.setValidator(QDoubleValidator())
            self.valueOnText.mousePressEvent = lambda event: self.valueOnText.selectAll(
            )
            self.valueOffText = QLineEdit(self.valueOff)
            self.settingsWidgetLayout.addRow(QLabel("Value Off"),
                                             self.valueOffText)
            self.valueOffText.mousePressEvent = lambda event: self.valueOffText.selectAll(
            )
            self.valueOffText.setValidator(QDoubleValidator())
            self.shortcutField = ShortcutCreator()
            self.shortcutField.setText(self.shortcut)
            self.settingsWidgetLayout.addRow(QLabel("Shortcut:"),
                                             self.shortcutField)
            dummy = QLabel("")
            dummy.setFixedHeight(height)
            self.settingsWidgetLayout.addRow(None, dummy)
            dummy2 = QLabel("")
            dummy2.setFixedHeight(height)
            self.settingsWidgetLayout.addRow(None, dummy2)
        elif self.typeList.currentText() == "Slider":
            self.maxSliderText = QLineEdit(str(self.maxSlider))
            self.settingsWidgetLayout.addRow(QLabel("Max"), self.maxSliderText)
            self.maxSliderText.setValidator(QDoubleValidator())
            self.maxSliderText.mousePressEvent = lambda event: self.maxSliderText.selectAll(
            )
            self.minSliderText = QLineEdit(str(self.minSlider))
            self.settingsWidgetLayout.addRow(QLabel("Min"), self.minSliderText)
            self.minSliderText.setValidator(QDoubleValidator())
            self.minSliderText.mousePressEvent = lambda event: self.minSliderText.selectAll(
            )
            self.stepSliderText = QLineEdit(str(self.stepSlider))
            self.settingsWidgetLayout.addRow(QLabel("Step Size"),
                                             self.stepSliderText)
            self.stepSliderText.setValidator(QDoubleValidator())
            self.stepSliderText.mousePressEvent = lambda event: self.stepSliderText.selectAll(
            )
            self.shortcutFieldPlus = ShortcutCreator()
            self.shortcutFieldPlus.setText(self.shortcutPlus)
            self.settingsWidgetLayout.addRow(QLabel("Shortcut Plus:"),
                                             self.shortcutFieldPlus)
            self.shortcutFieldMinus = ShortcutCreator()
            self.shortcutFieldMinus.setText(self.shortcutMinus)
            self.settingsWidgetLayout.addRow(QLabel("Shortcut Minus:"),
                                             self.shortcutFieldMinus)

    def moduleChanged(self):
        self.paramList.clear()
        module = self.moduleList.currentText()

        for p in self.modules[module]:
            self.paramList.addItem(p)

    def _getData(self):
        msg = dict()
        msg['name'] = self.nameText.text()
        msg['widgetType'] = self.typeList.currentText()
        msg['module'] = self.moduleList.currentText()
        msg['parameter'] = self.paramList.currentText()

        if self.typeList.currentText() == "PushButton":
            msg['valueOn'] = self.valueText.text()
            msg['shortcut'] = self.shortcutField.getKeySequence()
        elif self.typeList.currentText() == "Switch":
            msg['valueOn'] = self.valueOnText.text()
            msg['valueOff'] = self.valueOffText.text()
            msg['shortcut'] = self.shortcutField.getKeySequence()
        elif self.typeList.currentText() == "Slider":
            msg['minSlider'] = self.minSliderText.text()
            msg['maxSlider'] = self.maxSliderText.text()
            msg['stepSlider'] = self.stepSliderText.text()
            msg['shortcutPlus'] = self.shortcutFieldPlus.getKeySequence()
            msg['shortcutMinus'] = self.shortcutFieldMinus.getKeySequence()

        return msg

    @staticmethod
    def getData(exp=None, editWidget=False, **kwargs):
        dialog = RemoteWidgetEdit(exp=exp, editWidget=editWidget, **kwargs)
        result = dialog.exec_()
        msg = dialog._getData()

        if msg['widgetType'] == "Slider":
            if msg['parameter'] in exp[msg['module']]:
                msg['startValue'] = exp[msg['module']][msg['parameter']]
            else:
                msg['startValue'] = 0

        return msg, result == QDialog.Accepted
예제 #22
0
class DetailView(QSplitter):
    openFileSignal = pyqtSignal()
    openPDFSignal = pyqtSignal()

    def __init__(self):
        super(DetailView, self).__init__()
        self.setOrientation(Qt.Vertical)
        self.form = QFormLayout()
        self.toc = QTreeWidget()
        self.toc.setColumnCount(1)
        self.toc.setHeaderLabels(["目录"])
        self.toc.setFont(QFont("", 14))
        self.scrollarea = QScrollArea()
        self.scrollarea.setFont(QFont("", 14))
        self.scrollarea.setFrameShape(QFrame.NoFrame)
        self.addWidget(self.scrollarea)
        self.addWidget(self.toc)
        self.setSizes([450, 350])

    def updateToC(self, toc):
        self.toc.clear()
        floorlist = [0]
        nodelist = [self.toc]
        for line in toc:
            layer, title = line
            while floorlist[-1] >= layer:
                floorlist.pop()
                nodelist.pop()
            node = QTreeWidgetItem(nodelist[-1])
            node.setText(0, title)
            floorlist.append(layer)
            nodelist.append(node)

    def deleteForm(self):
        while self.form.count():
            item = self.form.takeAt(0)

    def updateView(self, note: Note):
        self.deleteForm()
        namelabel = QLabel("文件名")
        ctimelabel = QLabel("创建时间")
        atimelabel = QLabel("访问时间")
        mtimelabel = QLabel("修改时间")
        filelabel = QLabel("文件")
        pdflabel = QLabel("链接")
        taglabel = QLabel("标签")
        name = QLabel("未知")
        ctime = QLabel("未知")
        atime = QLabel("未知")
        mtime = QLabel("未知")
        file = MyLabel("无")
        pdf = MyLabel("无")
        tag = MyLabel("无")
        if note.name:
            name.setText(note.name)
            self.form.addRow(namelabel, name)
        if note.create_time:
            ctime.setText(note.create_time)
            self.form.addRow(ctimelabel, ctime)
        if note.visit_time:
            atime.setText(note.visit_time)
            self.form.addRow(atimelabel, atime)
        if note.mod_time:
            mtime.setText(note.mod_time)
            self.form.addRow(mtimelabel, mtime)
        if note.file_path:
            file.setText("<a style='color: blue'>{}</a>".format(
                note.file_path))
            self.form.addRow(filelabel, file)
            file.clicked.connect(lambda: self.openFile(note.file_path))
        if note.pdf_path:
            base, hfile = os.path.split(note.pdf_path)
            pdfname, sufix = os.path.splitext(hfile)
            pdf.setText("<a style='color: blue'>{}</a>".format(pdfname))
            self.form.addRow(pdflabel, pdf)
            pdf.clicked.connect(lambda: self.openFile(note.pdf_path))
        if note.tags:
            tag.setText(strSetToString(note.tags))
            self.form.addRow(taglabel, tag)
        tempWidget = QWidget()
        tempWidget.setLayout(self.form)
        self.scrollarea.setWidget(tempWidget)
        self.updateToC(note.getToC())

    def openFile(self, file_path):
        os.system('explorer /select, {}'.format(os.path.abspath(file_path)))
예제 #23
0
class LiftHistory(QScrollArea):
  def __init__(self):
    super().__init__()
    self.db_wrapper = DatabaseWrapper()
    self.table_name = "Compound Exercises"
    self.setStyleSheet("""
    QWidget{
      background-color: #232120;
      font-weight: bold;
      color:#c7c7c7;
    }
    QPushButton{
      background-color: rgba(0, 0, 0, 0);
      border: 1px solid;
      font-size: 18px;
      font-weight: bold;
      border-color: #808080;
      min-height: 28px;
      white-space:nowrap;
      text-align: center;
      padding-left: 5%;
      font-family: Montserrat;
    }
    QPushButton:hover:!pressed{
      border: 2px solid;
      border-color: #747474;
    }
    QPushButton:pressed{
      border: 2px solid;
      background-color: #323232;
    }
    """)
    self.setWindowFlags(Qt.FramelessWindowHint | Qt.Tool)
    self.setWindowModality(Qt.ApplicationModal)
    self.units = "kg" if self.db_wrapper.fetch_local_column("Users", "units") == "metric" else "lb"
    self.setWindowTitle("Lift History")
    
    widget = QWidget()
    self.layout = QFormLayout(widget)
    
    self.setWidget(widget)
    self.setWidgetResizable(True)
    self.create_history(True, True)

  @pyqtSlot(bool)
  def create_history(self, create, init_layout=False):
    exercise_label = QLabel("Exercise")
    exercise_label.setAlignment(Qt.AlignCenter)
    delete_label = QLabel("Delete")
    delete_label.setAlignment(Qt.AlignCenter)

    helper_layout = QFormLayout()
    
    helper_layout.addRow(exercise_label, delete_label)

    self.lift_history = self.db_wrapper.fetch_local_column(self.table_name, "lift_history")
    if create and not self.lift_history == None:
      if not init_layout:
        if not self.db_wrapper.connection_exists: return
        self.delete_history()
      lift_history = json.loads(self.lift_history)
      self.labels = [None] * len(lift_history)
      self.delete_buttons = [None] * len(lift_history)

      for i in range(len(lift_history)):
        self.labels[i] = QLabel(self)
        self.delete_buttons[i] = QPushButton("X", self)
      
      for j, exercise in enumerate(lift_history):
        try:
          self.labels[j].setText(": ".join([exercise[0], " ".join([exercise[1], self.units])]))
        except TypeError: # joining lift for reps as 1RM lift 
          self.labels[j].setText(": ".join([exercise[0], " ".join(["x".join(exercise[1]), self.units])]))
        
        self.delete_buttons[j].setProperty("entry_index", exercise[-1])
        self.delete_buttons[j].clicked.connect(partial(self.delete_history_entry_from_layout, j, self.delete_buttons[j].property("entry_index")))
        
        helper_layout.addRow(self.labels[j], self.delete_buttons[j])

    scroll_area = QScrollArea()
    scroll_area.setContentsMargins(3, 3, 3, 3)
    scroll_area.setWidgetResizable(True)
    helper_widget = QWidget()
    helper_widget.setLayout(helper_layout)
    scroll_area.setWidget(helper_widget)
    self.layout.addRow(scroll_area)

    close_button = QPushButton("Close")
    close_button.clicked.connect(lambda:self.close())
    self.layout.addRow(close_button)

  def delete_history(self):
    for i in reversed(range(self.layout.count())):
      self.layout.itemAt(i).widget().setParent(None)
  
  def delete_history_entry_from_layout(self, i, entry_index):
    self.labels[i].setParent(None)
    self.delete_buttons[i].setParent(None)
    history = json.loads(self.db_wrapper.fetch_local_column(self.table_name, "lift_history"))
    lift_history = [lift for lift in history if not lift[-1] == entry_index]
    if len(lift_history) == 0: lift_history = None
    else: lift_history = json.dumps(lift_history)
    self.db_wrapper.update_table_column(self.table_name, "lift_history", lift_history, True)
예제 #24
0
class AddSystem(QDialog):
    def __init__(self, parent=None, flags=QtCore.Qt.WindowFlags()):
        super(AddSystem, self).__init__(parent=parent, flags=flags)
        self.setWindowTitle(TEXT.DIALOG_TITLE)
        self.setLayout(QVBoxLayout())

        self.setupContent()

        btnBox = QDialogButtonBox(QDialogButtonBox.Ok
                                  | QDialogButtonBox.Cancel)
        btnBox.accepted.connect(self.accept)
        btnBox.rejected.connect(self.reject)
        btnBox.button(QDialogButtonBox.Ok).setText(TEXT.BTN_CREATE)
        btnBox.button(QDialogButtonBox.Cancel).setText(TEXT.BTN_CANCEL)
        self.layout().addWidget(btnBox)

    def setupContent(self):
        self.Content = QWidget(self)
        self.layout().addWidget(self.Content)
        self.FormLayout = QFormLayout()
        self.Content.setLayout(self.FormLayout)

        self.error = QtWidgets.QLabel(TEXT.LB_ERR_CORRECT_DATA,
                                      objectName='error')
        self.FormLayout.addWidget(self.error)

        self.sys = QComboBox()
        self.sys.addItem(TEXT.EXP)
        # self.sys.addItem("Վեյբուլ")
        # self.system.currentIndexChanged.connect(self.systemChanged)

        self.sysType = [
            (QRadioButton(TEXT.NOT_BACKUP, objectName='0'),
             QRadioButton(TEXT.BACKUP, objectName='1')),
        ]
        self.btnGroupOne = QButtonGroup(self)
        self.btnGroupOne.addButton(self.sysType[0][0])
        self.btnGroupOne.addButton(self.sysType[0][1])
        self.sysType[0][0].setChecked(True)
        self.groupOne = True
        self.btnGroupOne.buttonClicked.connect(self.onClickedTypeOne)

        self.FormLayout.addRow(QLabel(TEXT.LB_SYSTEM_TYPE), self.sys)
        self.FormLayout.addRow(self.sysType[0][0], self.sysType[0][1])

    def onClickedTypeOne(self, btn):
        if btn.objectName() == '1' and self.groupOne:
            self.groupOne = False
            self.sysType.append((QRadioButton(TEXT.REPLACEMENT,
                                              objectName='0'),
                                 QRadioButton(TEXT.PERMANENT, objectName='1')))
            self.btnGroupTwo = QButtonGroup(self)
            self.btnGroupTwo.addButton(self.sysType[1][0])
            self.btnGroupTwo.addButton(self.sysType[1][1])
            self.sysType[1][1].setChecked(True)
            self.FormLayout.addRow(self.sysType[1][0], self.sysType[1][1])

            self.sysType.append((QRadioButton(TEXT.BY_ELEMENTS,
                                              objectName='0'),
                                 QRadioButton(TEXT.WHOLE, objectName='1')))
            self.btnGroupThree = QButtonGroup(self)
            self.btnGroupThree.addButton(self.sysType[2][0])
            self.btnGroupThree.addButton(self.sysType[2][1])
            self.sysType[2][0].setChecked(True)
            self.groupThree = True
            self.btnGroupThree.buttonClicked.connect(self.onClickedTypeThree)
            self.FormLayout.addRow(self.sysType[2][0], self.sysType[2][1])
            self.isSame = QCheckBox(TEXT.LB_THE_SAME_VALUE)
            self.FormLayout.addWidget(self.isSame)

            self.row = QLineEdit()
            self.row.setPlaceholderText(TEXT.LEP_1_OR_MORE)
            regexp = QtCore.QRegExp('^([1-9]\\d{0,1})$')
            validator = QRegExpValidator(regexp)  # QIntValidator(1, 15)
            self.row.setValidator(validator)
            self.row.textChanged.connect(self.check_state)
            self.row.textChanged.emit(self.row.text())

            self.FormLayout.addRow(QLabel(TEXT.LB_THE_BACKUP_ELM_COUNT),
                                   self.row)
        elif btn.objectName() == '0' and not self.groupOne:
            self.groupOne = True
            self.sysType = self.sysType[:1]
            for i in range(5, self.FormLayout.count(), 2):
                self.FormLayout.removeRow(3)

    def onClickedTypeThree(self, btn):
        if btn.objectName() == '1' and self.groupThree:
            self.groupThree = False
            self.col = QLineEdit()
            self.col.setPlaceholderText(TEXT.LEP_2_OR_MORE)
            regexp = QtCore.QRegExp('^([2-9]\\d{0,1})$')
            validator = QRegExpValidator(regexp)  # QIntValidator(1, 15)
            self.col.setValidator(validator)
            self.col.textChanged.connect(self.check_state)
            self.col.textChanged.emit(self.row.text())

            self.FormLayout.addRow(QLabel(TEXT.LB_THE_SYSTEM_ELM_COUNT),
                                   self.col)
        elif btn.objectName() == '0' and not self.groupThree:
            self.groupThree = True
            self.FormLayout.removeRow(7)

    def CreateSystem(self):
        switch = {0: self.exponential, 1: self.weibull}
        return switch.get(self.System.SysConfig['system'])()

    def exponential(self):
        grid = QHBoxLayout()
        wdg = QWidget()
        wdg.setLayout(grid)

        if self.System.SysConfig['isSame']:
            rows = 0
        else:
            rows = self.System.SysConfig["row"]

        self.System.lmds = []
        for col in range(self.System.SysConfig["col"]):
            f, w = QFormLayout(), QWidget()
            w.setLayout(f)
            grid.addWidget(w)
            self.System.lmds.append([])
            for row in range(rows + 1):
                self.System.lmds[col].append(QLineEdit())
                f.addRow(QLabel(f"λ[{row}][{col}]:"),
                         self.System.lmds[col][row])

        self.System.layout().addWidget(wdg)

    def weibull(self):
        pass

    @pyqtSlot()
    def accept(self) -> None:
        try:
            isOne = int(self.btnGroupOne.checkedButton().objectName())
            typeText = f'{self.sys.currentText()} համակարգ'
            typeText += f'\n{self.btnGroupOne.checkedButton().text()}'
            if isOne == 1:
                row = int(self.row.text())
                isTwo = self.btnGroupTwo.checkedButton().objectName()
                isThree = self.btnGroupThree.checkedButton().objectName()
                typeText += f'/{row}' \
                            f'\n{self.btnGroupThree.checkedButton().text()}'

                if isThree == '1':
                    col = int(self.col.text())
                    typeText += f'/{col}'

                typeText += f'\n{self.btnGroupTwo.checkedButton().text()}'
                if self.isSame.isChecked():
                    typeText += f'\n{self.isSame.text()}'
        except:
            self.error.setText(TEXT.LB_ERR_WRONG_DATA)
            self.error.show()
            return

        self.error.hide()

        self.System = QWidget()
        self.parent().Systems.layout().addWidget(self.System)
        self.parent().SystemList.append(self.System)

        form = QtWidgets.QFormLayout()
        self.System.setLayout(form)

        toolBar = QToolBar(self.System)
        remove = QAction(TEXT.BTN_DELETE, self.System)
        remove.triggered.connect(self.parent().RemoveCtrl)
        toolBar.addAction(remove)
        # edit = QAction('Խմբագրել', self.System)
        # toolBar.addAction(edit)
        form.addWidget(toolBar)

        self.System.SysConfig = {
            'system': self.sys.currentIndex(),
            'row': row if isOne == 1 else 0,
            'col': col if isOne == 1 and isThree == "1" else 1,
            'typeOne': isOne,
            'typeTwoAndThree': isTwo + isThree if isOne == 1 else None,
            # 'typeThree': isThree if isOne else None,
            'isSame': self.isSame.isChecked() if isOne == 1 else None,
        }

        # form.addWidget(QLabel(f'{self.System.SysConfig["system"][1]} համակարգ'))
        # typeText = f'{self.System.SysConfig["typeOne"][1]}/{self.System.SysConfig["row"]}'
        # if self.System.SysConfig["typeOne"][0]:
        #     typeText += f'\n{self.System.SysConfig["typeThree"][1]}/{self.System.SysConfig["col"]}' \
        #                 f'\n{self.System.SysConfig["typeTwo"][1]}'
        #     if self.System.SysConfig["isSame"][0]:
        #         typeText += f'\n{self.System.SysConfig["isSame"][1]}'
        form.addWidget(QLabel(typeText))

        self.CreateSystem()

        self.parent().calc.setEnabled(True)
        self.close()

    def check_state(self, *args, **kwargs):
        sender = self.sender()
        validator = sender.validator()
        state = validator.validate(sender.text(), 0)[0]
        if state == QValidator.Acceptable:
            color = '#c4df9b'  # green
        elif state == QValidator.Intermediate:
            color = '#fff79a'  # yellow
        else:
            color = '#f6989d'  # red
        sender.setStyleSheet('QLineEdit { background-color: %s }' % color)
예제 #25
0
class HomeWidget(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()  #testing

        self.liveTrades = {}
        self.buyList = []
        self.sellList = []
        self.change = 0  #difference gained or loss from trades

        self.high = 0
        self.low = 10000000
        self.price = 0
        self.currentPrice = 0
        self.tempPrice = 0  #to hold value every 19th iterations used to determine short term trend
        self.counter = 0  # to count 19th iterations and reset
        self.tradeCount = 0

        #for temp highs and lows
        self.tempHigh = 0
        self.tempLow = 10000000
        #self.rootPassword=""

        #QtWidgets.QMainWindow.__init__(self)
        #super(HomeWidget, self).__init__()
        self.initUI()
        self.scrollSize = 100  #should update to count of live datas
        self.setWindowTitle("PyTradeBot")
        #self.setGeometry(0, 0, 800, 650)
        #self.setGeometry(0, 0, 1000, 750)
        self.showMaximized(
        )  # maximizes screen without going into full screen mode

        #for the minimized screen, to center it
        #screen_center = lambda \
        #widget: app.desktop().screen().rect().center() - widget.rect().center()  # determines center of view
        #self.move(screen_center(self))  # move to center

        # sets background color
        p = self.palette()
        p.setColor(self.backgroundRole(),
                   Qt.lightGray)  # set background color of widget to green
        self.setPalette(p)

        #title label
        self.label1 = QLabel("PyTradeBot")
        self.label1.setFont(QtGui.QFont("Courier", 72, QtGui.QFont.Bold))
        self.label1.setAlignment(QtCore.Qt.AlignCenter)

        #Right column labels
        #1/2
        self.priceLabel = QLabel("Price: ")
        self.priceLabel.setFont(QtGui.QFont("Courier", 12, QtGui.QFont.Bold))
        self.highPriceLabel = QLabel("High: " + str(self.high))
        self.highPriceLabel.setFont(
            QtGui.QFont("Courier", 12, QtGui.QFont.Bold))
        self.lowPriceLabel = QLabel("Low: " + str(self.low))
        self.lowPriceLabel.setFont(QtGui.QFont("Courier", 12,
                                               QtGui.QFont.Bold))
        #2/2
        self.trendLabel = QLabel("Trend: ")
        self.trendLabel.setFont(QtGui.QFont("Courier", 12, QtGui.QFont.Bold))
        self.tradeCountLabel = QLabel("Buy Trades: ")
        self.tradeCountLabel.setFont(
            QtGui.QFont("Courier", 12, QtGui.QFont.Bold))
        self.returnLabel = QLabel("Sell Trades: ")
        self.returnLabel.setFont(QtGui.QFont("Courier", 12, QtGui.QFont.Bold))

        self.accountValueSQL = "SELECT `wallet` FROM `account` WHERE `account_id`>0"  # to retrieve wallet value, set to arbitrary 100,000 upon creation
        self.walletReturn = self.connectDB(self.accountValueSQL)
        #print(self.walletReturn)
        #print(self.walletReturn[0]['wallet'])

        self.nowPrice = self.walletReturn[0][
            'wallet']  # price to update wallet upon trades

        #Horizontal labels
        self.labelH = QLabel("  Price     Quantity      Time")
        self.labelH.setFont(QtGui.QFont("Courier", 12, QtGui.QFont.Bold))

        self.labelH2 = QLabel("$" + str(self.walletReturn[0]['wallet']))
        self.labelH2.setFont(QtGui.QFont("Courier", 36, QtGui.QFont.Bold))

        self.emptyLabel = QLabel(" ")  # to add an empty line

        self.graphWidget = pg.PlotWidget()
        self.x = []
        self.xLow = []
        self.xHigh = []
        self.y = []
        self.yLow = []
        self.yHigh = []

        #adjusting main plot view size

        self.graphWidget.setMaximumHeight(492)

        self.graphWidget.setBackground('w')
        self.graphWidget.addLegend(
        )  #to add graph legend 'name="Ethereum/USDT"'
        #self.pen = pg.mkPen(color=(100, 100, 0)) #ugly puke color
        self.pen = pg.mkPen(color=(0, 100, 100), width=6)
        self.graphWidget.plot(self.x,
                              self.y,
                              pen=self.pen,
                              name="Ethereum USD / Trade")

        #vertical box for layout
        self.vbox = QVBoxLayout()
        self.vbox.addWidget(self.label1)

        self.hbox3 = QHBoxLayout()
        self.hbox3.addWidget(self.labelH)
        self.hbox3.addWidget(self.labelH2)

        self.vbox.addLayout(self.hbox3)

        #vertical box 2 for layout
        self.vbox2 = QVBoxLayout()

        self.vbox3 = QVBoxLayout()
        self.vbox3.addWidget(self.highPriceLabel)
        self.vbox3.addWidget(self.priceLabel)
        self.vbox3.addWidget(self.lowPriceLabel)

        self.vbox4 = QVBoxLayout()
        self.vbox4.addWidget(self.trendLabel)
        self.vbox4.addWidget(self.tradeCountLabel)
        self.vbox4.addWidget(self.returnLabel)

        # new for testing
        self.formLayout2 = QFormLayout()
        self.groupBox2 = QGroupBox("Incoming Data Stream")  #2

        self.scrollBox2 = QScrollArea()
        self.scrollBox2.setWidget(self.groupBox2)
        self.scrollBox2.setWidgetResizable(True)
        self.scrollBox2.setFixedHeight(492)
        self.scrollBox2.setFixedWidth(300)

        self.hbox = QHBoxLayout()
        self.hbox.addWidget(self.scrollBox2)
        self.hbox.addWidget(self.graphWidget)
        self.hbox.addLayout(self.vbox3)
        self.hbox.addLayout(self.vbox4)

        self.hbox2 = QHBoxLayout()

        self.cbuysbtn = QPushButton("Show buy trades")
        self.cbuysbtn.setMaximumWidth(150)
        self.cbuysbtn.setMinimumWidth(150)
        self.cbuysbtn.clicked.connect(
            self.buybtn_clicked)  #function called when clicked
        self.csellsbtn = QPushButton("Show sell trades")
        self.csellsbtn.setMaximumWidth(150)
        self.csellsbtn.setMinimumWidth(150)
        self.csellsbtn.clicked.connect(self.sellbtn_clicked)

        self.hbox2.addWidget(self.cbuysbtn)
        self.hbox2.addWidget(self.csellsbtn)

        #for bottom main live data
        self.formLayout = QFormLayout()
        self.groupBox = QGroupBox("Incoming Data Stream")
        self.formLayout.addRow(QLabel("awaiting data..."))
        #self.formLayout.addRow(QLabel(str(len(data))))

        #move this to above
        self.dataList = []

        #self.vbox2.addWidget(self.formLayout)
        self.groupBox.setLayout(self.formLayout)
        self.groupBox2.setLayout(self.formLayout2)

        #scroll box main bottom with live data
        self.scrollBox = QScrollArea()
        self.scrollBox.setWidget(self.groupBox)
        self.scrollBox.setWidgetResizable(True)
        self.scrollBox.setFixedHeight(120)
        #self.scrollBox.setFixedWidth(350)

        self.vbox.addLayout(self.hbox)
        self.vbox.addLayout(self.hbox2)
        self.vbox.addLayout(self.vbox2)
        self.vbox.addWidget(self.scrollBox)
        self.setLayout(self.vbox)
        self.vbox.setAlignment(Qt.AlignTop | Qt.AlignCenter)

        #the magic
        self._update_timer = QtCore.QTimer()
        self._update_timer.timeout.connect(self.updateLabel)
        self._update_timer.start(10)  #100

        self.update()

        #TESTING
    def initUI(self):
        self.thread = QThread()
        self.worker = Worker()
        self.worker.moveToThread(self.thread)

        self.thread.started.connect(self.worker.do_work)
        #self.formLayout.addRow(QLabel("noob"))
        self.thread.finished.connect(self.thread.deleteLater)

        self.thread.start()

    def updateLabel(self):
        try:
            for item in newData:
                pyObject = json.loads(item)

                if item not in self.dataList and pyObject['type'] != "ping":
                    self.currentPrice = float(self.getPrice(item))
                    if len(self.buyList) > 0 and len(self.buyList) != len(
                            self.sellList):
                        if self.checkStopLoss(self.currentPrice) == True:
                            #sell
                            self.sellList.append(self.currentPrice)
                            self.returnLabel.setText("Sell Trades: " +
                                                     str(len(self.sellList)))
                            self.length = len(self.buyList)
                            self.change = self.change + self.buyList[
                                self.length - 1] - self.currentPrice
                            self.nowPrice = self.nowPrice + self.change
                            self.labelH2.setText(
                                "$" +
                                str(self.nowPrice))  # change main wallet label

                            self.sqlSellInsert = "INSERT INTO `sell_trades` (`price`,`quantity`,`time`) VALUES (%s, %s, %s)"
                            self.confirmDB(self.sqlSellInsert,
                                           self.getPrice(item),
                                           self.getQuantity(item),
                                           self.getTime(item))

                    #print("currr: ", self.currentPrice)
                    #print(type(self.currentPrice))
                    if self.currentPrice > self.high:
                        print("new high")
                        self.high = self.currentPrice
                        self.highPriceLabel.setText("High: " +
                                                    str(self.currentPrice))
                    if self.currentPrice < self.low:
                        print("new low")
                        self.low = self.currentPrice
                        self.lowPriceLabel.setText("Low: " +
                                                   str(self.currentPrice))
                    if self.currentPrice < self.tempLow:
                        self.tempLow = self.currentPrice
                        self.xLow.append(self.currentPrice)
                        self.yLow.append(len(self.x) + 1)  # is plus 1 correct?
                    if self.currentPrice > self.tempHigh:
                        self.tempHigh = self.currentPrice
                        self.xHigh.append(self.tempHigh)
                        #self.yHigh.append(len(self.yHigh)+1)
                        self.yHigh.append(len(self.x) +
                                          1)  # is plus 1 correct?

                    if self.formLayout2.count() > 19:
                        self.formLayout2.removeRow(0)

                    self.dataList.append(item)
                    #self.formLayout.addRow(QLabel(item))

                    self.formLayout2.addRow(
                        QLabel("$" + self.getPrice(item) + "  |  " +
                               self.getQuantity(item) + "  |  " +
                               self.getTime(item)))
                    self.counter += 1
                    if self.counter == 5 or self.counter > 5:
                        if self.tempPrice != 0:
                            if self.tempPrice > self.currentPrice:
                                self.trendLabel.setText("Trend: Decreasing")
                                print("DESCREASING")
                                if len(self.buyList) == len(self.sellList):
                                    self.buyList.append(self.currentPrice)
                                    self.tradeCountLabel.setText(
                                        "Buy Trades: " +
                                        str(len(self.buyList)))
                                    self.sqlBuyInsert = "INSERT INTO `buy_trades` (`price`,`quantity`,`time`) VALUES (%s, %s, %s)"
                                    self.confirmDB(self.sqlBuyInsert,
                                                   self.getPrice(item),
                                                   self.getQuantity(item),
                                                   self.getTime(item))

                            elif self.tempPrice < self.currentPrice:
                                self.trendLabel.setText("Trend: Increasing")
                                print("INCREASING")
                                if len(self.buyList) != len(self.sellList):
                                    self.sellList.append(self.currentPrice)
                                    self.tradeCount += 1
                                    self.returnLabel.setText(
                                        "Sell Trades: " +
                                        str(len(self.sellList)))
                                    self.length = len(self.buyList)
                                    self.change = self.change + self.buyList[
                                        self.length - 1] - self.currentPrice
                                    self.nowPrice = self.nowPrice + self.change
                                    #self.labelH2.setText("$"+str(float(self.walletReturn[0]['wallet'])+self.change)) #change main wallet label
                                    self.labelH2.setText(
                                        "$" + str(self.nowPrice)
                                    )  # change main wallet label

                                    #insert into sell table
                                    self.sqlSellInsert = "INSERT INTO `sell_trades` (`price`,`quantity`,`time`) VALUES (%s, %s, %s)"
                                    self.confirmDB(self.sqlSellInsert,
                                                   self.getPrice(item),
                                                   self.getQuantity(item),
                                                   self.getTime(item))

                        self.tempPrice = self.currentPrice
                        #print("tempprice:", self.tempPrice)
                        self.counter = 0
                        print("Buys:", self.buyList)
                        print("Sells:", self.sellList)

                    self.y.append(pyObject['data'][0]['p'])
                    self.x.append(len(self.y))

                    #might be out of place 1 tab in
                newData.pop(0)  #delete item after iterating it

                self.priceLabel.setText("Price: " + str(self.currentPrice))
                self.graphWidget.clear()

                self.graphWidget.plot(self.x, self.y, pen=self.pen)

            #self.graphWidget.plot(self.x,)

            # reset variables afterwards to continue
            self.tempHigh = 0
            self.tempLow = 10000000

            #print("xxxxx",self.x)
            #print("yyyyy",self.y)

            #return self.formLayout
            #to autoscroll to most recent

            self.area = self.scrollBox2.verticalScrollBar()
            self.area.setValue(self.area.maximum())
        except Exception as e:
            print("updateLabel error:", e)
            #return "error"
    def updateBuyTrades(self):
        pass

    def getPrice(self, data):
        #print("get price called")
        pyObject = json.loads(data)
        return str(pyObject['data'][0]['p'])

    def getQuantity(self, data):
        #print("get quantity called")
        pyObject = json.loads(data)
        return str(pyObject['data'][0]['v'])

    def getTime(self, data):
        #print("get time called")
        pyObject = json.loads(data)
        timestamp = pyObject['data'][0]['t']
        #print(type(timestamp))
        return str(
            datetime.fromtimestamp(timestamp / 1000)
        )[11:
          -2]  #must divide by 1000 because timestamp is of milliseconds and remove last 2 character (trailing 0's)

    def buybtn_clicked(self):
        #print("buy clicked!")
        self.deleteRows()
        self.sql = "SELECT `buy_id`,`price`,`quantity`, `time` FROM `buy_trades` WHERE `buy_id`>0"
        #testresult=self.connectDB(self.sql)
        if len(self.connectDB(self.sql)) == 0:
            print("No trades positions have been initiated yet")
            self.formLayout.addRow(
                QLabel("No trade positions have been initiated yet"))
        else:
            print("trades have been made")
            #print(self.result)
            #print(type(self.result))
            testresult = self.connectDB(self.sql)
            # will need a form loop here to iterate over results as trades are made
            for item in testresult:
                self.formLayout.addRow(QLabel(str(item)))

    def sellbtn_clicked(self):
        print("sell clicked!")
        self.deleteRows()
        self.sql = "SELECT `sell_id`,`price`,`quantity`, `time` FROM `sell_trades` WHERE `sell_id`>0"
        temper = self.connectDB((self.sql))
        if len(temper) == 0:
            print("No trades positions have been exited yet")
            self.formLayout.addRow(
                QLabel("No trades positions have been exited yet"))
        else:
            print("trades have been made")
            #print(temper)
            # will need a form loop here to iterate over results as trades are made
            for item in temper:
                self.formLayout.addRow(QLabel(str(item)))

    def deleteRows(self):
        print("delete rows called")
        count = self.formLayout.rowCount()
        #print("count of rows:", count)
        if count == 0:
            pass
        elif count == 1:
            self.formLayout.removeRow(0)
        else:

            for item in range(self.formLayout.count()):
                #print("item:", item)
                self.formLayout.removeRow(item)

        self.formLayout.update()

    def estimate_coef(self, x, y):
        # number of observations/points
        n = np.size(x)
        # mean of x and y vector
        m_x, m_y = np.mean(x), np.mean(y)
        # calculating cross-deviation and deviation about x
        SS_xy = np.sum(y * x) - n * m_y * m_x
        SS_xx = np.sum(x * x) - n * m_x * m_x
        # calculating regression coefficients
        b_1 = SS_xy / SS_xx
        b_0 = m_y - b_1 * m_x

        return (b_0, b_1)

    def shortTrend(self):
        if newData[0] < newData[len(newData) - 1]:  #is increasing
            return "Increasing"
        elif newData[0] > newData[len(newData) - 1]:  #is decreasing
            return "Decreasing"

    #return true if stop loss triggered ( more than 10 cents loss)
    def checkStopLoss(self, currentPrice):
        val = len(self.buyList) - 1
        if currentPrice - self.buyList[val] <= -0.03:
            print("Stop Loss Triggered")
            return True
        return False

    def connectDB(self, sqlstatement):
        self.result = ""
        print("connectDB called")
        self.rootPassword = ""
        if path.exists("PyTradeBot.txt"):
            with open("PyTradeBot.txt") as o:
                self.rootPassword = o.readline()

                # establish database connection
                self.connection = pymysql.connect(
                    host='localhost',
                    user='******',
                    password=self.rootPassword,
                    database='PyTradeBot',
                    charset='utf8mb4',
                    cursorclass=pymysql.cursors.DictCursor)
                # call for apiKey
        try:
            with self.connection.cursor() as self.cursor:
                # get API KEY
                self.cursor.execute(sqlstatement)
                self.result = self.cursor.fetchall()
                print("result", self.result)
            self.connection.commit()
        except Exception as e:
            print(e)
        finally:
            self.connection.close()
        return self.result

    def confirmDB(self, sqlstatement, arga, argb, argc):
        print("connfirmDB called")
        self.rootPassword = ""
        if path.exists("PyTradeBot.txt"):
            with open("PyTradeBot.txt") as o:
                self.rootPassword = o.readline()

                # establish database connection
                self.connection = pymysql.connect(
                    host='localhost',
                    user='******',
                    password=self.rootPassword,
                    database='PyTradeBot',
                    charset='utf8mb4',
                    cursorclass=pymysql.cursors.DictCursor)
                # call for apiKey
        try:
            with self.connection.cursor() as self.cursor:

                self.cursor.execute(sqlstatement, (arga, argb, argc))
            self.connection.commit()
        except Exception as e:
            print(e)
        finally:
            self.connection.close()
예제 #26
0
파일: mainwindow.py 프로젝트: fufik/qlib
class Win(QMainWindow):
    def __init__(self):
        super(Win, self).__init__()
        self.ui = uic.loadUi('form.ui', self)
        self.ui.show()
        self.LE_mode = False  #False -- coefficients, True -- qbits
        self.rb_qbit.mode = True
        self.rb_coef.mode = False
        self.rb_qbit.toggled.connect(self.changeMode)
        self.rb_coef.toggled.connect(self.changeMode)

        self.sa_layout = QFormLayout()
        self.scrollAreaWidgetContents.setLayout(self.sa_layout)

        self.operator = ""
        self.b1 = False
        self.b_X.op = "X"
        self.b_X.toggled.connect(self.onClicked)
        self.b_Y.op = "Y"
        self.b_Y.toggled.connect(self.onClicked)
        self.b_Z.op = "Z"
        self.b_Z.toggled.connect(self.onClicked)
        self.b_H.op = "H"
        self.b_H.toggled.connect(self.onClicked)
        self.b_R.op = "R"
        self.b_R.toggled.connect(self.onClicked)
        self.b_CNOT.op = "CNOT"
        self.b_CNOT.toggled.connect(self.onClicked)
        self.b_Fourier.op = "Fourier"
        self.b_Fourier.toggled.connect(self.onClicked)

        #self.line_out.setReadOnly(True)
        rx = QRegExp('[0-9|,|.|-|j|+]*')
        validator = QRegExpValidator(rx, self)
        self.line_in.setValidator(validator)
        self.line_in.textChanged.connect(self.line_in_f)
        self.but_ACT.clicked.connect(self.act_f)
        #BLOCKING
        self.b_X.setEnabled(False)
        self.b_Y.setEnabled(False)
        self.b_Z.setEnabled(False)
        self.b_H.setEnabled(False)
        self.b_CNOT.setEnabled(False)
        self.b_R.setEnabled(False)
        self.b_Fourier.setEnabled(False)

    def onClicked(self):
        rb = self.sender()
        if rb.isChecked():
            self.b1 = True
            if self.line_in.text() != "":
                self.but_ACT.setEnabled(True)
            self.operator = rb.op

            #cleaning scrollarea widgets
            n = self.sa_layout.rowCount()
            while self.sa_layout.count():
                c = self.sa_layout.takeAt(0)
                if c.widget():
                    c.widget().deleteLater()
            if rb.op == "R":
                rx = QRegExp('[0-9|.|-]*')
                validator = QRegExpValidator(rx, self)
                par = QLineEdit()
                par.setValidator(validator)
                self.sa_layout.addRow("Тета", par)
            if rb.op == "CNOT":
                rx = QRegExp('[0-9|,]*')
                validator = QRegExpValidator(rx, self)
                par = QLineEdit()
                par.setPlaceholderText("Номера управляющих кубитов")
                par2 = QLineEdit()
                par2.setPlaceholderText("Номера изменяемых кубитов")
                par.setValidator(validator)
                par2.setValidator(validator)
                self.sa_layout.addRow("C", par)
                self.sa_layout.addRow("NOT", par2)

    def act_f(self):
        ins = self.line_in.text()
        if not self.LE_mode:
            c = [complex(i) for i in ins.split(',')]
            q = np.array([c], dtype=complex)
            n = int(log(len(q[0]), 2))  #length in qbits
            q = qregister(q.transpose())  #input qregister
            res = qregister(np.array([[1]], dtype=complex))
        else:
            arg = list()
            for c in ins:
                if c == '0':
                    arg.append(qbit_0)
                elif c == '1':
                    arg.append(qbit_1)
                elif c == '+':
                    arg.append(qbit_sp)
                elif c == '-':
                    arg.append(qbit_sn)

            q = qregister(*arg)
            n = len(q)
            res = qregister(np.array([[1]], dtype=complex))
        if self.operator == "X":
            op = op_X**n
            res = op @ q
        elif self.operator == "Y":
            op = op_Y**n
            res = op @ q
        elif self.operator == "Z":
            op = op_Z**n
            res = op @ q
        elif self.operator == "H":
            op = op_H**n
            res = op @ q
        elif self.operator == "Fourier":
            res = fourier(q)
        elif self.operator == "R":
            try:
                angle = float(self.sa_layout.itemAt(0, 1).widget().text())
            except:
                self.line_out.setText(
                    "Неправильно установлен коэффициент Тета")
                return
            op_R = qoperator(matrix.genpshift(angle, 1))
            op = op_R**n
            res = op @ q
        elif self.operator == "CNOT":
            try:
                s = self.sa_layout.itemAt(0, 1).widget().text()
                Cs = [int(i) for i in s.split(',')]
            except Exception as e:
                print(e)
                self.line_out.setText("Ошибка обработки параметров C")
                return
            try:
                s = self.sa_layout.itemAt(1, 1).widget().text()
                NOTs = [int(i) for i in s.split(',')]
            except:
                self.line_out.setText("Ошибка обработки параметров NOT")
                return
            z = Cs + NOTs
            for i in z:
                if i > n:
                    self.line_out.setText("Превышение размеров курегистра")
                    return
            Cs = np.array(Cs) - 1
            NOTs = np.array(NOTs) - 1
            list_1 = list()
            list_2 = list()
            for i in range(n):
                list_1.append(op_I)
                list_2.append(op_I)
            for i in Cs:
                list_1[i] = (qbit_0 @ qbit_0)
                list_2[i] = (qbit_1 @ qbit_1)
            for i in NOTs:
                list_2[i] = op_X

            op_l = op_I**0  #1
            op_r = op_I**0
            for i in list_1:
                op_l = op_l * i
            for i in list_2:
                op_r = op_r * i
            op = op_l + op_r  #operator is ready
            res = op @ q

        print(res)
        answer = ', '.join([str(e) for e in (res.vector.transpose()[0])])
        self.line_out.setText(answer)

    def line_in_f(self):
        le = self.sender()
        t = self.line_in.text()
        if t != "":
            r = self.checkparse(t)
            #print(r)
            if r > 0:
                if r >= 1 and r < 2:
                    self.unblock1()
                    self.block2()
                if r >= 2:
                    self.unblock1()
                    self.unblock2()
            else:
                self.block1()
                self.block2()
            if self.b1:
                self.but_ACT.setEnabled(True)
        else:
            self.block1()
            self.block2()
            self.but_ACT.setEnabled(False)

    def block1(self):
        self.b_X.setEnabled(False)
        self.b_Y.setEnabled(False)
        self.b_Z.setEnabled(False)
        self.b_H.setEnabled(False)
        self.b_R.setEnabled(False)

    def block2(self):
        self.b_CNOT.setEnabled(False)
        self.b_Fourier.setEnabled(False)

    def unblock1(self):
        self.b_X.setEnabled(True)
        self.b_Y.setEnabled(True)
        self.b_Z.setEnabled(True)
        self.b_H.setEnabled(True)
        self.b_R.setEnabled(True)

    def unblock2(self):
        self.b_CNOT.setEnabled(True)
        self.b_Fourier.setEnabled(True)

    def checkparse(self, ins: str):
        if self.LE_mode == True:
            arg = list()
            for c in ins:
                if c == '0':
                    arg.append(qbit_0)
                elif c == '1':
                    arg.append(qbit_1)
                elif c == '+':
                    arg.append(qbit_sp)
                elif c == '-':
                    arg.append(qbit_sn)
            return len(arg)

        #else
        try:
            c = [complex(i) for i in ins.split(',')]
        except:
            return 0  # impossible operand
        #print(c)
        values = np.array(c, dtype=complex)
        x = math.log(len(values), 2)
        #print(x)
        if x > 0:
            if x % 1 == 0:
                return x
        return 0

    def changeMode(self):
        rb = self.sender()
        if rb.mode != self.LE_mode:
            self.line_in.setText("")
            self.line_out.setText("")
        self.LE_mode = rb.mode
        if rb.mode == False:
            rx = QRegExp('[0-9|,|.|-|j|+]*')
            validator = QRegExpValidator(rx, self)
            self.line_in.setValidator(validator)
        else:
            rx = QRegExp('[0|1|-|+]*')
            validator = QRegExpValidator(rx, self)
            self.line_in.setValidator(validator)