コード例 #1
0
ファイル: mainwindow.py プロジェクト: cbrnr/mnelab
    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()
コード例 #2
0
    def mouse_clicked(self):
##        print(f'mouse clicked')
        mbox = QMessageBox()
        mbox.setText(f"fock u!")
        mbox.exec()
        sys.exit()
        pass
コード例 #3
0
def generate(size, dir, path, outputName, params):
    currentTime = datetime.datetime.now()
    if len(outputName) <= 0:
        batchName = currentTime.strftime("%b-%d-%Y-%H%M%p%s")
    else:
        batchName = util.checkPath(dir, outputName)

    currentDirectory = os.getcwd()
    childDirectory = dir + "/" + batchName
    childDirectory = os.mkdir(childDirectory)
    record = [['email', 'gender', 'school', 'date']]
    ID = 1
    progressBarStep = int(size / 10)
    progress = QProgressDialog("Generating Resumes", "Close", 0, 100)
    progress.setWindowModality(QtCore.Qt.WindowModal)
    progress.setAutoClose(True)
    progress.show()

    while ID <= size:
        pair = getPair(path, params)
        record.append(makeDoc(pair, 'control', ID, batchName, params))
        record.append(makeDoc(pair, 'test', ID, batchName, params))
        ID += 1
        progress.setValue(ID)

    message = QMessageBox()
    message.setText("Resume generation complete.")
    message.exec()
    del pair
    return record
コード例 #4
0
    def deleteEntryini(self):
        for k in self.inicontents:
            if k in self.selected["ini"]:
                errbox = QMessageBox()
                errbox.setText("Section headers cannot be deleted.")
                errbox.exec()
                return
        confirm = QMessageBox()
        msg = "The following keys will be deleted:\n"
        for key in self.selected["ini"]:
            msg += key[0] + "\n"
        msg += "Are you sure?"
        confirm.setText(msg)
        confirm.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
        if confirm.exec() != QMessageBox.Yes:
            return

        for item in self.selected["ini"]:
            for section in reversed(self.indices):
                if (item[1] + 1) > self.indices[section]:
                    self.inicontents[section].pop(item[0])
                    break

        msgbox = QMessageBox()
        msgbox.setText(
            f"Successfully removed {len(self.selected['ini'])} entries!")
        msgbox.exec()

        self.updateTables()
コード例 #5
0
    def deleteEntry(self):
        confirm = QMessageBox()
        msg = "The following entries will be deleted:\n"
        for path in self.selected["json"]:
            msg += path + "\n"
        msg += "Are you sure?"
        confirm.setText(msg)
        confirm.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
        if confirm.exec() != QMessageBox.Yes:
            return

        delfiles = False
        confirm = QMessageBox()
        confirm.setText(
            f"Would you like to delete the folder{'s' if len(self.selected['json']) > 1 else ''} on disk as well?"
        )
        confirm.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
        if confirm.exec() == QMessageBox.Yes:
            delfiles = True

        todel = []
        for repo in enumerate(self.repos):
            if repo[1][0] in self.selected['json']:
                todel.append(repo[0])
        todel.reverse()
        for i in todel:
            self.repos.pop(i)
            if delfiles:
                os.rmdir(self.repos[i][0])

        msgbox = QMessageBox()
        msgbox.setText(f"Successfully removed {len(todel)} entries!")
        msgbox.exec()

        self.updateTables()
コード例 #6
0
ファイル: utils.py プロジェクト: Lucas-Me/GePlu
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
コード例 #7
0
    def addRepoHandler(self):
        path = self.ui.path.text()
        for r in enumerate(self.repos):
            if r[1][0] == path:
                errbox = QMessageBox()
                errbox.setText(f"{path} is already listed in {self.json_path}")
                errbox.exec()
                return
        colour = ColorPicker().getColor()
        hexcolour = '%02x%02x%02x' % (
            int(colour[0]),  # this is actually so dumb
            int(colour[1]) if int(colour[0]) != 255 or not int(colour[1]) else
            int(colour[1]) + 1,
            int(colour[2]) if int(colour[0]) != 255 or not int(colour[2]) else
            int(colour[2]) + 1)
        if self.ui.checkBox.isChecked():
            if not re.match(self.urlregexp, self.ui.remote.text()):
                errbox = QMessageBox()
                errbox.setText("Invalid URL")
                errbox.exec()
                return
            self.addNewRepo(path, self.ui.remote.text(), hexcolour, self.repos)
        else:
            self.addRepoFromExisting(path, hexcolour, self.repos)

        self.updateTables()
コード例 #8
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()
コード例 #9
0
def detailedErrorMessage(parent: Optional[QWidget], message: str, detailedInformation: str) -> None:
    message_box = QMessageBox(QMessageBox.Critical,
                              QApplication.applicationName(),
                              message,
                              QMessageBox.Ok,
                              parent)
    message_box.setDetailedText(detailedInformation)
    message_box.exec()
コード例 #10
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()
コード例 #11
0
def information_message_box(win_title: str, msg: str):
    msg_box = QMessageBox()
    msg_box.setIcon(QMessageBox.Information)
    msg_box.setWindowIcon(QIcon(str(pkg_data.LOGO)))

    msg_box.setText(msg)
    msg_box.setWindowTitle(win_title)
    msg_box.setStandardButtons(QMessageBox.Ok)
    msg_box.exec()
コード例 #12
0
 def openhandler(self, mode):
     if mode == "json":
         self.changePathJson()
     elif mode == "ini":
         self.changePathIni()
     else:
         a = QMessageBox()  # error handling (tm)
         a.setText("what the f**k")
         a.exec()
     return
コード例 #13
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)
コード例 #14
0
    def onEditini(self, item):
        if "self.updateTables" in inspect.stack(
        )[2].code_context[0]:  # come at me
            return
        elif item.column() == 0:
            secs = 3  # SEX?!?!?!?!?!?!!?!
            for section in reversed(self.indices):
                if (item.row() + 1) > self.indices[
                        section]:  # first occurrence of this must always break to avoid repeating itself
                    if item.text() in self.inicontents[section]:
                        pass  # no change
                    else:
                        # pad: no. of section headers + no. of entries in previous sections
                        pad = secs + (len(self.inicontents[list(self.indices)[0]]) if secs > 1 else 0) + \
                              (len(self.inicontents[list(self.indices)[1]]) if secs > 2 else 0)
                        # list is so they can be indexed by num
                        originalKey = list(self.inicontents[section].keys()) \
                            [item.row() - pad]
                        if not item.text():
                            errbox = QMessageBox()
                            errbox.setText("Key cannot be empty")
                            errbox.exec()
                            item.setText(originalKey)
                            return
                        self.inicontents[section][
                            item.text()] = self.ui.initable.item(
                                item.row(), 1).text()
                        self.inicontents[section].pop(originalKey)
                        # this action changes the order of the dict in most cases, so without updating the table
                        # the actual position of items can desync which leads to very buggy behaviour
                        self.updateTables()
                    break
                secs -= 1

        else:  # item is a value, which should in theory require less fuckery
            secs = 3
            for section in reversed(self.indices):
                if (item.row() + 1) > self.indices[section]:
                    key = self.ui.initable.item(item.row(), 0).text()
                    originalVal = self.inicontents[section][key]
                    if item.text() == originalVal:
                        pass
                    else:
                        if not item.text():
                            errbox = QMessageBox()
                            errbox.setText("Value cannot be empty")
                            errbox.exec()
                            item.setText(originalVal)
                            return
                        # TODO store types of keys and enforce typechecking
                        self.inicontents[section][key] = item.text()
                        self.updateTables()
                    break
                secs -= 1
コード例 #15
0
    def addRepoFromExisting(path, hexcolour, repos, quiet=False):
        try:
            repo = git.Repo(path)
        except git.exc.NoSuchPathError:
            if quiet:
                print("Path not found")
            else:
                errbox = QMessageBox()
                errbox.setText("Path not found")
                errbox.exec()  # look we've got error messages and everything
            return 1
        except git.exc.InvalidGitRepositoryError:  # means it *has* to be good code
            if quiet:
                print("Path does not contain a valid git repository")
            else:
                errbox = QMessageBox()
                errbox.setText("Path does not contain a valid git repository")
                errbox.exec()
            return 1
        if "origin" in repo.remotes:
            if not repo.remotes["origin"].url:
                if quiet:
                    print(
                        "Missing origin URL, how on earth did you manage that?"
                    )
                else:
                    errbox = QMessageBox()
                    errbox.setText(
                        "Missing origin URL, how on earth did you manage that?"
                    )
                    errbox.exec(
                    )  # if anyone manages to get this error i will be very surprised
                return 1
        else:
            if quiet:
                print("Repo has no origin")
            else:
                errbox = QMessageBox()
                errbox.setText("Repo has no origin")
                errbox.exec()
            return 1

        repos.append([path, int(hexcolour, 16)])

        if quiet:
            print(f"Successfully added repository at {path}!")
        else:
            msgbox = QMessageBox()
            msgbox.setText(f"Successfully added repository at {path}!")
            msgbox.exec()
        return
コード例 #16
0
ファイル: utils.py プロジェクト: Lucas-Me/GePlu
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
コード例 #17
0
    def GeneratedDialog(self):

        self.statusBar().showMessage('Tablecloth generated. Happy rigging!')
        self.statusBar().removeWidget(self.progress_bar)
        # Now you can go back to rigging
        self.ChangeAppStatus(True)

        mbox = QMessageBox()

        mbox.setWindowTitle("Tablecloth Generator")
        mbox.setText("Tablecloth Generated!")
        mbox.setStandardButtons(QMessageBox.Ok)

        mbox.exec()
コード例 #18
0
    def apply(self, quiet=True):
        json.dump({
            "repos": self.repos,
            "sysupdates": self.sysupdates
        }, open(self.json_path, "w"))

        ini = configparser.ConfigParser()
        ini.__dict__["_sections"] = self.inicontents
        ini.write(open(self.ini_path, "w"))

        if not quiet:
            msgbox = QMessageBox()
            msgbox.setText("Done!")
            msgbox.exec()
        return
コード例 #19
0
    def checkAndSaveChanges(self):
        old, oldini = {}, {}
        if open(self.json_path).read() != '':
            old = json.load(open(self.json_path))
        else:
            old = {"repos": [], "sysupdates": []}

        if open(self.ini_path).read() != '':
            oldini = configparser.ConfigParser().read(self.ini_path)
        else:
            oldini = {}

        if (old["repos"] == self.repos and old["sysupdates"] == self.sysupdates) or \
                (oldini == self.inicontents):
            pass
        else:
            confirm = QMessageBox()
            confirm.setText(
                "You have unsaved changes. Would you like to save them now?")
            confirm.setStandardButtons(QMessageBox.Yes | QMessageBox.No
                                       | QMessageBox.Cancel)
            ret = confirm.exec()
            if ret == QMessageBox.Cancel:
                return 1
            elif ret == QMessageBox.Yes:
                self.apply()
コード例 #20
0
 def Sl_view_profile_logout(self):
     msg = QMessageBox(QMessageBox.Question, "Logout",
                       "Siete sicuri di voler effettuare il logout?",
                       QMessageBox.Yes | QMessageBox.No)
     msg.setButtonText(QMessageBox.Yes, "Sì")
     if msg.exec() == QMessageBox.Yes:
         self._net_model.logout()
         sys.exit()
コード例 #21
0
    def _refresh_ui(self):
        self.label.setText(f"Turn {self.game_state.turn.value}")

        for y in range(0, GAME_SZIE):
            for x in range(0, GAME_SZIE):
                txt = self.game_state.get(x, y).value
                self._get_button_at(x, y).setText(txt)

        winner = self.game_state.winner
        if winner:
            msgBox = QMessageBox()
            if winner == TileState.EMPTY:
                msgBox.setText(f"Tie")
            else:
                msgBox.setText(f"Winner is {winner.value}")
            msgBox.exec()
            self.game_state.new_game()
コード例 #22
0
def choiceDialog(parent: Optional[QWidget],
                 message: str,
                 labels: Iterable[str],
                 choices: Iterable[T],
                 show_cancel_button=True) -> T:
    buttons_to_choices = {}
    message_box = QMessageBox(QMessageBox.Question, QApplication.applicationName(), message, QMessageBox.NoButton, parent)

    for label, choice in zip(labels, choices):
        button = message_box.addButton(label, QMessageBox.ActionRole)
        buttons_to_choices[button] = choice

    if show_cancel_button:
        button = message_box.addButton(QMessageBox.Cancel)
        buttons_to_choices[button] = None

    message_box.exec()
    return buttons_to_choices[message_box.clickedButton()]
コード例 #23
0
ファイル: projmake.py プロジェクト: oliverchen415/projmake_qt
 def createFiles(self):
     p = Path(f"{self.userFilepath.text()}/{self.projName.text()}")
     try:
         p.mkdir()
     except FileExistsError as exc:
         msgbox = QMessageBox()
         msgbox.setText(f"{exc}")
         msgbox.exec()
     else:
         os.chdir(f"{self.userFilepath.text()}\\{self.projName.text()}")
         if self.pyProj.isChecked():
             fileType = "py"
         elif self.goProj.isChecked():
             fileType = "go"
         with open(f"{self.projName.text()}.{fileType}", "w") as f:
             f.write(f"# Created on {date.today()}")
         if self.versionControlFiles.isChecked():
             open("README.md", "a").close()
             open(".gitignore", "a").close()
コード例 #24
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()
コード例 #25
0
def question_message_box(win_title: str, msg: str):
    msg_box = QMessageBox()
    msg_box.setIcon(QMessageBox.Question)
    msg_box.setWindowIcon(QIcon(str(pkg_data.LOGO)))

    msg_box.setText(msg)
    msg_box.setWindowTitle(win_title)
    msg_box.setStandardButtons(QMessageBox.Yes | QMessageBox.No
                               | QMessageBox.Cancel)
    reply = msg_box.exec()
    return reply
コード例 #26
0
    def closeEvent(self, event):
        close_dialog = QMessageBox(self)
        close_dialog.setWindowTitle("Team Editor")
        close_dialog.setText("Do you wish to close the editor?")
        close_dialog.setStandardButtons(QMessageBox.Yes | QMessageBox.No)

        response = close_dialog.exec()

        if response == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()
コード例 #27
0
ファイル: data.py プロジェクト: Lucas-Me/GePlu
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
コード例 #28
0
 def onEditjson(self, item):
     if item.text() in chain.from_iterable(self.repos) or self.isColour(
             item.text()):
         return  # no change
     else:
         if not item.text():
             errbox = QMessageBox()
             errbox.setText("Path cannot be empty")
             errbox.exec()
             item.setText(self.repos[item.row()][0])
             return
         try:
             git.Repo(item.text())
         except git.exc.NoSuchPathError:
             errbox = QMessageBox()
             errbox.setText("Path not found")
             errbox.exec()
             item.setText(self.repos[item.row()][0])
             return
         except git.exc.InvalidGitRepositoryError:
             errbox = QMessageBox()
             errbox.setText("Path does not contain a valid git repository")
             errbox.exec()
             item.setText(self.repos[item.row()][0])
             return
         else:
             self.repos[item.row()][0] = item.text()
コード例 #29
0
    def addNewRepo(path, remote, hexcolour, repos, quiet=False):
        if os.path.exists(path):
            if os.path.isfile(path) or os.listdir(path):
                if quiet:
                    print("Path must be an empty directory")
                else:
                    errbox = QMessageBox()
                    errbox.setText("Path must be an empty directory")
                    errbox.exec()
                return 1
        else:
            if os.path.exists(path[:path.rindex('/')]):
                if quiet:
                    print(
                        "Specified folder does not exist but is in a valid directory."
                    )
                    if input(
                            "Would you like to create the folder and clone the repository there? [Y/N]: "
                    ).lower().strip() != 'y':
                        print("Exiting.")
                        return 1
                    os.mkdir(path)
                else:
                    errbox = QMessageBox()
                    errbox.setText(
                        "Specified folder does not exist but is in a valid directory.\n"
                        "Would you like to create the folder and clone the repository there?"
                    )
                    errbox.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
                    errbox.setDefaultButton(QMessageBox.Yes)
                    if errbox.exec() == QMessageBox.No:
                        return 1
                    os.mkdir(path)
            else:
                if quiet:
                    print("Path not found")
                else:
                    errbox = QMessageBox()
                    errbox.setText("Path not found")
                    errbox.exec()
                return 1

        os.system(f"git clone '{remote}' '{path}' -v"
                  )  # forget it im not dealing with gitpythons bs
        repos.append([path, int(hexcolour, 16)])

        if quiet:
            print(f"Repository successfully cloned to {path}")
        else:
            msgbox = QMessageBox()
            msgbox.setText(f"Repository successfully cloned to {path}")
            msgbox.exec()
        return
コード例 #30
0
    def SeeVersion(self):

        git_url = "https://raw.githubusercontent.com/vg-mjg/tablecloth-"
        git_url += "generator/main/version.txt"
        with urllib.request.urlopen(git_url) as response:
            url_version = response.read().decode("utf-8")

        version = "Your version is up to date!"
        if url_version != VERSION:
            version = "Your version is outdated."
            version += "Please check the <a href='https://github.com/vg-mjg/"
            version += "tablecloth-generator/releases'>Github page</a>"
            version +=" for updates."
        version_message = QMessageBox(self)
        version_message.setWindowTitle("Checking version")
        version_message.setText("""<h1>Tablecloth generator</h1>
            <br>
            <b>Current Version:</b> %s<br>
            <b>Your Version:</b> %s<br>
            <i>%s</i>
            """ % (url_version, VERSION, version))

        version_message.exec()