Skip to content
Advertisement

How can I condense this Python Tkinter GUI input code?

I’m taking part in Code in Place 2021 and for my final project I developed a Madlibs generator using Python and Tkinter, and the code is functional and works the way I want it to, but obviously it’s pretty long and convoluted. I was hoping some of you guys could offer some suggestions on how to make my code more concise and get rid of any unncessary lines!

I pasted all of the code below:

from tkinter import *

# initialize window
root = Tk()
canvas1 = Canvas(root, width=500, height=750)
canvas1.pack()
root.title('Mad Libs Generator')

# creates input fields for user to enter words
label1 = Label(root, text= 'Final Project Mad Libs Generator n Enter your words below!' , font = ('helvetica', 20))
canvas1.create_window(250, 40, window=label1)

label2 = Label(root, text='Adverb:', font = ('helvetica', 15))
canvas1.create_window(150, 100, window=label2)

entry1 = Entry(root)
canvas1.create_window(300, 100, window=entry1)

label2 = Label(root, text='Noun:', font = ('helvetica', 15))
canvas1.create_window(150, 130, window=label2)

entry2 = Entry(root)
canvas1.create_window(300, 130, window=entry2)

label2 = Label(root, text='Liquid:', font = ('helvetica', 15))
canvas1.create_window(150, 160, window=label2)

entry3 = Entry(root)
canvas1.create_window(300, 160, window=entry3)

label2 = Label(root, text='Verb:', font = ('helvetica', 15))
canvas1.create_window(150, 190, window=label2)

entry5 = Entry(root)
canvas1.create_window(300, 190, window=entry5)

label2 = Label(root, text='Number:', font = ('helvetica', 15))
canvas1.create_window(150, 220, window=label2)

entry6 = Entry(root)
canvas1.create_window(300, 220, window=entry6)

label2 = Label(root, text='Noun(Plural):', font = ('helvetica', 15))
canvas1.create_window(150, 250, window=label2)

entry7 = Entry(root)
canvas1.create_window(300, 250, window=entry7)

label2 = Label(root, text='Verb:', font = ('helvetica', 15))
canvas1.create_window(150, 280, window=label2)

entry8 = Entry(root)
canvas1.create_window(300, 280, window=entry8)

label2 = Label(root, text='Adjective:', font = ('helvetica', 15))
canvas1.create_window(150, 310, window=label2)

entry9 = Entry(root)
canvas1.create_window(300, 310, window=entry9)

label2 = Label(root, text='Noun:', font = ('helvetica', 15))
canvas1.create_window(150, 340, window=label2)

entry10 = Entry(root)
canvas1.create_window(300, 340, window=entry10)

label2 = Label(root, text='Noun(Plural):', font = ('helvetica', 15))
canvas1.create_window(150, 370, window=label2)

entry11 = Entry(root)
canvas1.create_window(300, 370, window=entry11)

label2 = Label(root, text='Illness:', font = ('helvetica', 15))
canvas1.create_window(150, 400, window=label2)

entry12 = Entry(root)
canvas1.create_window(300, 400, window=entry12)

label2 = Label(root, text='Occupation:', font = ('helvetica', 15))
canvas1.create_window(150, 430, window=label2)

entry14 = Entry(root)
canvas1.create_window(300, 430, window=entry14)

label2 = Label(root, text='Body Part(Plural):', font = ('helvetica', 15))
canvas1.create_window(150, 460, window=label2)

entry15 = Entry(root)
canvas1.create_window(300, 460, window=entry15)

label2 = Label(root, text='Body Part:', font = ('helvetica', 15))
canvas1.create_window(150, 490, window=label2)

entry16 = Entry(root)
canvas1.create_window(300, 490, window=entry16)

# function that retrieves words and transfers them into the story
def generateMadLib():
    adverb=entry1.get()
    noun=entry2.get()
    liquid=entry3.get()
    verb=entry5.get()
    number=entry6.get()
    nounp=entry7.get()
    verb2=entry8.get()
    adjective=entry9.get()
    noun2=entry10.get()
    nounp2=entry11.get()
    illness=entry12.get()
    occupation=entry14.get()
    bodypartp=entry15.get()
    bodypart=entry16.get()

    label3 = Label(root, text= 'Here is your Mad Lib!', font = 'helvetica')
    canvas1.create_window(250, 580, window=label3)

    label4 = Label(root, text = ('In order to wash your face ' +adverb+ ' , you must wet your ' +noun+ ' in warm ' +liquid+'. n Then, '+verb+' it across your face '+number+' times. This will wash off any remaining '+nounp+'. n When you are done you should '+verb2+' the cloth in '+adjective+' water to clean it. nYou should also wash your face with a '+noun2+' to keep it smooth and shiny. n This will keep also keep away '+nounp2+'. Don`t worry. n It is normal to experience '+illness+' the first time you try this. n Consult your '+occupation+' if you break out in '+bodypartp+'. This works well on your '+bodypart+' too!'), font=('helvetica', 9))
    canvas1.create_window(250, 650, window=label4)

# button that calls the function to generate the completed story
button1 = Button(text='Generate  Lib!', command=generateMadLib, bg='red', fg='white', font=('helvetica', 9, 'bold'))
canvas1.create_window(250, 525, window=button1)

root.mainloop() 

Advertisement

Answer

You can reduce your code to half if you use for loop and list.

Here is an example, you can modify the below code according to your need:

from tkinter import *

# initialize window
root = Tk()
root.title('Mad Libs Generator')

# creates input fields for user to enter words
label1 = Label(root, text='Final Project Mad Libs Generator n Enter your words below!', font=('helvetica', 20))
label1.pack()

frame = Frame(root)
frame.pack()

lst = ['Adverb', 'Noun', 'Liquid', 'Verb', 'Number', 'Noun(Plural)',
       'Verb', 'Adjective', 'Noun', 'Verb', 'Adjective', 'Noun(Plural)', 'Illness',
       'Occupation', 'Body part(plural)', 'Body part']

entries = []

for row, x in enumerate(lst):
    Label(frame, text=f'{x}:').grid(row=row, column=0)
    ent = Entry(frame)
    ent.grid(row=row, column=1)
    entries.append(ent)


# function that retrieves words and transfers them into the story
def generateMadLib():
    story = 'In order to wash your face {0}, you must wet your {1} in warm {2}.n Then, {3}'
           'it across your face {4} times. This will wash off any remaining {5}.n When you'
           'are done you should {6} the cloth in {7} water to clean it. nYou should also wash'
           'your face with a {8} to keep it smooth and shiny.n This will keep also keep away'
           '{9}. Don`t worry. n It is normal to experience {10} the first time you try this.n'
           'Consult your {11} if you break out in {12}. ' 
           'This works well on your {13} too! '.format(*(x.get() for x in entries))

    label3 = Label(root, text='Here is your Mad Lib!', font='helvetica')
    label3.pack()

    label4 = Label(root, text=story)
    label4.pack()

# button that calls the function to generate the completed story
button1 = Button(root, text='Generate  Lib!', command=generateMadLib, bg='red', fg='white',
                 font=('helvetica', 9, 'bold'))
button1.pack()

root.mainloop()
User contributions licensed under: CC BY-SA
1 People found this is helpful
Advertisement