0

I am building a app to print randomly generated data. I have a entry control that I would like to control the number of records that will be generated. Currently I have it working to get the int stored in the entry box but only the default value is being pulled.

It seems that Tkinter requires a value in the entry before it will start.

I am also having a problem which ever button is called last is being printed no matter what button the user has clicked

# file -> gui.py
# IMPORT tkinter for GUI creation and import scripts for functions
from tkinter import *
from tkinter.ttk import *
import scripts


# create main window
# window specs are 700 x 350 and window is not able to be resizeable
windowDim = str(700)+'x'+str(350)
window = Tk()
window.title("INFO GENERATOR")
window.geometry(windowDim)
window.resizable(False, False)
# CREATING USER CONTROLS
# each button will print a list of items (number of items will be come from the entry userValue)
userEntry = Entry(window)
#userValue = int(userValue)

userValue = 3

userEntry.place(x=450, y=200)
userEntry.insert(0, userValue)
updateButton = Button(window, text="UPDATE",
                      ).place(x=475, y=225)

userValueLabel = Label(
    window, text="ENTER AMOUNT OF RECORDS YOU WOULD LIKE").place(x=400, y=170)
label = Label(window, text="INFOMATION GENERATOR by Noah Mackay ",
              background='#9999ff').pack()


def outputEmails(userValue):
    # function receives the amount of records the user wants to print
    # function will be called when email button is clicked
    # this function will clear the output file and then read open it
    # will call the generateEmail function from scripts.py file
    # outputs the amount of records based on the user input in the entry text box
    outputFile = scripts.generateEmail(userValue)
    file = open('output.txt', 'w').close()
    file = open('output.txt', 'w')
    file.write(str(outputFile))


def outputNames(userValue):
    # function receives the amount of records the user wants to print
    # function will be called when email button is clicked
    # this function will clear the output file and then read open it
    # will call the generateEmail function from scripts.py file
    # outputs the amount of records based on the user input in the entry text box
    outputFile = scripts.generateName(userValue)
    file = open('output.txt', 'w').close()
    file = open('output.txt', 'w')
    file.write(str(outputFile))


def outputCost(userValue):

    outputFile = scripts.generateCost(userValue)
    file = open('output.txt', 'w').close()
    file = open('output.txt', 'w')
    file.write(str(outputFile))


def outputProduct(userValue):

    outputFile = scripts.generateProduct(userValue)
    file = open('output.txt', 'w').close()
    file = open('output.txt', 'w')
    file.write(str(outputFile))


def outputPhoneNumber(userValue):

    outputFile = scripts.generatePhoneNumber(userValue)
    file = open('output.txt', 'w').close()
    file = open('output.txt', 'w')
    file.write(str(outputFile))

# creates 5 buttons each have their respective output function attached using command=


emailButton = Button(window, text="EMAILS",
                     command=outputEmails(userValue)).place(x=40, y=50)
nameButton = Button(
    window, text="FIRST AND LAST NAMES", command=outputNames(userValue)).place(x=40, y=100)

productButton = Button(window, text="PRODUCTS",
                       command=outputProduct(userValue)).place(x=40, y=200)
phoneNumberButton = Button(
    window, text="PHONE NUMBERS").place(x=40, y=250)
costButton = Button(window, text="PRICES",
                    command=outputCost(userValue)).place(x=40, y=150)


window.mainloop()



# file -> scripts.py
import random


def generateName(numberOfItemsNeed):
    # opens 2 files. One containing first names and the other containing last names
    firstNameFile = open('dataFiles\FirstNamesData.txt', 'r')
    lastNameFile = open('dataFiles\LastNamesData.txt', 'r')
    # builds values for the while statement and the return string
    returnValue = ""
    counter = 0

# builds the return string using a while loop and removing the newline character
# after each line from both files when being read
    while counter < int(numberOfItemsNeed):
        returnValue += str(firstNameFile.readline().strip("\n")
                           ) + " " + str(lastNameFile.readline().strip("\n")) + "\n"
        counter = counter + 1
# returns a list of "human" names in a single string divided by a newline character
    return (returnValue)


def generateEmail(numberOfItemsNeed):
    # opens a file containing a records of first names
    firstNameFile = open('dataFiles\dictonary.txt', 'r')
    counter = 0
    # A list of commonly used email address suffixs
    suffix = ['@gmail.com', '@gmail.ca', '@hotmail.com',
              '@hotmail.ca', '@mail.com ', '@mail.ca', '@gov.ca']
    returnValue = ""

    while counter < int(numberOfItemsNeed):
        returnValue += firstNameFile.readline().strip("\n") + \
            str((random.randrange(0, 100))) + \
            suffix[random.randrange(0, len(suffix))]+'\n'
        counter = counter + 1
    return (returnValue)


def generateCost(numberOfItemsNeed):
    # generates a random item price in the inclusive range of 0.00$ to 1000.99$
    counter = 0
    cost = ""
    while counter < int(numberOfItemsNeed):
        cost += '$' + str(random.randrange(0, 1000)) + \
            "." + str(random.randrange(0, 99)) + '\n'
        counter = counter+1
    return cost


def generateProduct(numberOfItemsNeed):
    counter = 0
    returnValue = ""
    productList = open('dataFiles\itemData.txt', 'r')
    while counter < int(numberOfItemsNeed):
        returnValue += str(productList.readline()
                           ).strip("\n") + str(generateCost(1))
        counter = counter + 1
    return (returnValue)


def generatePhoneNumber(numberOfItemsNeed):
    counter = 0
    returnValue = ""
    while counter < int(numberOfItemsNeed):

        firstNumber = str(random.randrange(100, 999))
        secondNumber = str(random.randrange(1000, 9999))
        thirdNumber = str(random.randrange(100, 999))

        returnValue += firstNumber + "-" + secondNumber + "-" + thirdNumber + '\n'
        counter = counter + 1
    return (returnValue)


def shuffleFile(filePath):
    lines = open(filePath).readlines()
    random.shuffle(lines)
    open(filePath, 'w').writelines(lines)


# shuffleFile('dataFiles\dictonary.txt')
npmackay
  • 33
  • 1
  • 5
  • You're calling all the `outputXXX()` functions when you create the buttons, not when they're clicked. The `command` argument needs to be a function reference, not a call to the function itself. Use a `lambda`. – Barmar Jan 20 '23 at 17:15
  • @Barmar thank you for this. new to python so could not figure out what was going wrong – npmackay Jan 20 '23 at 17:23

0 Answers0