Python ‘Found Poem’ Generator – User Interaction – Adding Buttons

Working through my list of enhancements for my ‘Found Poem’ Generator that I documented in a previous blog post: 

1. Output the created poems to a larger screen ie a graphical type large fonted output rather than  using the console window.
2. Provide two methods of running:
a. Auto-generate a new poem every 5 minutes or so
b. Provide buttons for user input to create poems on demand
3. Package the program up to be self-contained
4. Deploy the program onto some sort of platform that wasn’t my Mac laptop ie a Raspberry PI and large screen monitor or TV
5. Make the program auto-run when the device is started / restarted

Further enhancements could then be:

6. Use a text / csv file to load in the words and lines of the poems rather than the hardcoded ones used currently
7. Check the first letter of each line to capitalise it for poems and un-capitalise it for haikus, and add commas to the end of lines if they are missing or remove for haikus.

This blog post describes the update for item number 2(b):

2. Provide two methods of running:
a. Auto-generate a new poem every 5 minutes or so
b. Provide buttons for user input to create poems on demand

My previous experience with programming GUIs started a long time ago with Microsoft Access 2 and Visual Basic 4 and then, later, a number of Borland Delphi iterations with Microsoft SQL Server. With these development environments you got, well, development environments and that meant a WYSIWIG screen designer and a palette of buttons, text boxes, counters and other widgets to choose from. Not so with Python.

Tkinter Screen Layout Design

I had a google around for a WYSWIG screen designer but there really doesn’t seem to be anything that is recommended, one suggestion was to use graph paper but I’m not sure this project is complex enough to go that far. It seems that hand-coding buttons and labels is the way to go using one of the three Layout or Geometry Managers that Tkinter possess. These are Pack, Grid and Place:

‘Pack’, I’m informed, is the easiest to use but gives least control over placement of widgets, merely their relative positions to each other.

‘Place’ is used explicitly to set the position and size of a window, either in absolute terms or relative to another window. This didn’t sound like the sort of thing for creating and laying out a bunch of buttons.

‘Grid’ is similar to Pack but allows a certain amount of control of the placement of widgets by allocating them x and y co-ordinates within a notional two dimensional grid. The dimensions are then determined by the Grid Manager. This sounded the most likely candidate to try and use.

Tkinter Command Buttons

So now I have an inkling of how to place my buttons, my next task is to find out how to create the buttons and then assign the ‘poem’ and ‘haiku’ commands to them such that I could generate some interactive output.

Turning to the code, the first thing I found was that the label I was using to place the text on the screen, using an example copied from the internet, was using the ‘pack’ command. In order to keep things simple, I decided to change course and stick with the ‘pack’ function and see what the outcome was before deciding if I needed to get more complex with my button placement.

In the end I created three buttons and a slider bar, the buttons were for quitting the program (just to make things simpler for testing, I’ll remove this one later), a ‘haiku’ button and a ‘poem’ button. The slider allows the user to slide the scale from 1 to the number of ‘found’ lines there are available before pressing the ‘poem’ button to generate a poem of that number of lines. 


In doing this I uncovered what I thought was a bug in the system where after generating one haiku the program would appear to freeze with the spinning pointer icon, yet the ‘poem’ button worked fine. I say it worked fine, a little more button pressing revealed that the ‘poem’ button also eventually ran into the same problem, and then the penny dropped. The code is designed to mark any lines used in a poem as such ie already used, this meant that the ‘haiku’ function was very quickly running out of 3 and 5 syllable lines to use and so the program got stuck in an endless loop of looking for lines that weren’t there.

The fix was easy, to clear the ‘line already used’ flag between each press of a button. I’m not altogether happy with this outcome as my design was to ensure each poem produced was unique, which logically thinking couldn’t actually work unless I had infinite lines of poem to draw from. A case of having to admit my design was flawed and forge ahead with the new working design.

Source code available here for this update.

More posts in this series:

Python ‘Found Poem’ Generator – Part 1 – Introduction

Python ‘Found Poem’ Generator – Part 2 – Adding Haikus

Python ‘Found Poem’ Generator – Part 3 – The Next Level

Python ‘Found Poem’ Generator – Part 4 – Outputting Text To A Graphical Screen

–> This one –>Python ‘Found Poem’ Generator – Part 5 – User Interaction – Adding Buttons

Python ‘Found Poem’ Generator – Part 6 – Loading Data From A File

Python ‘Found Poem’ Generator – Part 7 – Counting Syllables and Words

Thank you again to all my followers and regular readers, and hello to you if you are new to my blog!

There’s an eclectic mix of posts on here, from writing and poetry to banjos and guitars, art, photography and computing, so feel free to dive in and have a look around,

New to this site? Click here to visit my About Me section.

Follow me @ponyfolk on Instagram for my multi-medium art and @shadowthepoet on Twitter

Want to introduce yourself, your art, your blog or you world and discover all that is new in the world? Click here for my ‘Join the Revolution’ page.

Go well!

6 thoughts on “Python ‘Found Poem’ Generator – User Interaction – Adding Buttons

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s