I am currently working on creating a paint program using python and pygame. I am currently having trouble with creating the undo/redo function in the program. The way I was thinking of doing so would be to save the canvas image after each time the user releases the mouse, but I am not sure if the individual images would have to be saved in a temporary folder that is deleted after the program is closed. I have also read that this method can affect performance of the program so I am wondering if there are any other methods that will work more efficiently. Thank you.
Paint Program in Python - Undo and Redo
1.1k views Asked by user2950875 At
2
There are 2 answers
0
Bartlomiej Lewandowski
On
My suggestion is to have a buffer of the last operations that have been done. Each operation will consist of a sprite, and a position of where it is placed.
You will be drawing the canvas, as well as all sprites from that buffer. When you have to many sprites in the buffer, you can blit the oldest onto the canvas, thus saving memory.
The undo itself would be rather easy. Just remove the last sprite that was added.
A redo would be slightly more difficult. Since instead of removing, I would have a pointer, that points to the last sprite that I will draw. If a new action will be added, only then I remove all the sprites that have been "invisible".
Related Questions in PYTHON
- How to store a date/time in sqlite (or something similar to a date)
- Instagrapi recently showing HTTPError and UnknownError
- How to Retrieve Data from an MySQL Database and Display it in a GUI?
- How to create a regular expression to partition a string that terminates in either ": 45" or ",", without the ": "
- Python Geopandas unable to convert latitude longitude to points
- Influence of Unused FFN on Model Accuracy in PyTorch
- Seeking Python Libraries for Removing Extraneous Characters and Spaces in Text
- Writes to child subprocess.Popen.stdin don't work from within process group?
- Conda has two different python binarys (python and python3) with the same version for a single environment. Why?
- Problem with add new attribute in table with BOTO3 on python
- Can't install packages in python conda environment
- Setting diagonal of a matrix to zero
- List of numbers converted to list of strings to iterate over it. But receiving TypeError messages
- Basic Python Question: Shortening If Statements
- Python and regex, can't understand why some words are left out of the match
Related Questions in PYGAME
- Platform Generation for a Sky Hop clone
- How would I code player jump physics, similar to "soccer physics", and make players collide with a ball in pygame?
- creating cutscenes using OOP and pygame
- Building pygame game with buildozer causes fatal error
- Rendering a visualisation of matrix using pygame
- problem with the automatic jump function - doodlejump pygame
- After starting my code it closes immediately
- Python OpenCV and PyGame threading issue
- I can't set up a timer in my clicker game
- I'm making a piano with pygame and I've been trying to activate a tile's animation through key input but I haven't been able to figure it out
- collision detection in pygame-python
- Im trying to freeze my screen whats the code and variable?
- AI and Game physics
- Trying to spawn n non-colliding sprites; pygame crashing
- How to create certain pixels translucent in pygame
Related Questions in PAINT
- Java Swing Paint Performance
- Allow users to resize into negative height / width
- How to use CSS Paint API with React
- Paint-like a pp on Unity too slow
- Performance issues on Chrome when painting many characters at 80-130px font-size range
- How to changes the brush width
- PaintSurfaceView crash
- Color dialog causing an issue when used in a property grid
- Mac Paint Pro .paint file with layers to open in photoshop or other software
- painted a cell pressing button VBA EXCEL
- Creating an Erasor in a PaintApp between 2 Graphics
- I want to create a simple Paint in Java
- how to draw a rectangle from the center in PyQt6?
- How do I draw an Image into a panel?
- How to recognize Surface Pro Pen in flutter dektop application
Related Questions in UNDO
- Mac Catalyst disabled SwiftData automatic Undo
- Undo logs are not truncating even the parameter is set to ON
- how to remove a renamed file from last git commit?
- Git undo force push to remote branch
- Override browser "undo" key command in Javascript?
- Issues with implementing an undo feature with stacks in Java
- In Neovim, can I undo a lua function call that wrote to 2 different buffers at once with a single :undo command?
- I tried editor.trigger('myapp','undo') but it's not working as expected
- Add undo to a SortableJS list with nested list(s)
- Multiple Originators in Memento
- Control-Z and Control-Y not working in CustomTkinter TextBox
- Implementing undo in a state-machine based application
- with excel vba code, how can return the cell it's previous state when deleting seleted option in the cell?
- Rollback in Flyway
- Cannot Undo my temporary changes in Intellij Using Command+Z
Related Questions in REDO
- Logminer memory usage
- I tried editor.trigger('myapp','undo') but it's not working as expected
- Is it possible to redo the files from explorer in VS Code?
- Implementing undo/redo for existing application (C++/Multiplatform)
- Undo/redo image progress
- Undo and Redo Button in Kivy with Canvas
- In Java for Undoable Edit Multiple edits and String won't split
- Oracle database "log file sync" wait event
- How to get Prettier to work with autosave and keep redo logs
- Redo inside if in Ruby?
- How to redo tryCatch after error in for loop
- How to join DBA_HIST_* tables with V$LOGMNR_CONTENTS table - Oracle DB
- Eclipse Undo/Redo Binding Key Shortcuts Not Working
- Creating "redo" function to return to beginning of multiple functions in Python
- Java - netbeans - Undo / Redo Code for a notepadGUI
Popular Questions
- How do I undo the most recent local commits in Git?
- How can I remove a specific item from an array in JavaScript?
- How do I delete a Git branch locally and remotely?
- Find all files containing a specific text (string) on Linux?
- How do I revert a Git repository to a previous commit?
- How do I create an HTML button that acts like a link?
- How do I check out a remote Git branch?
- How do I force "git pull" to overwrite local files?
- How do I list all files of a directory?
- How to check whether a string contains a substring in JavaScript?
- How do I redirect to another webpage?
- How can I iterate over rows in a Pandas DataFrame?
- How do I convert a String to an int in Java?
- Does Python have a string 'contains' substring method?
- How do I check if a string contains a specific word?
Trending Questions
- UIImageView Frame Doesn't Reflect Constraints
- Is it possible to use adb commands to click on a view by finding its ID?
- How to create a new web character symbol recognizable by html/javascript?
- Why isn't my CSS3 animation smooth in Google Chrome (but very smooth on other browsers)?
- Heap Gives Page Fault
- Connect ffmpeg to Visual Studio 2008
- Both Object- and ValueAnimator jumps when Duration is set above API LvL 24
- How to avoid default initialization of objects in std::vector?
- second argument of the command line arguments in a format other than char** argv or char* argv[]
- How to improve efficiency of algorithm which generates next lexicographic permutation?
- Navigating to the another actvity app getting crash in android
- How to read the particular message format in android and store in sqlite database?
- Resetting inventory status after order is cancelled
- Efficiently compute powers of X in SSE/AVX
- Insert into an external database using ajax and php : POST 500 (Internal Server Error)
writing a copy to file does sound a bit heavy handed, does it need to be unlimited undo? I would suggest using something like pythons collections.deque as a circular buffer to save the last N modifications, this would save you having to worry about cleanup and disk storage. If taking full snapshots each time turns out to be to much performance wise you may need to look into limiting eached saved region to a specific bounding box based on whatever that last action was that the user performed.