我有一个如下生成的列表:
#demographic
def race_list():
demographic = []
Dwarf_race = Dwarf_box.get()
Elf_race = Elf_box.get()
Human_race = Human_box.get()
if Dwarf_race == 1:
demographic.append("Dwarf")
else:
pass
if Elf_race == 1:
demographic.append("Elf")
else:
pass
if Human_race == 1:
demographic.append("Human")
else:
pass
return demographic
然后我有一个函数将调用此列表,从中进行随机选择,然后读取文件。像这样:
# gen_NPC.py
def run(demographic):
print(demographic)
set_race = random.choice(demographic).strip()
print(set_race)
gender = ['male', 'female']
sex = random.choice(gender)
first = open(set_race + '_' + sex + '.txt')
name1 = first.readlines()
first = random.choice(name1).strip()
last = open(set_race + '_surnames.txt')
name2 = last.readlines()
last = random.choice(name2).strip()
npcname = NPC(first, last)
propname = npcname.name
return propname, sex, set_race
在主脚本运行的整个过程中,该函数被多次调用(通过其他函数),这是由用户输入确定的。它确实有效,但set_race = random.choice(demographic).strip()
有时会从列表中的一个单词返回一个字母,意味着文件无法打开,我得到类似的东西。
Exception in Tkinter callback
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1486, in __call__
return self.func(*args)
File "dnd_test.py", line 99, in MakeSettlement
gen_market.run(num_market, demographic)
File "/Users/username/Desktop/DnD/dndapp/DND_Beta_2.0/gen_market.py", line 9, in run
gen_NPC.run(set_race)
File "/Users/username/Desktop/DnD/dndapp/DND_Beta_2.0/gen_NPC.py", line 20, in run
first = open(set_race + '_' + sex + '.txt')
IOError: [Errno 2] No such file or directory: 'l_male.txt'
我已经使用print(demographic)
和print(set_race)
运行此功能来确认这一点。
知道为什么random.choice()
会这样做?
答案 0 :(得分:3)
要使set_race
成为单个字符,demographic
必须已设置为单个字符串而不是列表。那时random.choice()
从该字符串中选取一个随机字母:
set_race = random.choice(demographic).strip()
demographic
取自调用run()
函数时传入的参数,因此您需要查看代码调用该函数。你的追溯表明你是。你传入了一个字符串,而不是这一行的列表:
File "/Users/username/Desktop/DnD/dndapp/DND_Beta_2.0/gen_market.py", line 9, in run
gen_NPC.run(set_race)
该行传入set_race
的事实似乎表明你在该函数之外选择了你的NPC种族,并试图将其传入。
您没有分享代码的这一部分,因此我们无法告诉您为什么set_race
没有列表而是字符串。您显然没有使用race_list()
返回的列表(该函数使用本地名称demographic
也独立于run()
中的名称。)