Ejemplo n.º 1
0
def main():
    sys.excepthook = exception_logger
    os.environ['QT_MAC_WANTS_LAYER'] = '1'    # Workaround for https://bugreports.qt.io/browse/QTBUG-87014

    error = init_and_check_db(get_app_path())

    if error.code == LedgerInitError.EmptyDbInitialized:  # If DB was just created from SQL - initialize it again
        error = init_and_check_db(get_app_path())

    app = QApplication([])
    language = JalDB().get_language_code(JalSettings().getValue('Language', default=1))
    translator = QTranslator(app)
    language_file = get_app_path() + Setup.LANG_PATH + os.sep + language + '.qm'
    translator.load(language_file)
    app.installTranslator(translator)

    if error.code == LedgerInitError.OutdatedDbSchema:
        error = update_db_schema(get_app_path())
        if error.code == LedgerInitError.DbInitSuccess:
            error = init_and_check_db(get_app_path())

    if error.code != LedgerInitError.DbInitSuccess:
        window = QMessageBox()
        window.setAttribute(Qt.WA_DeleteOnClose)
        window.setWindowTitle("JAL: Start-up aborted")
        window.setIcon(QMessageBox.Critical)
        window.setText(error.message)
        window.setInformativeText(error.details)
    else:
        window = MainWindow(language)
    window.show()

    app.exec()
    app.removeTranslator(translator)
Ejemplo n.º 2
0
def save_file(master, file, delimiter=';'):
    pathname = master.folder.text()
    extension = pathname[pathname.index('.'):]

    try:
        if extension == ".xlsx":
            with pd.ExcelWriter(pathname) as writer:
                file.to_excel(writer,
                              "Dados Brutos",
                              engine='openpyxl',
                              na_rep="NaN",
                              float_format="%.2f")

        else:
            decimal = ',' if master.separador == '.' else '.'
            with open(pathname, 'wb') as writer:
                file.to_csv(writer,
                            sep=master.separador,
                            na_rep="NaN",
                            float_format="%.2f",
                            decimal=decimal)

    except PermissionError as Err:
        x = QMessageBox(QMessageBox.Critical,
                        "Erro de Acesso",
                        "Não foi possível salvar seu arquivo.",
                        buttons=QMessageBox.Ok,
                        parent=master)
        x.setInformativeText(
            "O arquivo que voce está tentando sobrescrever já está aberto em outro programa."
        )
        x.setDetailedText(str(Err))
        x.exec()
        raise PermissionError
Ejemplo n.º 3
0
    def show_update_info(info: dict):
        print(info)

        html_url = info.get('html_url', '')
        content = [
            f'New v{info.get("version")} (Now v{VERSION})',
            info.get('name', ''),
            html_url,
        ]
        title = 'Update available, download now?'

        msg = QMessageBox()
        msg.setIcon(QMessageBox.Information)

        msg.setText(title)
        msg.setInformativeText('\n\n'.join(content))
        msg.setWindowTitle(title)
        msg.setDetailedText(info.get('desc', ''))
        msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No)

        btn_ret = msg.exec_()

        if btn_ret == QMessageBox.Yes:
            print('Yes clicked.')
            open_url(html_url)
        elif btn_ret == QMessageBox.Ok:
            print('Ok clicked.')
        elif btn_ret == QMessageBox.No:
            print('No clicked.')
        elif btn_ret == QMessageBox.Cancel:
            print('Cancel')
Ejemplo n.º 4
0
    def show_about(self):
        """Show About dialog."""
        from . import __version__

        msg_box = QMessageBox(self)
        text = (
            f"<img src='{image_path('mnelab_logo.png')}'><p>MNELAB {__version__}</p>"
        )
        msg_box.setText(text)

        mnelab_url = "github.com/cbrnr/mnelab"
        mne_url = "github.com/mne-tools/mne-python"

        pkgs = []
        for key, value in have.items():
            if value:
                pkgs.append(f"{key}&nbsp;({value})")
            else:
                pkgs.append(f"{key}&nbsp;(not installed)")
        version = ".".join(str(k) for k in version_info[:3])
        text = (
            f"<nobr><p>This program uses Python {version} and the following packages:"
            f"</p></nobr><p>{', '.join(pkgs)}</p>"
            f"<nobr><p>MNELAB repository: <a href=https://{mnelab_url}>{mnelab_url}</a>"
            f"</p></nobr><nobr><p>MNE repository: "
            f"<a href=https://{mne_url}>{mne_url}</a></p></nobr>"
            f"<p>Licensed under the BSD 3-clause license.</p>"
            f"<p>Copyright 2017&ndash;2021 by Clemens Brunner.</p>")
        msg_box.setInformativeText(text)
        msg_box.exec()
Ejemplo n.º 5
0
    def inputChanged(self, content):
        path = Path(content)

        if not (content and path.exists()):
            return
        if self._input_folder == path:
            return

        self.reset()

        # read file list
        self._input_folder = path
        glob = (p for p in path.rglob("*") if p.is_file())
        files = [str(p.relative_to(path)) for p in islice(glob, 50)]
        self.list_input_files.addItems(files)
        self._network.add_nodes_from(files)

        # read more files
        remains = True
        try:
            remains = next(glob)
        except StopIteration:
            remains = False

        if remains:
            msgbox = QMessageBox(self)
            msgbox.setIcon(QMessageBox.Warning)
            msgbox.setText("There are too many files in the directory.")
            msgbox.setInformativeText("Do you still want to list them?")
            msgbox.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
            msgbox.setDefaultButton(QMessageBox.No)

            if msgbox.exec_() != QMessageBox.Yes:
                self.reset()
                return

            self.list_input_files.addItem(str(remains.relative_to(path)))
            self._network.add_node(str(remains.relative_to(path)))

            files = [str(p.relative_to(path)) for p in glob]
            self.list_input_files.addItems(files)
            self._network.add_nodes_from(files)

        # generate keywords
        keywords = set()
        keypattern = re.compile(global_config.organizer.keyword_splitter)
        keywords.update(k.strip() for k in keypattern.split(path.name)
                        if k.strip())
        if len(os.listdir(path)) == 0:
            subf = next(path.iterdir())
            if subf.is_dir():
                keywords.update(k.strip() for k in keypattern.split(subf.name)
                                if k.strip())
        # TODO: extract metadata from input audio files
        self.widget_keywords.extendKeywords(keywords)

        # default output path
        if not global_config.organizer.default_output_dir:
            self.txt_output_path.setText(str(path.parent / "organized"))
Ejemplo n.º 6
0
def gui_exception_hook(exc_type, value, traceback):
    msg = QMessageBox()
    msg.setIcon(QMessageBox.Critical)
    msg.setText(str(value))
    msg.setInformativeText(''.join(
        tb.format_exception(exc_type, value, traceback)))
    msg.setWindowTitle(exc_type.__name__)
    msg.exec()
Ejemplo n.º 7
0
 def alert_message(self, header: str, text: str):
     msg = QMessageBox()
     msg.setIcon(QMessageBox.Information)
     msg.setWindowTitle("Alert")
     msg.setText(header)
     msg.setInformativeText(text)
     msg.setStandardButtons(QMessageBox.Ok)
     msg.setDefaultButton(QMessageBox.Ok)
     msg.exec()
Ejemplo n.º 8
0
 def inicializar_db():
     try:
         init_db()
     except NameError:
         popup = QMessageBox(QMessageBox.Critical, "Erro", "Erro")
         popup.setInformativeText(
             "Arquivo de configuração não foi encontrado")
         popup.addButton(QMessageBox.Ok)
         popup.exec()
         exit(1)
Ejemplo n.º 9
0
def error_msg(error_message):
    message = QMessageBox()
    message.setText(
        "There was a problem processing your file. Please click more details for more information."
    )
    message.setInformativeText(error_message)
    message.setWindowTitle("Error processing file")
    message.setDetailedText(error_message)
    message.setStandardButtons(QMessageBox.Ok)
    QApplication.setOverrideCursor(QCursor(Qt.ArrowCursor))
    message.exec_()
Ejemplo n.º 10
0
 def showAboutWindow(self):
     about_box = QMessageBox(self)
     about_box.setAttribute(Qt.WA_DeleteOnClose)
     about_box.setWindowTitle(self.tr("About"))
     title = self.tr("<h3>JAL</h3><p>Just Another Ledger, version {version}</p>".format(version=__version__))
     about_box.setText(title)
     about = self.tr("<p>More information, manuals and problem reports are at "
                     "<a href=https://github.com/titov-vv/jal>github home page</a></p>"
                     "<p>Questions, comments, help or donations:</p>"
                     "<p><a href=mailto:[email protected]>[email protected]</a></p>"
                     "<p><a href=https://t.me/jal_support>Telegram</a></p>")
     about_box.setInformativeText(about)
     about_box.show()
Ejemplo n.º 11
0
def read_file(master, nrows=None, header=None):
    extension = master.fileformat
    pathname = master.path.text()

    try:
        if extension == ".xlsx":
            data_df = pd.read_excel(pathname,
                                    header=header,
                                    engine="openpyxl",
                                    nrows=nrows,
                                    dtype='str')

        #elif self.filefomart == ".ods":
        #data_df = utils.open_odf(self, 14).to_numpy()
        else:
            data_df = pd.read_csv(pathname,
                                  sep=master.separador,
                                  nrows=nrows,
                                  dtype='str',
                                  header=header,
                                  keep_default_na=False)

    except PermissionError as Err:
        x = QMessageBox(QMessageBox.Critical,
                        "Erro de Acesso",
                        "Não foi possível salvar seu arquivo.",
                        buttons=QMessageBox.Ok,
                        parent=master)
        x.setInformativeText(
            "O arquivo que voce está tentando sobrescrever já está aberto em outro programa."
        )
        x.setDetailedText(str(Err))
        x.exec()
        raise PermissionError

    except pd.errors.ParserError as Err:
        x = QMessageBox(
            QMessageBox.Critical,
            "Erro de Acesso",
            "Não foi possível ler o arquivo com o delimitador especificado.",
            buttons=QMessageBox.Ok,
            parent=master)
        x.setInformativeText(
            "Por favor, tente utilizar um outro tipo de delimitador para os seus dados."
        )
        x.setDetailedText(str(Err))
        x.exec()
        raise pd.errors.ParserError

    return data_df
Ejemplo n.º 12
0
def open_url(url: str):
    try:
        # QDesktopServices.openUrl(QUrl(url))
        pass
    except Exception as e:
        msg = QMessageBox()
        msg.setIcon(QMessageBox.Critical)

        title = 'Network error: No connection'
        msg.setText(title)
        msg.setInformativeText('Please check your network connection.')
        msg.setWindowTitle(title)
        msg.setDetailedText(e)
        msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No)

        msg.exec_()
Ejemplo n.º 13
0
 def salvar_cliente(self):
     nome = self.entry_nome.text()
     cpf = self.entry_cpf.text()
     numero = self.entry_numero.text()
     endereco = self.entry_endereco.toPlainText()
     data = {
         'nome': nome,
         'cpf': cpf,
         'numero': numero,
         'endereco': endereco
     }
     try:
         self.db.novo_cliente(data)
         self.status_signal.emit("Salvo")
         self.limpar()
     except ValueError as e:
         popup = QMessageBox(QMessageBox.Critical, "Erro", "Campo Inválido")
         popup.setInformativeText(str(e))
         popup.addButton(QMessageBox.Ok)
         popup.exec()
Ejemplo n.º 14
0
def data_filter(master, df, headerdict):
    '''Recebe um dataframe de strings e filtra as colunas.'''

    # Filtra no primeiro dataframe as colunas correspondentes a: datas, precipitacao observada/registrada.
    # se estas colunas nao existirem, provoca um erro e avisa ao usuario.

    # filtra coluna correspondente a precipitação observada.
    try:
        observados = df[df.columns[headerdict["Prec. Observada"]]].str.replace(
            ',', '.')

    except:
        x = QMessageBox(QMessageBox.Warning,
                        "Erro de Seleçao",
                        'A coluna "Prec. Observada" não foi selecionada.',
                        parent=master)
        x.addButton(QMessageBox.Ok)
        x.setInformativeText(
            "Por favor, verifique a tabela e selecione a coluna correta.")
        x.exec()
        raise KeyError

    # filtra a(s) coluna(s) correspondente(s) a data/hora.
    if "Data" in headerdict.keys():
        try:
            datetime = df[df.columns[headerdict["Data"]]] + ' ' + df[
                df.columns[headerdict["Hora"]]]

        except:
            x = QMessageBox(
                QMessageBox.Warning,
                "Erro de Seleçao",
                'A coluna correspondente a "Hora" não foi selecionada',
                parent=master)
            x.addButton(QMessageBox.Ok)
            x.setInformativeText(
                "Por favor, verifique a tabela e selecione a coluna correta.")
            x.exec()
            raise KeyError

    elif "Data & Hora" in headerdict.keys():
        datetime = df[df.columns[headerdict["Data & Hora"]]]

    else:
        x = QMessageBox(
            QMessageBox.Warning,
            "Erro de Seleçao",
            'A coluna correspondente a "Data" ou "Hora" não foi selecionada',
            parent=master)
        x.addButton(QMessageBox.Ok)
        x.setInformativeText(
            "Por favor, verifique a tabela e selecione a coluna correta.")
        x.exec()
        raise KeyError

    new_df = pd.DataFrame(observados.to_numpy(),
                          datetime.to_numpy(),
                          columns=["Observado"])

    return new_df
Ejemplo n.º 15
0
def convert_dtype(master, df):
    ''' Recebe o dataframe e converte os tipos de suas colunas.'''
    dataformat = master.linkdata[master.FormatoData.currentText()]
    timeformat = master.linktime[master.FormatoTime.currentText()]
    datetimeformat = dataformat + ' ' + timeformat

    try:
        df.index = pd.to_datetime(df.index, format=datetimeformat)

    except ValueError:
        x = QMessageBox(QMessageBox.Critical,
                        "Erro de Formatação",
                        "O formato especificado para Data ou Hora é inválido.",
                        parent=master)
        x.addButton(QMessageBox.Ok)
        x.setInformativeText(
            "Por favor, verifique o formato da data ou o conteúdo da coluna.")
        x.exec()
        raise ValueError

    try:
        df['Observado'] = pd.to_numeric(df['Observado'], errors="coerce")

    except ValueError:
        x = QMessageBox(QMessageBox.Critical,
                        "Erro de Formatação",
                        "Não foi possível identificar o valor registrado",
                        parent=master)
        x.addButton(QMessageBox.Ok)
        x.setInformativeText(
            'Por favor, verifique o conteúdo da coluna associada a precipitação registrada.'
        )
        x.exec()
        raise ValueError

    return df
Ejemplo n.º 16
0
class Principal(QMainWindow):

    def __init__(self):
        QMainWindow.__init__(self)
        self.inicializar_db()
        self.setWindowTitle("Tião Automecânica - Clientes")
        self.widget = QWidget()

        # Janelas
        w1, w2 = Buscador(), NovoCliente()
        w1.status_signal.connect(self.atualizar_status)
        w2.status_signal.connect(self.atualizar_status)

        # Leiaute
        self.line = QFrame()
        self.line.setFrameShape(QFrame.VLine)
        self.line.setFrameShadow(QFrame.Sunken)
        self.line.setLineWidth(0)
        self.line.setMidLineWidth(1)
        self.layout = QGridLayout()
        self.layout.addWidget(w1, 0, 0, 1, 1)
        self.layout.addWidget(self.line, 0, 1, 1, 1)
        self.layout.addWidget(w2, 0, 1, 1, 2)
        self.widget.setLayout(self.layout)
        self.setCentralWidget(self.widget)

        # Menu
        self.menu = QMenuBar()
        self.setMenuBar(self.menu)
        self.sobre = QAction("Sobre", self)
        self.sobre.setShortcut("F1")
        self.menu.addAction(self.sobre)
        self.sobre.triggered.connect(self.info)

        # Status
        self.status = QStatusBar()
        self.setStatusBar(self.status)
        self.status_label = QLabel("Pronto")
        self.status.addWidget(self.status_label)

    @Slot()
    def info(self):
        self.popup = QMessageBox(QMessageBox.Information, "Sobre",
                                 "Informações")
        self.popup.setInformativeText("""Clientes \nVersão 0.5
        \nFeito com S2 por Zero \nMIT License""")
        self.popup.addButton(QMessageBox.Ok)
        self.popup.exec()

    @Slot()
    def atualizar_status(self, msg: str):
        self.status_label.setText(msg)

    @staticmethod
    def inicializar_db():
        try:
            init_db()
        except NameError:
            popup = QMessageBox(QMessageBox.Critical, "Erro", "Erro")
            popup.setInformativeText(
                "Arquivo de configuração não foi encontrado")
            popup.addButton(QMessageBox.Ok)
            popup.exec()
            exit(1)
Ejemplo n.º 17
0
def run():
    initialization_result = initialize()

    conf = config()
    window_config = conf['window']

    WIDTH = window_config['width']
    HEIGHT = window_config['height']

    app = QApplication(sys.argv)

    app.setStyleSheet(style)

    geometry = app.screens()[0].size()
    clipboard = app.clipboard()

    widget = MainWidget(clipboard)
    widget.setWindowOpacity(window_config['opacity'])
    widget.resize(WIDTH, HEIGHT)
    widget.move(0, geometry.height() - HEIGHT - 280)

    widget.setWindowTitle('Albion Online Stats')
    widget.setWindowIcon(QtGui.QIcon(path('albion-stats-icon.png')))

    if window_config['always_on_top']:
        widget.setWindowFlag(Qt.WindowStaysOnTopHint)
    if window_config['frameless']:
        widget.setWindowFlag(Qt.FramelessWindowHint)

    widget.show()

    current_version, latest_version = (get_current_version(),
                                       get_latest_version())

    if latest_version and current_version != latest_version:
        msg = QMessageBox()
        msg.setIcon(QMessageBox.Warning)
        msg.setWindowTitle("Update available!")
        msg.setText("Another version of app is avaliable.")
        msg.setInformativeText(
            "You are using app in version {}, latest version is {}".format(
                current_version, latest_version))
        msg.setStandardButtons(QMessageBox.Ok)
        msg.show()

    if initialization_result == InitializationResult.NetworkInterfaceListMissing:
        msg = QMessageBox()
        msg.setIcon(QMessageBox.Critical)
        msg.setWindowTitle("Unable to track network traffic data!")
        msg.setText(
            "On windows make sure that WinPcap is installed in your system.")
        msg.setInformativeText(
            "WinPcap can be installed from <a href='{}'>here</a> <br>\
            <b>Make sure to install with the \"Install Npcap in WinPcap API-compatible Mode\"<b> option<br><br>\
            In case where npcap is installed try to fix npcap and restart the app"
            .format('https://nmap.org/npcap/dist/npcap-0.9990.exe'))
        msg.setStandardButtons(QMessageBox.Ok)
        button = QPushButton("Fix npcap")

        button.clicked.connect(fix_npcap)
        msg.addButton(button, QMessageBox.NoRole)
        msg.show()

    sys.exit(app.exec_())