Project Py-Meme
I decided to have a crack at a brand new project, a meme creator with, of course, a Shambles GUI.

A meme is just a funny image, with some amusing text on it, like this example:

There is nothing new about this of course, memes have been doing the rounds since the early 1990s, hey I’m catching up!
I got started writing the code with the slimmest of plans, do I ever learn from my past mistakes? Yes and no, I know I will get in trouble as soon as the project gets complicated and as I realise what features need to be added I will regret not planning for it. See virtually any of my previous projects on this blog for an example.
But, just going for it with great enthusiasm is just how I do things, it’s how my brain works, I cannot see past the initial concept, no matter how hard I try, and I have tried.
One thing I found when planning too much and trying to pre-empt problems and what future features to add actually scares me off as I have very low coding skill and confidence.
Enough crying already. Project Py-Meme.
- create GUI frame
- Load and display image
- User inputs text on image
- save image.
At the time of writing I have achieved the above four elements and it works. I wouldn’t say I am happy with it, as it needs a lot of work to make it more useful, user friendly and flexible.
There are many problems with this project, most of which I can’t seem to get past as yet.
- Some images won’t load or load and crash when try to put text on.
- I can’t work out yet how to undo the users text, if required.
- How do I know weather to use black or white text on the background, maybe give the user the option to change text colour?
- I haven’t looked into fonts yet but font and font size should be offered I guess. But this will open up a small can of worms on text width etc.
- Baring in mind that the text is converted to an image before being placed on the background (not my doing, it’s the only way to get it centred) how can I allow for multiple lines of text if the user requires it.
At the moment I am at a quite low ebb after all the Xmas shenanigans that goes on. I don’t feel particularly good, and the Pyinstaller false positive virus problem is just depressing me to the point that I started looking at other programming languages.
After reading the first chapter on a beginners guide to Ruby I quickly came back to Python knowing that this is the best I can ever hope for. Don’t get me wrong, I love Python and appreciate all the hard work that goes on behind the scenes by volunteers and that it is free, I just get very frustrated that I don’t really understand how to use it properly yet.
Sob. If only Amos Basic was ported properly to the PC, I could of died a happy man.
Anyway, here is my crap Python code, it works sometimes. It can act as a reminder on how not to code I guess.

Double click inside the code box to select all
'''
PyMeMe Test Version
By Steve Shambles
Dec 2018
https://stevepython.wordpress.com/
'''
from tkinter import Tk, Label, LabelFrame, Menu, messagebox, RIDGE, \
simpledialog, filedialog
from PIL import Image, ImageTk, ImageFont, ImageDraw
# Create the main gui window
ROOT = Tk()
ROOT.title('PyMeMe -test version')
ROOT.geometry('830x630')
ROOT.resizable(False, False)
# Create frame for the image
FRAME0 = LabelFrame(ROOT, relief=RIDGE)
FRAME0.grid(padx=10, pady=10)
def user_load_image():
global IMAGE
'''offer file dialog for user to select an image'''
FILE_SELECTED = filedialog.askopenfilename(title='Select Image')
# resize and display image
IMAGE = Image.open(FILE_SELECTED)
IMAGE = IMAGE.resize((800, 600), Image.ANTIALIAS)
user_photo = ImageTk.PhotoImage(IMAGE)
LABEL = Label(FRAME0, image=user_photo)
LABEL.IMAGE = user_photo
LABEL.grid()
def add_top_text():
'''Input dialog for user to enter text for top of image'''
top_text = simpledialog.askstring(title='PyMeMe', \
prompt='Enter Top Text, Max 20 chars:')
top_text = top_text.upper()
draw = ImageDraw.Draw(IMAGE, "RGBA")
impact = ImageFont.truetype("impact.ttf", 80)
W, H = (800, 80)
w, h = impact.getsize(top_text)
draw.text(((W-w)/2, (H-h)), str(top_text), font=impact)
IMAGE.save("foo.jpg")
update_image()
def add_bottom_text():
'''Input dialog for user to enter text for bottom of image'''
bot_text = simpledialog.askstring(title='PyMeMe', prompt='Enter Bottom Text:')
bot_text = bot_text.upper()
draw = ImageDraw.Draw(IMAGE, "RGBA")
impact = ImageFont.truetype("impact.ttf", 80)
W, H = (800, 590)
w, h = impact.getsize(bot_text)
draw.text(((W-w)/2, (H-h)), str(bot_text), font=impact)
IMAGE.save("foo.jpg")
update_image()
def update_image():
'''Updates image with text on it'''
global IMAGE
IMAGE = Image.open('foo.jpg')
user_photo = ImageTk.PhotoImage(IMAGE)
LABEL = Label(FRAME0, image=user_photo)
LABEL.IMAGE = user_photo
LABEL.grid(row=0, column=0)
# Drop-down menu.
MENU_BAR = Menu(ROOT)
FILE_MENU = Menu(MENU_BAR, tearoff=0)
MENU_BAR.add_cascade(label='Menu', menu=FILE_MENU)
FILE_MENU.add_command(label='Visit Blog', command="")
FILE_MENU.add_command(label='About', command="")
FILE_MENU.add_command(label='Exit', command="")
FILE_MENU2 = Menu(MENU_BAR, tearoff=0)
MENU_BAR.add_cascade(label='Text', menu=FILE_MENU2)
FILE_MENU2.add_command(label='Add Top Text. max 20 chars', command=add_top_text)
FILE_MENU2.add_command(label='Add Bottom Text, max 20 chars', command=add_bottom_text)
ROOT.config(menu=MENU_BAR)
user_load_image()
ROOT.mainloop()
Using Python V3.6.5(32 bit) on Windows 7, (64 bit).
Previous post: Windows Shutdown Timer
from Python Coder
via read more
No comments:
Post a Comment