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)
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
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')
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} ({value})") else: pkgs.append(f"{key} (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–2021 by Clemens Brunner.</p>") msg_box.setInformativeText(text) msg_box.exec()
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"))
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()
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()
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)
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_()
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()
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
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_()
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()
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
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
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)
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_())