Posts: 4
Threads: 1
Joined: Feb 2025
Feb-23-2025, 02:41 AM
(This post was last modified: Feb-23-2025, 04:47 AM by deanhystad.)
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.
Posts: 6,798
Threads: 20
Joined: Feb 2020
Feb-23-2025, 05:56 AM
(This post was last modified: Feb-23-2025, 05:56 AM by deanhystad.)
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.
Posts: 1,094
Threads: 143
Joined: Jul 2017
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?
Posts: 4
Threads: 1
Joined: Feb 2025
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.
Posts: 4
Threads: 1
Joined: Feb 2025
(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?
Posts: 4
Threads: 1
Joined: Feb 2025
(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?
Posts: 1,094
Threads: 143
Joined: Jul 2017
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.
|