Beispiel #1
0
    def ask_new_local_path(self):
        if self._filename is None:
            initialdir = get_workbench().get_local_cwd()
            initialfile = None
        else:
            initialdir = os.path.dirname(self._filename)
            initialfile = os.path.basename(self._filename)

        # http://tkinter.unpythonic.net/wiki/tkFileDialog
        new_filename = asksaveasfilename(
            filetypes=_dialog_filetypes,
            defaultextension=".py",
            initialdir=initialdir,
            initialfile=initialfile,
        )

        # Different tkinter versions may return different values
        if new_filename in ["", (), None]:
            return None

        # Seems that in some Python versions defaultextension
        # acts funny
        if new_filename.lower().endswith(".py.py"):
            new_filename = new_filename[:-3]

        if running_on_windows():
            # may have /-s instead of \-s and wrong case
            new_filename = os.path.join(
                normpath_with_actual_case(os.path.dirname(new_filename)),
                os.path.basename(new_filename),
            )

        if new_filename.endswith(".py"):
            base = os.path.basename(new_filename)
            mod_name = base[:-3].lower()
            if running_on_windows():
                mod_name = mod_name.lower()

            if mod_name in [
                "math",
                "turtle",
                "random",
                "statistics",
                "pygame",
                "matplotlib",
                "numpy",
            ]:

                # More proper name analysis will be performed by ProgramNamingAnalyzer
                if not tk.messagebox.askyesno(
                    "Potential problem",
                    "If you name your script '%s', " % base
                    + "you won't be able to import the library module named '%s'" % mod_name
                    + ".\n\n"
                    + "Do you still want to use this name for your script?",
                ):
                    return self.ask_new_local_path()

        return new_filename
def export():
    filename = asksaveasfilename(
        filetypes=[("Zip-files", ".zip"), ("all files", ".*")],
        defaultextension=".zip",
        initialdir=get_workbench().get_local_cwd(),
        initialfile=time.strftime("ThonnyUsageLogs_%Y-%m-%d.zip"),
    )

    if not filename:
        return

    log_dir = _get_log_dir()

    with zipfile.ZipFile(filename, "w", compression=zipfile.ZIP_DEFLATED) as zipf:
        for item in os.listdir(log_dir):
            if item.endswith(".txt") or item.endswith(".zip"):
                zipf.write(os.path.join(log_dir, item), arcname=item)
Beispiel #3
0
    def save_file(self, ask_filename=False):
        if self._filename is not None and not ask_filename:
            get_workbench().event_generate("Save",
                                           editor=self,
                                           filename=self._filename)
        else:
            # http://tkinter.unpythonic.net/wiki/tkFileDialog
            new_filename = asksaveasfilename(
                master=get_workbench(),
                filetypes=_dialog_filetypes,
                defaultextension=".py",
                initialdir=get_workbench().get_cwd(),
            )

            # Different tkinter versions may return different values
            if new_filename in [
                    "",
                (),
                    None,
            ]:
                return None

            # Seems that in some Python versions defaultextension
            # acts funny
            if new_filename.lower().endswith(".py.py"):
                new_filename = new_filename[:-3]

            if running_on_windows():
                # may have /-s instead of \-s and wrong case
                new_filename = os.path.join(
                    normpath_with_actual_case(os.path.dirname(new_filename)),
                    os.path.basename(new_filename))

            if new_filename.endswith(".py"):
                base = os.path.basename(new_filename)
                mod_name = base[:-3].lower()
                if running_on_windows():
                    mod_name = mod_name.lower()

                if mod_name in [
                        "math",
                        "turtle",
                        "random",
                        "statistics",
                        "pygame",
                        "matplotlib",
                        "numpy",
                ]:

                    # More proper name analysis will be performed by ProgramNamingAnalyzer
                    if not tk.messagebox.askyesno(
                            "Potential problem",
                            "If you name your script '%s', " % base +
                            "you won't be able to import the library module named '%s'"
                            % mod_name + ".\n\n" +
                            "Do you still want to use this name for your script?",
                            parent=get_workbench(),
                    ):
                        return self.save_file(ask_filename)

            self._filename = new_filename
            get_workbench().event_generate("SaveAs",
                                           editor=self,
                                           filename=new_filename)

        content = self._code_view.get_content_as_bytes()
        try:
            f = open(self._filename, mode="wb")
            f.write(content)
            f.flush()
            # Force writes on disk, see https://learn.adafruit.com/adafruit-circuit-playground-express/creating-and-editing-code#1-use-an-editor-that-writes-out-the-file-completely-when-you-save-it
            os.fsync(f)
            f.close()
            self._last_known_mtime = os.path.getmtime(self._filename)
        except PermissionError:
            if askyesno(
                    "Permission Error",
                    "Looks like this file or folder is not writable.\n\n" +
                    "Do you want to save under another folder and/or filename?",
                    parent=get_workbench(),
            ):
                return self.save_file(True)
            else:
                return None

        self.master.remember_recent_file(self._filename)

        self._code_view.text.edit_modified(False)

        return self._filename
Beispiel #4
0
    def ask_new_local_path(self):
        if self._filename is None:
            initialdir = get_workbench().get_local_cwd()
            initialfile = None
        else:
            initialdir = os.path.dirname(self._filename)
            initialfile = os.path.basename(self._filename)

        # https://tcl.tk/man/tcl8.6/TkCmd/getOpenFile.htm
        type_var = tk.StringVar(value="")
        new_filename = asksaveasfilename(
            filetypes=_dialog_filetypes,
            defaultextension=None,
            initialdir=initialdir,
            initialfile=initialfile,
            parent=get_workbench(),
            typevariable=type_var,
        )
        logger.info("Save dialog returned %r with typevariable %r", new_filename, type_var.get())

        # Different tkinter versions may return different values
        if new_filename in ["", (), None]:
            return None

        if running_on_windows():
            # may have /-s instead of \-s and wrong case
            new_filename = os.path.join(
                normpath_with_actual_case(os.path.dirname(new_filename)),
                os.path.basename(new_filename),
            )

        if type_var.get() == PYTHON_FILES_STR or type_var.get() == "":
            new_filename = self._check_add_py_extension(
                new_filename, without_asking=type_var.get() == PYTHON_FILES_STR
            )

        if new_filename.endswith(".py"):
            base = os.path.basename(new_filename)
            mod_name = base[:-3].lower()
            if running_on_windows():
                mod_name = mod_name.lower()

            if mod_name in [
                "math",
                "turtle",
                "random",
                "statistics",
                "pygame",
                "matplotlib",
                "numpy",
            ]:

                # More proper name analysis will be performed by ProgramNamingAnalyzer
                if not tk.messagebox.askyesno(
                    "Potential problem",
                    "If you name your script '%s', " % base
                    + "you won't be able to import the library module named '%s'" % mod_name
                    + ".\n\n"
                    + "Do you still want to use this name for your script?",
                    master=self,
                ):
                    return self.ask_new_local_path()

        return new_filename