Python Forum
Entry field random pull from list, each return own line
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Entry field random pull from list, each return own line
#1
Extremely new to python and programming. I am working on creating a user interface that will pull from defined lists to generate random names for table top RPG application, or any other form of RPG. I have been able to create a basic interface with defined libraries to be pulled from. So currently a request of 1 per entry box will generate a random creation off of the tables but prints with spacing between each variable returned. IE: Omar yraen Ouss ar. What I am trying to get returned would be Omaryraen Oussar. If more than 1 is entered into the entry field it returns each section from the libraries in order. IE: Irenn Cal eil fin Crim Alean neld lyl. The outcome for more than 1 should read as follows. Irenneil Crimneld and Calfin Aleanlyl. Any thoughts or ideas on how to fix this to generate the desired outcome? I have posted the code below to be looked at as well.
import tkinter as tk
import random

def generate_random_value():
    try:
        num_values = int(entry.get())
        if num_values > 0 and num_values <= len(demp):
            random_values = random.sample(demp,num_values)
            random_values2 = random.sample(dems,num_values)
            rv3 = random.sample(dehp,num_values)
            rv4 = random.sample(dehs,num_values)
            new_window = tk.Toplevel(window)
            combined_item = random_values+random_values2
            new_window.title("Wow!!")
            xresult_label=tk.Label(new_window, text='result')
            xresult_label.grid()
            xresult_label.config(text=random_values+random_values2+rv3+rv4)
        else:
            result_label.config(text="Invalid input")
            result_label.grid_forget()
    except ValueError:
        result_label.config(text="Invalid input")
    try:
        num_values = int(entry2.get())
        if num_values > 0 and num_values <= len(dems):
            random_values3 = random.sample(defp, num_values)
            rv5 = random.sample(defs,num_values)
            rv6 = random.sample(dehp,num_values)
            rv7 = random.sample(dehs,num_values)
            yresult_label=tk.Label(new_window, text='result')
            yresult_label.grid()
            yresult_label.config(text=random_values3+rv5+rv6+rv7)
        else:
            result_label.config(text="Invalid input")
            result_label.grid_forget()
    except ValueError:
        result_label.config(text="Invalid input")
        
window=tk.Tk()
window.title("Random Value Generator")

#Dark Elf
#Male prefix
demp = ['Alak','Alt','Alton','Antr','Amal','Bar','Bel','Bhen','Berg','Brar','Cal','Chasz','Cor','Dant','Dhaun','Danv','Din','Dur','Elk','Elaug','Erth','Geld','Ghaun','Gul','Hatch','Imd','Iren','Irenn','Kalan','Ker','Kron','Kren','Krer','Mer','Mern','Niln','Nilo','Nym','Nyr','Omar','Phar','Phyx','Sor','Quev','Quen','Rinn','Riz','Ryl','Tsa','Tsab','Teb','Tlu','Tluth','Torr','Vel','Vell','Vuz','Vorn','Zak']
#Male suffix
dems = ['agh','ahn','aun','afein','al','axle','daer','drin','eld','eil','fin','fein','fryn','ica','imar','inid','irahc','kah','myr','nas','nar','nozz','olin','omph','or','rar','rak','ril','tar','trin','trol','tro','vun','vex','ven','vyr','yl','yln','yrd','yraen','zaer','zen','zyr']
#Female prefix
defp = ['Akor','Alon','Ang','Aun','Bae','Bar','Belar','Chal','Char','Chess','Dil','Dur','Dris','Elvan','Elv','Erel','Ethe','Felar','Faer','Felyn','Gin','Hael','Hal','Houn','Ilam','In','Iril','Irae','Ily','Ilm','Jan','Jhael','Lael','Lir','Lurd','Lua','Mua','Mae','Myr','Nhath','Nhil','Nes','Pallan','Phyr','Quar','Quilv','Rauv','Ril','Shri','Sur','Sin','Tal','Tiel','Triss','Vas','Vier','Vlon']
#Female suffix
defs = ['a','ae','aer','afae','ala','ayna','baste','brin','cyce','cyril','dia','dah','dril','e','eyel','fryn','iara','idil','inrir','iri','iista','ithra','kiira','lay','lara','na','niss','nitra','onia','onyss','quarra','quesi','rae','raena','rina','ryna','shalee','sin','stra','tana','thara','vex','xena','xen']
#House prefix
dehp = ['Alean','Ale','Arken','Auvrey','Baern','Barri','Cladd','Crim','De','Do','Des','Eils','Evreh','Helvi','Hla','Hun','Kin','Keil','Kae','Mae','Mel','Mye','Noqe','Noqu','Nili','Orly','Ouss','Rilyn','Takken','Tor','Zoa']
#House suffix
dehs = ['alfin','ailin','ani','ana','ar','arn','ath','duis','deris','drar','ervs','epp','ett','ghym','iryn','irin','iros','lyl','mtar','mtor','ndar','neld','rae','rahel','rret','sek','th','tlar','tyl','und','urden','val','vyr']

entry = tk.Entry(window,width=3)
entry.grid()
entry2 = tk.Entry(window,width=3)
entry2.grid()

button = tk.Button(window, text="Generate", command=generate_random_value)
button.grid()

result_label = tk.Label(window, text="")
result_label.grid()

window.mainloop()
deanhystad write Feb-23-2025, 04:47 AM:
Please post all code, output and errors (it it's entirety) between their respective tags. Refer to BBCode help topic on how to post. Use the "Preview Post" button to make sure the code is presented as you expect before hitting the "Post Reply/Thread" button.
Reply
#2
Divide and conquer. Break up a big task into multiple, simpler tasks. I would start by making a function that creates a random name.
import random

female_dark_elf_names = (
    ('Akor', 'Alon', 'Ang', 'Aun', 'Bae', 'Bar', 'Belar', 'Chal', 'Char'),
    ('a', 'ae', 'aer', 'afae', 'ala', 'ayna', 'baste', 'brin', 'cyce')
)
dark_elf_houses = (
    ('Alean','Ale','Arken','Auvrey','Baern','Barri'),
    ('alfin','ailin','ani','ana','ar','arn','ath')
)

def make_name(names, houses):
    return (
        f"{random.choice(names[0])}{random.choice(names[1])} "
        f"{random.choice(houses[0])}{random.choice(houses[1])}"
    )

print(make_name(female_dark_elf_names, dark_elf_houses))
Now it is easy to make multiple names.
def make_names(names, houses, count=1):
    return [make_name(names, houses) for _ in range(count)]

print(make_names(female_dark_elf_names, dark_elf_houses, 6))
Using random.choice() you could end up with two elves with the same name and same house. Statistically very unlikely, but possible. To eliminate that possibility you can use sample instead of choice. Probably why your code uses sample. However, this also eliminates the possibility of two elves from the same house or two elves with the same name but from different houses. This is how you could write make_names using random.sample.
def make_names(names, houses, count=1):
    np = random.sample(names[0], count)
    ns = random.sample(names[1], count)
    hp = random.sample(names[0], count)
    hs = random.sample(names[1], count)

    return [f"{np[i]}{ns[i]} {hp[i]}{hs[i]}" for i in range(count)]
And if you want to make 3 male and 2 female names:
new_characters = (
    make_names(male_dark_elf_names, dark_elf_houses, 3) +
    make_names(female_dark_elf_names, dark_elf_houses, 2)
)
And once you have that working it is easier to tie it into your tkinter program.
Reply
#3
How long do elves live?

Maybe this is something like what you want?

from secrets import choice

def make_names(gender):
    if gender == 'm':
        name = choice(data['demp']) + choice(data['dems']) + ' ' + choice(data['dehp']) + choice(data['dehs'])
        return name
    elif gender == 'f':
        name = choice(data['defp']) + choice(data['defs']) + ' ' + choice(data['dehp']) + choice(data['dehs'])
        return name

#Dark Elf
# Omaryraen Oussar
#Male prefix
demp = ['Alak','Alt','Alton','Antr','Amal','Bar','Bel','Bhen','Berg','Brar',
        'Cal','Chasz','Cor','Dant','Dhaun','Danv','Din','Dur','Elk','Elaug',
        'Erth','Geld','Ghaun','Gul','Hatch','Imd','Iren','Irenn','Kalan','Ker',
        'Kron','Kren','Krer','Mer','Mern','Niln','Nilo','Nym','Nyr','Omar',
        'Phar','Phyx','Sor','Quev','Quen','Rinn','Riz','Ryl', 'Tsa','Tsab',
        'Teb','Tlu','Tluth','Torr','Vel','Vell','Vuz','Vorn','Zak']
#Male suffix
dems = ['agh','ahn','aun','afein','al','axle','daer','drin','eld','eil','fin',
        'fein','fryn','ica','imar','inid','irahc','kah','myr','nas','nar','nozz',
        'olin','omph','or','rar','rak','ril','tar','trin','trol','tro','vun',
        'vex','ven','vyr','yl','yln','yrd','yraen','zaer','zen','zyr']
#Female prefix
defp = ['Akor','Alon','Ang','Aun','Bae','Bar','Belar','Chal','Char','Chess',
        'Dil','Dur','Dris','Elvan','Elv','Erel','Ethe','Felar','Faer','Felyn',
        'Gin','Hael','Hal','Houn','Ilam','In','Iril','Irae','Ily','Ilm','Jan','Jhael',
        'Lael','Lir','Lurd','Lua','Mua','Mae','Myr','Nhath','Nhil','Nes','Pallan','Phyr',
        'Quar','Quilv','Rauv','Ril','Shri','Sur','Sin','Tal','Tiel','Triss','Vas','Vier','Vlon']
#Female suffix
defs = ['a','ae','aer','afae','ala','ayna','baste','brin','cyce','cyril','dia','dah','dril',
        'e','eyel','fryn','iara','idil','inrir','iri','iista','ithra','kiira','lay','lara','na',
        'niss','nitra','onia','onyss','quarra','quesi','rae','raena','rina','ryna',
        'shalee','sin','stra','tana','thara','vex','xena','xen']
#House prefix
dehp = ['Alean','Ale','Arken','Auvrey','Baern','Barri','Cladd','Crim','De',
        'Do','Des','Eils','Evreh','Helvi','Hla','Hun','Kin','Keil','Kae','Mae',
        'Mel','Mye','Noqe','Noqu','Nili','Orly','Ouss','Rilyn','Takken','Tor','Zoa']
#House suffix
dehs = ['alfin','ailin','ani','ana','ar','arn','ath','duis','deris','drar','ervs',
        'epp','ett','ghym','iryn','irin','iros','lyl','mtar','mtor','ndar','neld',
        'rae','rahel','rret','sek','th','tlar','tyl','und','urden','val','vyr']

# put all the bits in 1 place
data = {d:[] for d in ['demp', 'dems', 'defp', 'defs', 'dehp', 'dehs']}

bits = [demp, dems, defp, defs, dehp, dehs]
count = 0
for key in data.keys():
    data[key] = bits[count]
    count +=1
    
genders = ['f', 'm']
gender = 'x'
while not gender in genders:
    print('Since Donald is president we don\'t do non-binary, you gotta be male or female! Enter m or f! ')
    gender = input('Are you male or female? Enter m or f ')

name = make_names(gender)

for gender in 'fmfmfm' :
    name = make_names(gender)
    print(f'How do you do {name}?')
Output:
How do you do Rauva Deailin? How do you do Calzyr Crimalfin? How do you do Ilmonyss Takkenrae? How do you do Imdkah Oussirin? How do you do Ginae Kinth? How do you do Nilnven Kaemtor?
Reply
#4
Thank you both for the responses with code to reference as well as functionality of it. So the original idea is to have multiple races listed with a button for each. Once a race button is clicked the original thought is to open a submenu on the same page with Male/Female labels, with each followed by an entry box. I need to take a look at both examples that have been provided to see which one will work the most efficiently and allow for multiple names, based off the value in the entry box, to be generated off of user selection. One of the main reasons that I have started to work on this is throughout my time playing role playing games, either as a player or the story teller, the party will end up in a new town and go to either a inn or shop and immediately ask the DM or ST what the name is of the individual they are speaking to is. And lets face it, having to generate names on the fly is a giant pita. So the outcome of this is to make life easier. Again, thank you both. Once I figure out what will work best I will post an updated response to this thread.
Reply
#5
(Feb-23-2025, 07:24 AM)Pedroski55 Wrote: How long do elves live?

Really its up to the campaign setting. For example in middle earth they pretty much live forever. However in other campaign settings it can be hundred or thousands of years.

Maybe this is something like what you want?

This works greatly!

On line 62 of the code that you posted, is the fmfmfm the count and gender to be printed? It looks that way but I wanted to clarify, like I said I am extremely new to python and this is the first script that I've truly worked with, so it's a learn as you go situation. End goal is to have a numeric value entered for each gender choice and then generate and print.

from secrets import choice

def make_names(gender):
    if gender == 'm':
        name = choice(data['demp']) + choice(data['dems']) + ' ' + choice(data['dehp']) + choice(data['dehs'])
        return name
    elif gender == 'f':
        name = choice(data['defp']) + choice(data['defs']) + ' ' + choice(data['dehp']) + choice(data['dehs'])
        return name

#Dark Elf
# Omaryraen Oussar
#Male prefix
demp = ['Alak','Alt','Alton','Antr','Amal','Bar','Bel','Bhen','Berg','Brar',
        'Cal','Chasz','Cor','Dant','Dhaun','Danv','Din','Dur','Elk','Elaug',
        'Erth','Geld','Ghaun','Gul','Hatch','Imd','Iren','Irenn','Kalan','Ker',
        'Kron','Kren','Krer','Mer','Mern','Niln','Nilo','Nym','Nyr','Omar',
        'Phar','Phyx','Sor','Quev','Quen','Rinn','Riz','Ryl', 'Tsa','Tsab',
        'Teb','Tlu','Tluth','Torr','Vel','Vell','Vuz','Vorn','Zak']
#Male suffix
dems = ['agh','ahn','aun','afein','al','axle','daer','drin','eld','eil','fin',
        'fein','fryn','ica','imar','inid','irahc','kah','myr','nas','nar','nozz',
        'olin','omph','or','rar','rak','ril','tar','trin','trol','tro','vun',
        'vex','ven','vyr','yl','yln','yrd','yraen','zaer','zen','zyr']
#Female prefix
defp = ['Akor','Alon','Ang','Aun','Bae','Bar','Belar','Chal','Char','Chess',
        'Dil','Dur','Dris','Elvan','Elv','Erel','Ethe','Felar','Faer','Felyn',
        'Gin','Hael','Hal','Houn','Ilam','In','Iril','Irae','Ily','Ilm','Jan','Jhael',
        'Lael','Lir','Lurd','Lua','Mua','Mae','Myr','Nhath','Nhil','Nes','Pallan','Phyr',
        'Quar','Quilv','Rauv','Ril','Shri','Sur','Sin','Tal','Tiel','Triss','Vas','Vier','Vlon']
#Female suffix
defs = ['a','ae','aer','afae','ala','ayna','baste','brin','cyce','cyril','dia','dah','dril',
        'e','eyel','fryn','iara','idil','inrir','iri','iista','ithra','kiira','lay','lara','na',
        'niss','nitra','onia','onyss','quarra','quesi','rae','raena','rina','ryna',
        'shalee','sin','stra','tana','thara','vex','xena','xen']
#House prefix
dehp = ['Alean','Ale','Arken','Auvrey','Baern','Barri','Cladd','Crim','De',
        'Do','Des','Eils','Evreh','Helvi','Hla','Hun','Kin','Keil','Kae','Mae',
        'Mel','Mye','Noqe','Noqu','Nili','Orly','Ouss','Rilyn','Takken','Tor','Zoa']
#House suffix
dehs = ['alfin','ailin','ani','ana','ar','arn','ath','duis','deris','drar','ervs',
        'epp','ett','ghym','iryn','irin','iros','lyl','mtar','mtor','ndar','neld',
        'rae','rahel','rret','sek','th','tlar','tyl','und','urden','val','vyr']

# put all the bits in 1 place
data = {d:[] for d in ['demp', 'dems', 'defp', 'defs', 'dehp', 'dehs']}

bits = [demp, dems, defp, defs, dehp, dehs]
count = 0
for key in data.keys():
    data[key] = bits[count]
    count +=1
    
genders = ['f', 'm']
gender = 'x'
while not gender in genders:
    print('Since Donald is president we don\'t do non-binary, you gotta be male or female! Enter m or f! ')
    gender = input('Are you male or female? Enter m or f ')

name = make_names(gender)

for gender in 'fmfmfm' :
    name = make_names(gender)
    print(f'How do you do {name}?')
Output:
How do you do Rauva Deailin? How do you do Calzyr Crimalfin? How do you do Ilmonyss Takkenrae? How do you do Imdkah Oussirin? How do you do Ginae Kinth? How do you do Nilnven Kaemtor?
Reply
#6
(Feb-23-2025, 07:24 AM)Pedroski55 Wrote: How long do elves live?

Really its up to the campaign setting. For example in middle earth they pretty much live forever. However in other campaign settings it can be hundred or thousands of years.

Maybe this is something like what you want?

This works greatly!

On line 62 of the code that you posted, is the fmfmfm the count and gender to be printed? It looks that way but I wanted to clarify, like I said I am extremely new to python and this is the first script that I've truly worked with, so it's a learn as you go situation. End goal is to have a numeric value entered for each gender choice and then generate and print.

from secrets import choice

def make_names(gender):
    if gender == 'm':
        name = choice(data['demp']) + choice(data['dems']) + ' ' + choice(data['dehp']) + choice(data['dehs'])
        return name
    elif gender == 'f':
        name = choice(data['defp']) + choice(data['defs']) + ' ' + choice(data['dehp']) + choice(data['dehs'])
        return name

#Dark Elf
# Omaryraen Oussar
#Male prefix
demp = ['Alak','Alt','Alton','Antr','Amal','Bar','Bel','Bhen','Berg','Brar',
        'Cal','Chasz','Cor','Dant','Dhaun','Danv','Din','Dur','Elk','Elaug',
        'Erth','Geld','Ghaun','Gul','Hatch','Imd','Iren','Irenn','Kalan','Ker',
        'Kron','Kren','Krer','Mer','Mern','Niln','Nilo','Nym','Nyr','Omar',
        'Phar','Phyx','Sor','Quev','Quen','Rinn','Riz','Ryl', 'Tsa','Tsab',
        'Teb','Tlu','Tluth','Torr','Vel','Vell','Vuz','Vorn','Zak']
#Male suffix
dems = ['agh','ahn','aun','afein','al','axle','daer','drin','eld','eil','fin',
        'fein','fryn','ica','imar','inid','irahc','kah','myr','nas','nar','nozz',
        'olin','omph','or','rar','rak','ril','tar','trin','trol','tro','vun',
        'vex','ven','vyr','yl','yln','yrd','yraen','zaer','zen','zyr']
#Female prefix
defp = ['Akor','Alon','Ang','Aun','Bae','Bar','Belar','Chal','Char','Chess',
        'Dil','Dur','Dris','Elvan','Elv','Erel','Ethe','Felar','Faer','Felyn',
        'Gin','Hael','Hal','Houn','Ilam','In','Iril','Irae','Ily','Ilm','Jan','Jhael',
        'Lael','Lir','Lurd','Lua','Mua','Mae','Myr','Nhath','Nhil','Nes','Pallan','Phyr',
        'Quar','Quilv','Rauv','Ril','Shri','Sur','Sin','Tal','Tiel','Triss','Vas','Vier','Vlon']
#Female suffix
defs = ['a','ae','aer','afae','ala','ayna','baste','brin','cyce','cyril','dia','dah','dril',
        'e','eyel','fryn','iara','idil','inrir','iri','iista','ithra','kiira','lay','lara','na',
        'niss','nitra','onia','onyss','quarra','quesi','rae','raena','rina','ryna',
        'shalee','sin','stra','tana','thara','vex','xena','xen']
#House prefix
dehp = ['Alean','Ale','Arken','Auvrey','Baern','Barri','Cladd','Crim','De',
        'Do','Des','Eils','Evreh','Helvi','Hla','Hun','Kin','Keil','Kae','Mae',
        'Mel','Mye','Noqe','Noqu','Nili','Orly','Ouss','Rilyn','Takken','Tor','Zoa']
#House suffix
dehs = ['alfin','ailin','ani','ana','ar','arn','ath','duis','deris','drar','ervs',
        'epp','ett','ghym','iryn','irin','iros','lyl','mtar','mtor','ndar','neld',
        'rae','rahel','rret','sek','th','tlar','tyl','und','urden','val','vyr']

# put all the bits in 1 place
data = {d:[] for d in ['demp', 'dems', 'defp', 'defs', 'dehp', 'dehs']}

bits = [demp, dems, defp, defs, dehp, dehs]
count = 0
for key in data.keys():
    data[key] = bits[count]
    count +=1
    
genders = ['f', 'm']
gender = 'x'
while not gender in genders:
    print('Since Donald is president we don\'t do non-binary, you gotta be male or female! Enter m or f! ')
    gender = input('Are you male or female? Enter m or f ')

name = make_names(gender)

for gender in 'fmfmfm' :
    name = make_names(gender)
    print(f'How do you do {name}?')
Output:
How do you do Rauva Deailin? How do you do Calzyr Crimalfin? How do you do Ilmonyss Takkenrae? How do you do Imdkah Oussirin? How do you do Ginae Kinth? How do you do Nilnven Kaemtor?
Reply
#7
This was just to give some examples of names:

for gender in 'fmfmfm' :
    name = make_names(gender)
    print(f'How do you do {name}?')
You just feed 'f' and then 'm' to the make_names() function to show some example names.

You loop over the string 'fmfmfm' assigning gender to each letter in turn, then call the function with make_names(gender).

You don't need this part, it was just to show example names.
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  what to return for an empty list Skaperen 2 1,198 May-24-2024, 05:17 PM
Last Post: Skaperen
  How do I calculate a ratio from 2 numbers and return an equivalent list of about 1000 Pleiades 8 20,985 Jan-05-2024, 08:30 PM
Last Post: sgrey
  Sample random, unique string pairs from a list without repetitions walterwhite 1 1,903 Nov-19-2023, 10:07 PM
Last Post: deanhystad
  find random numbers that are = to the first 2 number of a list. Frankduc 23 7,161 Apr-05-2023, 07:36 PM
Last Post: Frankduc
  List of random numbers astral_travel 17 5,716 Dec-02-2022, 10:37 PM
Last Post: deanhystad
  [split] why can't i create a list of numbers (ints) with random.randrange() astral_travel 7 2,822 Oct-23-2022, 11:13 PM
Last Post: Pedroski55
  Display value in the another entry field instead of message box adisc 6 2,722 Jun-25-2022, 02:30 PM
Last Post: rob101
  Need to parse a list of boolean columns inside a list and return true values Python84 4 3,222 Jan-09-2022, 02:39 AM
Last Post: Python84
  Auto increament in Entry field. in tkinter GUI cybertooth 7 6,263 Sep-17-2021, 07:56 AM
Last Post: cybertooth
  How to invoke a function with return statement in list comprehension? maiya 4 4,042 Jul-17-2021, 04:30 PM
Last Post: maiya

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020