From faa0a04fa3950510d751a29cfefd56ec85ec19b6 Mon Sep 17 00:00:00 2001 From: Tom Hanks Date: Thu, 6 Feb 2020 18:39:04 -0700 Subject: [PATCH 1/2] -Added file menu selections for Save, saveAs, and Open -added functionality to load multiple functions from file -refactored command formatting, extracted a method --- pythonturtle/application.py | 31 +++++++++++++++- pythonturtle/shelltoprocess/forkedpyshell.py | 38 ++++++++++++++++---- 2 files changed, 61 insertions(+), 8 deletions(-) diff --git a/pythonturtle/application.py b/pythonturtle/application.py index 74f4066..6047686 100644 --- a/pythonturtle/application.py +++ b/pythonturtle/application.py @@ -44,7 +44,6 @@ def __init__(self, *args, **keywords): self.turtle_process = turtleprocess.TurtleProcess() self.turtle_process.start() self.turtle_queue = self.turtle_process.turtle_queue - self.init_menu_bar() self.init_about_dialog_info() @@ -108,6 +107,12 @@ def init_menu_bar(self): self.menu_bar = wx.MenuBar() self.file_menu = wx.Menu() + + self.open_menu_item = wx.MenuItem(self.file_menu, -1, 'O&pen...') + self.file_menu.Append(self.open_menu_item) + self.Bind(wx.EVT_MENU, self.on_open, source=self.open_menu_item) + self.file_menu.AppendSeparator() + self.exit_menu_item = wx.MenuItem(self.file_menu, -1, 'E&xit') self.file_menu.Append(self.exit_menu_item) self.Bind(wx.EVT_MENU, self.on_exit, source=self.exit_menu_item) @@ -193,6 +198,21 @@ def toggle_help(self, event=None): else: self.show_help() + def on_open(self, event=None): + #ptf = python turtle functions + with wx.FileDialog(self, "Open PythonTurtle file", wildcard="PTF files (*.ptf)|*.ptf", + style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) as fileDialog: + + if fileDialog.ShowModal() == wx.ID_CANCEL: + return + + pathname = fileDialog.GetPath() + try: + with open(pathname, 'r') as file: + self.loadFunctionsFromFile(file) + except IOError: + wx.LogError("Cannot open file '%s'." % newfile) + def on_exit(self, event=None): return self.Close() @@ -216,6 +236,15 @@ def init_about_dialog_info(self): def on_about(self, event=None): wx.adv.AboutBox(self.about_dialog_info, self) + def loadFunctionsFromFile(self, file): + commands = file.read() + self.shell.EnterFromFile(commands) + + + + + def saveAs(self, file): + wx.adv.AboutBox(self.about_dialog_info, self) def run(): multiprocessing.freeze_support() diff --git a/pythonturtle/shelltoprocess/forkedpyshell.py b/pythonturtle/shelltoprocess/forkedpyshell.py index 36fb94d..6c75641 100644 --- a/pythonturtle/shelltoprocess/forkedpyshell.py +++ b/pythonturtle/shelltoprocess/forkedpyshell.py @@ -1347,22 +1347,46 @@ def _clip(self, data): wx.TheClipboard.SetData(data) wx.TheClipboard.Flush() wx.TheClipboard.Close() + + def FormatCommand(self, command): + ps2 = str(sys.ps2) + command = command.rstrip() + command = self.fixLineEndings(command) + command = self.lstripPrompt(text=command) + command = command.replace(os.linesep + ps2, '\n') + command = command.replace(os.linesep, '\n') + command = command.replace('\n', os.linesep + ps2) + return command + + def EnterFromFile(self, commands): + """take contents of ptf (python turtle function) file, split into + separate functions, and enter them""" + + #can't handle it if multiple defs are fed in at once; split them, + #and handle them individually + commandList = commands.split("def") + for command in commandList: + #split results in some blank strings where def was + if(len(command) > 0): + #split above removes def, so need to add it back + command = "def" + command + command = self.FormatCommand(command) + self.write(command) + self.processLine() + self.prompt() + self.processLine() + self.prompt() def Paste(self): """Replace selection with clipboard contents.""" if self.CanPaste() and wx.TheClipboard.Open(): - ps2 = str(sys.ps2) + if wx.TheClipboard.IsSupported(wx.DataFormat(wx.DF_TEXT)): data = wx.TextDataObject() if wx.TheClipboard.GetData(data): self.ReplaceSelection('') command = data.GetText() - command = command.rstrip() - command = self.fixLineEndings(command) - command = self.lstripPrompt(text=command) - command = command.replace(os.linesep + ps2, '\n') - command = command.replace(os.linesep, '\n') - command = command.replace('\n', os.linesep + ps2) + command = self.FormatCommand(command) self.write(command) wx.TheClipboard.Close() From 82395bef3f2b75c6e8e9825fd3d964ad2862bb56 Mon Sep 17 00:00:00 2001 From: Tom Hanks Date: Thu, 6 Feb 2020 18:42:01 -0700 Subject: [PATCH 2/2] -adding help files for Using Files --- pythonturtle/helppages.py | 1 + pythonturtle/resources/UsingFilesHelp.png | Bin 0 -> 23200 bytes pythonturtle/resources/UsingFilesHelp.txt | 27 ++++++++++++++++++++++ 3 files changed, 28 insertions(+) create mode 100644 pythonturtle/resources/UsingFilesHelp.png create mode 100644 pythonturtle/resources/UsingFilesHelp.txt diff --git a/pythonturtle/helppages.py b/pythonturtle/helppages.py index c318571..bc992e7 100644 --- a/pythonturtle/helppages.py +++ b/pythonturtle/helppages.py @@ -69,6 +69,7 @@ def page_list(parent=None): ["Level 2", resource_filename("help2.png")], ["Level 3", resource_filename("help3.png")], ["Level 4", resource_filename("help4.png")], + ["Using Files", resource_filename("UsingFilesHelp.png")], ] pages = [ diff --git a/pythonturtle/resources/UsingFilesHelp.png b/pythonturtle/resources/UsingFilesHelp.png new file mode 100644 index 0000000000000000000000000000000000000000..1ac84fef3da044c6268484a980091f01e964ced9 GIT binary patch literal 23200 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 literal 0 HcmV?d00001 diff --git a/pythonturtle/resources/UsingFilesHelp.txt b/pythonturtle/resources/UsingFilesHelp.txt new file mode 100644 index 0000000..a383e5f --- /dev/null +++ b/pythonturtle/resources/UsingFilesHelp.txt @@ -0,0 +1,27 @@ +PythonTurtle can load a file with functions already in it. These functions +will then be available to use in your programs. +Note: The file can contain only functions; it can't contain direct commands +like "go". It can only contain functions that start with "def". Other +items will cause a "syntax error" when loading. + +How to load functions from a file: + +-Create a file, using a text editor. + +-Add functions to the file; for example: + +def polygon(n): + for i in range(n): + go(50) + turn(360.0/n) + +def polygon100(n): + for i in range(n): + go(100) + turn(360.0/n) + +-Save the file with the extension ".ptf" + +-From PythonTurtle, select File->Open... + +-Select your file and open. \ No newline at end of file